1. D1zo05.05.2025 at 4:05 AMот
  2. Flaviy05.05.2025 at 3:54 AMот
  3. carvetkid05.05.2025 at 3:21 AMот
  4. DAVINCI05.05.2025 at 2:50 AMот
Loading...

CT-Sheild v2.0 (Больше чем протектор!)

Discussion in 'Counter-Strike' started by O S T R O G, 06.06.2014.

Thread Status:
Not open for further replies.
  1. O S T R O G

    O S T R O G

    Статус:
    Оффлайн
    Joined:
    14.08.13
    Messages:
    32
    Репутация:
    5 +/-
    [​IMG]

    CT-Shield v2.0 - Обновленная версия протектора, который был создан для защиты клиента Counter-Strike 1.6, от нежелательных изменений в нем. Основная задача "щита" состояла и состоит в том, чтобы на корню пресекать все потуги Администрации сервера, засунуть свои длинные лапы туда, куда это делать определенно не следует, и не дать изменить настройки клиента. Весь функционал предыдущий версии(v1.0) остался на месте. Главное нововедение новой версии, это полная защита клиентов с 6000+ билдами. Как вы наверно помните, в прошлой версии, защита не работала на новых билдах, теперь это досадное упущение исправлено. Также "щит" работает на STEAM. Помимо этого, функционал протектора пополнился множеством новых функций. Также была улучшена и сама защита клиента. На сегодняшний день CT-Shield v2.0, является самым многофункциональным протектором для Counter-Strike. И не превзойденным никем, в плане защиты! Можно с твердой увереностью сказать, что новый "щит", это намного больше, чем просто хороший протектор, благодаря множеству функций, реализованных в нем помимо самой защиты клиента игры.

    Установка:
    - Скачать файл по ссылке в конце описания.
    - Скопировать файл в корневую директорию клиента.
    - Надпись в консоли при запуске, будет свидетельствовать об успешной установке.
    Важно! Имя файла можно переименовать на любое другое. Рекомендую сделать это сразу!
    Примечание: dll файла больше нет, все инжектится, через asi файл. А конфигурационный файл и остальные файлы, создаются по умолчанию в папке ct-shield(в корневой директории игры), при первом запуске. (папка будет иметь тоже самое имя, что и файл, тоесть во что переменуете файл, такого же имени и будет сама папка).

    Настройки:
    Основные настройки, осуществляется в конфигурационном файле: - \Counter-Strike\ct-shield\settings.ini.

    Изменения: ( v2.0 )
    - Реализована полная защита клиента на билдах - 6000+ / STEAM. Теперь защита работает не только на всех патчах, но и на всех билдах!
    - Сама защита клиента была существенно улучшена.
    - Можно добавлять "фейк-квары". Тоесть при кажом подключении, создается копия кваров со стандартными переменными, и если сервер попытается узнать его, он получит это фейк-значение. Если сервер присылает команду, например _cl_autowepswitch "0", то фейк квар меняется на 0, и далее, если сервер снова узнает квар посредствам qcc/qcc2, он получит уже 0. Между тем, как настоящий квар на клиенте не будет изменен, сервер его не узнает =)
    - Система фильтрация по многим параметрам приходящик от сервера команд.
    - Добавлена поддержка песочницы на квары / бинды / сетинфо.
    - Добавлена возможность выбора типа эмулятора. (в основном старые)
    - Lua mod - для работы с памятью( больше универсальный )
    - Добавлен CD-Key Changer (можно ставить, как рандомное значение(при коннекте), так и уникальное).
    - Добавлена возможность брать(воровать), чужой стим ид игроков на сервере, при каждом подключении.
    - Исправлена ошибка "The server requires that you be running STEAM", возникавшая у некоторых(на старых патчах), при попытке подключится к серверу.
    - Изменено расположение значка "щита" в мотд окне.
    - Полная защита от экспериментальных плагинов "Cls Exec", "SV-Shield" и от возможных их потенциальных аналогах/клонах.
    - Расширение возможностей консольного движка и т.д. )


    ###############################
    Фильтрация комадн из следующих источников:
    [​IMG]

    ct_add_list - команда добавляет на определенное правило созданный лист
    Пример:
    ct_add_list "block_rule" "main_block_list" - на правило block добавлен лист main_block_list ( main_block_list - может именть любое другое название.. )
    всего доступны следующие правила

    block_rule - блокирование команд от сервера
    forcibly_fwd_to_sv_by_sv_rule - принудительная переправка команд от сервера на сервер
    forcibly_fwd_to_sv_by_cl_rule - принудительная переправка команд от клиента на сервер ( например повесив new можна релогаться так.. врочем с ct_write_to_chan "{$03}new{$00}" будет правельнее )
    block_fwd_to_sv_by_sv_rule - блокирование исходящих команд пришедших от сервера не найденых на клиенте и ( как должно было быть ушедших обратна на сервер )
    block_fwd_to_sv_by_cl_rule - блокирование исходящих от клиента команд ( в отличие от гуарда и 1-ого щита блокируются не толька команды при cmd_stringexuce.. но и все которые используют форвард ( тоесть добавив say вы не сможете писать в чат ) )
    key_binds - блок команд которые выполняются при сварачивание - разворачивание окна ( команды на клавишах пример bind "k" "+voicerecord" при разворачивание будет -voicerecord )
    test_rule - тестовое правило для праверки выбралась команда или нет ( проверять ct_filter_test ( тут args будет как бы тестовая команда )

    ct_add_line - команда добавляет к листу шаблон
    пример:
    ct_add_line "main_block_list" "Tokenize" "String" "_restart" - добавить на лист main_block_list команду _restart
    как это работает:
    когда сервер присылает команды они разбиваются на линии пригодные для Cmd_ExecuteString( это такая линия в которой может быть толька одна команда )
    далее эта линия проверяется по листам пока не совпадет по шаблону - если совпала то поиск дальше не идет ( в любом случае )
    тоесть если есть
    ct_add_list "block_rule" "main_block_list_1"
    ct_add_list "block_rule" "main_block_list_2"
    ct_add_list "block_rule" "main_block_list_3"

    будет проверятся сначала в main_block_list_1 потом main_block_list_2 потом main_block_list_3

    если шаблон найдет вернет True там где надо наобарот заблочить все кроме определенных можна инвертировать:

    ct_add_list "block_rule" "!main_block_list_1"
    ct_add_list "block_rule" "!main_block_list_2"
    ct_add_list "block_rule" "main_block_list_3"

    если линиия совпадет с шаблоном из листов main_block_list_1 / main_block_list_2 то вернет false ( сдесь по смыслу правила block_rule ясно что команда пройдет )
    и есле дойдет до листа подходящего шаблона листа main_block_list_3 то будет true ( сдесь по смыслу правила block_rule ясно что команда не пройдет )


    Сами шаблоны:
    Пример:

    ct_add_line "main_block_list" "Tokenize" "String" "_restart"
    -- 2-й параметр Tokenize говарит что линию надо разбить на токены посредствам Cmd_TokenizeString
    -- 3-й параметр String говарит что проверять 0-й параметр линии( сама каманда ) на сравнение тоесть: toLowerString( trim( Cmd_Argv^[0] ) ) == шаблон
    если не совпало то дальше искать
    до первого совпадания ( всгда до 1-ого )

    Другой пример:
    ct_add_line "main_block_list" "Tokenize" "RegExp" "^ct_.*"
    RegExp - говарит что проверять 0-й параметр линии( сама каманда ) на math с шаблоном тоесть: math( toLowerString( trim( Cmd_Argv^[0] ) ) , шаблон )
    шаблон формата регулярных выражений в данном случае проверяется совпадает ли префикс команды с "ct_"

    Более сложный пример(если у ct_add_line >= 5 параметров то):
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"
    Tokenize также говарит что разобрать линию на токены пример
    bind F3 "say /shop; connect 127.0.0.1:3; quit;"
    распарсивается Cmd_TokenizeString как
    Cmd_Argc^ = 3
    Cmd_Argv^[0] = bind
    Cmd_Argv^[1] = F3
    Cmd_Argv^[2] = say /shop; connect 127.0.0.1:3; quit;
    Cmd_Args^ = F3 "say /shop; connect 127.0.0.1:3; quit;"

    argv говарит что проверять нада именно по оставшемся токенам ( примере по F3 и say /shop; connect 127.0.0.1:3; quit; )
    если argv то команда идет на проверку толька в том случае если параметров у линии больше или равно описанных параметров в ct_add_line
    тоесть

    bind F3 "say /shop; connect 127.0.0.1:3; quit;"
    пройдет мимо
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block"
    выберется этой командой на проврку ( далее поиск не пойдет.. результат завист от совпадаения параметров с листами all_block )
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block"
    команда
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"
    выберет плохие бинды с Cmd_Argc^ >= 4

    после того как линия сошлась по названию команды и числу параметров проверяются сами параметры
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"
    "t^all_block" - t^ говарит что каждый под параметр от линии надо разбинть снова на линии и каждуюю линию проверять с под листом all_block пример

    bind F3 "say /shop; connect 127.0.0.1:3; quit;"
    распарсится на
    bind
    F3 => F3 так и пойдет на лист как Cmd_Argc^ = 1 Cmd_Argv^[0] = F3 C,d_Args^ = ""
    say /shop; connect 127.0.0.1:3; quit; => разберется на под линии
    say /shop - пойдет на проверку на под лист ( алгоритм точна такойжа как проверка и распарсивание 1-й линии с bind F3 ...
    connect 127.0.0.1:3 - пойдет на проверку на под лист ( алгоритм точна такойжа как проверка и распарсивание 1-й линии с bind F3 ...
    quit - пойдет на проверку на под лист ( алгоритм точна такойжа как проверка и распарсивание 1-й линии с bind F3 ...

    и т.д. соответсвенно те под команды тоже разбиваются на токены и проверяются по такомже алгоритму либо идут на 3-й под лист

    Более сложный пример по которуму реализована фильтрация биндов:
    [CODEBOX]
    // Exception bind

    ct_add_list "block_rule" "exception_bind"

    ct_add_line "all_block" "Tokenize" "RegExp" ".*"


    // Зарпещаем выполнять бинд с >= чем 3 параметра( без команды )
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"

    // Зарпещаем выполнять бинд с любыми командыами во 1-м парамтре кроме разрешенных в exception_bind_key листе... Запрещаем выполнять бинд с 2-м параметром содержащим команды из anti_detekt_list_cmd / anti_detekt_list_cvar / main_block_list листа кроме разрешенных в exception_bind_cmd( для всяких bind v "say /shop" )
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^!exception_bind_key|all_block" "t^!exception_bind_cmd|anti_detekt_list_cmd|anti_detekt_list_cvar|main_block_list"

    // Запрещаем выполнять бинд с >= 0 параметром ( т.к. попорядку то блочатся все остальные бинды ( Cmd_Argc IN [ 1 .. 2 ] )
    ct_add_line "exception_bind" "Tokenize" "String" "bind"



    ct_add_line "exception_bind_cmd" "Tokenize" "String" "say"
    ct_add_line "exception_bind_cmd" "Tokenize" "String" "say_team"

    ct_add_line "exception_bind_key" "Tokenize" "String" "F1"
    ct_add_line "exception_bind_key" "Tokenize" "String" "F2"
    ct_add_line "exception_bind_key" "Tokenize" "String" "F3"
    ct_add_line "exception_bind_key" "Tokenize" "String" "F4"
    ct_add_line "exception_bind_key" "Tokenize" "String" "F5"
    ct_add_line "exception_bind_key" "Tokenize" "String" "z"
    ct_add_line "exception_bind_key" "Tokenize" "String" "x"
    ct_add_line "exception_bind_key" "Tokenize" "String" "c"
    ct_add_line "exception_bind_key" "Tokenize" "String" "v"
    ct_add_line "exception_bind_key" "Tokenize" "String" "-"
    ct_add_line "exception_bind_key" "Tokenize" "String" "="
    [/CODEBOX]


    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^!exception_bind_key|all_block" "t^!exception_bind_cmd|anti_detekt_list_cmd|anti_detekt_list_cvar|main_block_list"
    "t^!exception_bind_key|all_block"
    сначала каждая под линия параметра проверяются в exception_bind_key и если найдены то если вернет true то поиско по 2-му параметру не пойдет если false то пойдет..
    т.к. !exception_bind_key Возвращает то поиск идет на следующюю под линию если и там false то проверяются по такомуже алгоритму следующие под линии след. параметра
    в итоге не смогут пройти например такие команды:
    bind "f3" "say /shop;say /get_m;"
    пройдет и такое
    bind "f3 connect 127.0.0.1:3; f4 quit; - writeid;" "say /shop;say /get_m;" - но в контескте 1-о параметра bind будет ошибка
    не пройдет например такое:
    bind "f3" "echo :D"
    т.к. команда echo есть на клиенте и есть в anti_detekt_list_cmd листе
    такое пройдет
    bind "f3" "amx_csay writeid;menu quit;"
    т.к. команд amx_csay / menu нет на клиенте а writeid и quit будут параметрами под линий;


    ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "s^!exception_bind_key|all_block"

    если "s^!exception_bind_key|all_block" - s^ то передается вся под линия целиком

    bind "f3; f4; f5" - передастся не по очеереди под лини f3,f4,f5 и вся линия f3; f4; f5 .. имеет смысл если лист проверяет как строку линию тоесть:

    ct_add_line "exception_bind_key" "String" "String" "f3"
    пройдет толька f3 и не символом больше.. можна и регулярные
    ct_add_line "exception_bind_key" "String" "RegExp" "(f3)|(f4)|(f5)"

    также есть возможность фильтровать по Args

    ct_add_line "exception_bind" "Tokenize" "String" "bind" "args" "String" "f3 connect 127.0.0.1:3"
    или регулярные
    ct_add_line "exception_bind" "Tokenize" "String" "bind" "args" "RegExp"\s*f3\s*connect\s*127.0.0.1:3\s*"
    выберет бинд: bind f3 connect 127.0.0.1:3
    но тут проблема с невозможностью экранировать 2-ю ковычки...
    Пример:
    ct_add_mini_line "file_name_filters" "RegExp" ".*\.BAT"
    ct_add_mini_line - комада для добавления на правило шаблона
    Доступны следующие правила:
    file_name_filters - блок ресурсов
    block_qcc - блок qcc

    мини фильтр нужен там где не нужно распарсивать на токены...

    ct_add_mini_line "file_name_filters" "RegExp" ".*\.BAT"
    RegExp - значит сравнивать по регулярному выражению
    ct_add_mini_line "file_name_filters" "String" "Start.BAT"
    String - значит проста сравнивать

    ct_add_mini_line "file_name_filters" "RegExp" ".*\.BAT" "inverted"
    Также поиск идет до 1-ого совпадения что вернет зависит от 3( если есть ) параметра если он inverted то false
    допускаются исключения на ip сервера
    Пример:
    // Добавить до ct_add_list "block_rule" "main_block_list"
    ct_add_list "block_rule" "!exceptino_record"

    проверяется толька тогда когда ип равен указанному..
    ct_add_line "exceptino_record" "Tokenize:127.0.0.1:3" "String" "record"
    ct_add_line "exceptino_record" "Tokenize:127.0.0.1:4" "String" "record"
    ct_add_line "exceptino_record" "Tokenize:127.0.0.1:5" "String" "record"

    разрешит записть демо для серверов с ипами: 127.0.0.1:3 , 127.0.0.1:4 , 127.0.0.1:5 ( похожего эфекта моЖна было бы добиться если писать регулярные на args комады ( впрочем некотрые сервера не дают внятных имен а толька рандомные буквы )


    Также для мини фильтров:

    разрешит закачивать *.bat ресурсы серверу 127.0.0.1:3 - тоесть выполняется толька тогда когда ип сервера не равен указанному - это моя ошибка потом исправлю ( тоесть в исключение можна добавить толька 1-н ип )
    ct_add_mini_line "file_name_filters:127.0.0.1:3" "RegExp" ".*\.BAT"
    Пример:
    ct_fake_cvar_add "_cl_autowepswitch" "sandbox" "1"

    ct_fake_cvar_add - добавляет файк квар
    "_cl_autowepswitch" - 1-й параметр имя квара
    "sandbox" - 2-й параметр говарит что это непосредственно песочница
    "1" - 3-й параметр значение по умалчанию
    Как работает:
    при кажом коннекте к серверу создается копия таких кваров с дефолтными значениями ( указанными в 3-м параметре ) и если сервер попытается узнать его ( qcc/qcc2 ) он получит это фейк значение..
    если сервер присылает команду например _cl_autowepswitch "0"
    то файк квар меняется на 0 и далее если сервер снова узнает квар посредствам qcc/qcc2 он получит уже 0..
    между тем как настоящий квар на клиенте не будет изменен... и его сервер не узнает


    ct_fake_cvar_add "_cl_autowepswitch" "orig"
    orig - значет что сервер узнает настоящий квар.. при попытке изменить он изменит его на любой который ему нада
    но когда вы выйдете с сервера этот квар вернется на то значение которое у вас было при заходе


    ct_fake_cvar_add "_cl_autowepswitch" "sandbox_not_change" "1"
    orig - значет что сервер узнает поддельный квар.. при попытке изменить он не сможет изменит его и всегда qcc/qcc2 будет возвращать указанное вами значение

    ct_fake_cvar_add_setinfo "_cl_autowepswitch" - значит привязку квара к сетинфо тоесть при смене данного квара будет меняться и сетинфо
    Не каких команд по добавлению тут нету.. она либо есть либо нету ( EnabledSandBoxBind в конфиге )
    Смысл такой: в песочницу идут все бинды пришедшие от сервера.. т.к. песочница ( как и файк квары ) стоит после фильтров то те которые проходят те и ставятся..
    При этом при выходе с сервера все бинды вернутся назад..
    Это очень удобна для модовых серверов.
    Здесь еще все проще..
    Любые изменения на сервере( даже если вы сами( клиент ) меняете ) буду откачены наза при выходе
    Отключить нельзя( я забыл добавить квар в парсер )
    ct_engine_add_cmd - добавляет команду ( ct_engine_add_cmd <command name> <command addr addr> [hosttype = 1] )
    -Пример: ct_engine_add_cmd "test_cmd" "$FFFFFFFF" 1
    --Где 1-й парметр имя команды
    --2-й абсолютный адрес команды
    --3-й необязательный это хост тайп( деф. = 1 )

    ct_engine_remove_cmd - удаляет команду ( ct_engine_remove_cmd <command name )

    ct_engine_add_cvar - добавляет квар ( ct_engine_add_cvar <cvar name> [data = ""] [flags = 1 )

    ct_engine_remove_cvar - удаляет квар ( ct_engine_remove_cvar <cvar name )

    ct_engine_add_alias - добавляет алиас ( ct_engine_add_alias <alias name> <command string )

    ct_engine_remove_alias - удаляет алиас ( ct_engine_remove_alias <alias name )

    добавление команд/кваров/алиасов возможна толька если хотябы 1-н из них существует ( если для команд и кваров понятна то алиас лучше так не добавлять а через alias "name" "cmd"


    ct_setinfo_show - красивый вывод ключь - значение setinfo

    ct_setinfo_set - устанавливает значение ( аналог setinfo key val ) ( Syntax: ct_setinfo_set <setinfo name> <setinfo value )

    ct_setinfo_remove - удаляет пару ключь - значение ( по ключю ) ( Syntax: ct_setinfo_remove <setinfo name )
    ct_create_pack - создает локальный файк сервер ( коннектитесь со 2-о окна для сохранения тикета на пиратке ( либо с этогоже окна ( при ct_emu_select original ) а потом копируете тикет в нон стим )
    ct_load_last_pack - загружает тикет созданный ct_create_pack либо полученный через php файк сервер

    ct_emu_select - устанавливает эмулятор( по умолчанию RevEmu )
    Но можна и следующие:
    revemu - самый распространенный эмулятор
    avsmp - редкий , но дает возможность брать стеам_0:1:ХХ..
    setti - генерация по ипу, при этом по умолчанию префикс 4
    revemuold - старый эмулятор
    revemuold_cm - старый эмулятор( тот же revemuold но при SteamEmuCompatMode = 1 ( в конфиге Dproto ) )
    steamemu - 2-й по распространенности эмулятор
    steamemu_cm - 2-й по распространенности эмулятор( тот же steamemu но при SteamEmuCompatMode = 1 ( в конфиге Dproto ) )
    original - проходит оригинальный тикет и сдкей( если был steam_id_lan будет он если коннект со стима то будет стим и т.д. )

    ct_emu_ran [ 1/0 ] - устанавливает рандомное значение при каждом коннекте( по умолчанию 1 )

    ct_emu_set - устанавливает стиам ид

    ct_emu_next - берет стим иды игроков
    Находясь на сервере вводите ct_emu_next( можна забиндить ) возмется чейта стим ид далее релог вы играете под другим стимом
    Если вас банят то вне сервера снова вводите ct_emu_next притом старый запоминается и больше выбираться не будет и т.д. пока все не забанятся

    ct_cdkey_ran [ 1/0 ] - рандомный сдкей при каждом коннекте( по умолчанию 1 )

    ct_cdkey_set - свой cdkey( любые 32 символа )
    ct_nick_cheker - переключает команды поочереди
    ct_load_list - каждую секунду рандомный ник( из листа nick_changer/nick_list.ini )
    ct_game_list - каждую секунду ник когота из игроков на сервере ( очень похож )
    ct_connect_load_list - при коннекте берет рандомный ник ( из листа nick_changer/nick_list.ini )
    ct_connect_game_list - при коннекте берет когота из игроков на сервере ( с которого вы толька что вышли ) ( очень похож )
    ct_connect_nick - при коннекте берет рандомный ник( из листа nick_changer/nick_list.ini ) при заходе на сервер меняет его не дефолтный ( для автоматизированного обхода супер бана )
    ct_connect_set_nick - устанавливает дефаулт ник
    /gg - Зеленый чат
    /tt - Теам чат
    /ss - Стандартный( Желтый ) чат
    Пример: say "/ggGreen /ttTeam /ssDef /gg color /tt:D"

    /exe - выполняет команду..
    Пример: /exe +jump;wait;wait;-jump;

    Воис команды:
    /vxb name - name - часть имени игрока / - запрет слушать( если вы не хотите когота слушать )
    /vxu name - name - васть имени игрока / - снятие запрета

    \ - экранирование команды
    ct_say_green - писать зеленым ( автоматически без /gg )
    ct_say_team - писать теам цветом ( автоматически без /tt)
    ct_show_steam - показывает стиам игроков
    ct_reconnect - реконект интернета из кс( в settings.ini PathReconnect должен указывать не абсолютный путь до файла в котором( 1-я строка название подключения, 2-я строка логин, 3-я пароль )
    ct_load_library - загрузка длл( например загрузка чита каково нибудь ) путь относительно папки cs
    ct_load_library_own - загрузка длл( например загрузка чита каково нибудь ) путь относительно папки cs / собственный loadLibrary.. но если чит где нибудь используют HInstanse своегоЖе модуля в вин структурах ( например чтобы узнать путь до себя чтобы конфиг загрузить ) нечего неполучиться )
    При загрузке asi/dll цепляются все файлы из папке execute и выполняются почти также как exec
    За исключением процедур.
    Название вида
    [-2147483647 .. 2147483647]^.xxx.cfg
    цифры говарят парядок запуска
    тоесть:
    10^first.cfg - выполниться перед
    11^aaa.cfg
    В файлах в execute можна указывать процедуры
    procedure_begin <name> [fast/no_fast = fast]

    это как alias но толька можна сохранять не пару команд без 2-х ковычек а текст

    создатся команда (name) при вызове которой выполнится текст между
    procedure_begin и procedure_end( либо конец файла / новый procedure_begin )

    параметр no_fast ( если его ставить ) говарит что надо без CBuf_Execute проста добавить текст в CBuf_AddText

    if ( Syntax: if <type comparison( i/f/s/ls )> <type second cvar( const/cvar/d_cvar )> <variable> <operand( =/>=/<=/>/< )> <value> <fast 1/0> <command> [else command] )
    1-й параметр - тип сравнения
    i- In32
    f - Float( Single - 4-хбайтный )
    s - Строка с учетом регистра
    ls - Строка без учета регистра
    2-й параметр - с чем сравнивать
    const - свое число/строка
    cvar - другой ква
    d_cvar - зарезервированные квары щита( их всего 2: текущий ип и билд клиента )
    3-й параметр - название квара

    4- параметр - условие сравнения
    = - для всего
    >= - для чисел
    <= - для чисел
    > - для чисел
    < - для чисел
    5-й параметр - с чем сравнивать ( если const то свое число / строка , елси cvar то название квара , d_cvar - название дквара )

    6-й парметр - [ 1/0 ] фаст/не фаст выполнение

    7-й параметр - текст на выполнение если true

    8-й параметр( ну если он есть ) - текст на выполнение если false



    ct_loop ( Syntax: ct_loop <id> <count> <time> <time mode before/after> <fast 1/0> <command> )
    1-й парметр - ид цикла ( потом его можна остановить ct_stop id )

    2-й параметр - сколька раз повторять

    3-й параметр - через промежуток времени между интерациями( в милисек )

    4-й параметр - как выполнять
    before - сразу ( тоесть есле будет time = 10000(10 sec) то начать выполнение сразу а потом ждать
    after - потом ( тоесть есле будет time = 10000(10 sec) то начать ждать сразу а потом выполнять

    5-й параметр - [ 1/0 ] фаст/не фаст выполнение

    6-й параметр - сам текст для выполнения


    ct_stop ( Syntax: ct_stop <id> ) - останавливает цикл до срочна
    1-й параметр ид созданный через ct_loop


    ct_alias ( Syntax: ct_alias <name> <time> <fast 1/0> <command> )
    1-й параметр - имя алиаса

    2-й параметр - через промежуток времени между интерациями( в милисек ) ( также как и у ct_loop но толька всегда after )

    3-й параметр - [ 1/0 ] фаст/не фаст выполнение

    4-й параметр - текст на выполнение

    Все временные циклы / алиасы идут отдельным потоком и при небольшом time желательно ставить всегда no_fast выполнение

    Lua mod
    ###############################
    Можно былобы добавить все основные команды движка.. систему хуков но я решил сделать это более уневерсально
    Вы сами можете найти по сигнатурам нужную функцию и создать на нее представление.. либо представить луа функцию и хукнуть что надо...

    При загрузке dll выполняется следующий скприпт ( Отнасительно папки щита )
    lua/main.lua
    Все скрипты идут в 1-н поток
    тоесть если надо поставить допустим задачу на время / фраймы то надо хукнуть худфрайм и внем мини планировщик..
    Lua.register_(L , '__include' , @__include );
    Lua.register_(L , '__include_once' , @__include_once );

    Lua.register_(L , '__mem' , @__mem );
    Lua.register_(L , '__free' , @__free );
    Lua.register_(L , '__copy' , @__copy );
    Lua.register_(L , '__fill' , @__fill );
    Lua.register_(L , '__protect' , @__protect );
    Lua.register_(L , '__find' , @__find );

    Lua.register_(L , '__read' , @__read );
    Lua.register_(L , '__write' , @__write );

    Lua.register_(L , '__read_int' , @__read_int );
    Lua.register_(L , '__read_byte' , @__read_byte );
    Lua.register_(L , '__read_word' , @__read_word );
    Lua.register_(L , '__read_dword' , @__read_dword );
    Lua.register_(L , '__read_single' , @__read_single );
    Lua.register_(L , '__read_double' , @__read_double );
    Lua.register_(L , '__read_pstring' , @__read_pstring );

    Lua.register_(L , '__write_int' , @__write_int );
    Lua.register_(L , '__write_byte' , @__write_byte );
    Lua.register_(L , '__write_word' , @__write_word );
    Lua.register_(L , '__write_dword' , @__write_dword );
    Lua.register_(L , '__write_single' , @__write_single );
    Lua.register_(L , '__write_double' , @__write_double );
    Lua.register_(L , '__write_pstring' , @__write_pstring );

    Lua.register_(L , '__int' , @__int );
    Lua.register_(L , '__dword' , @__dword );

    Lua.register_(L , 'rInt ' , @__read_int );
    Lua.register_(L , 'rByte' , @__read_byte );
    Lua.register_(L , 'rWord' , @__read_word );
    Lua.register_(L , 'rDword' , @__read_dword );
    Lua.register_(L , 'rSingle' , @__read_single );
    Lua.register_(L , 'rDouble' , @__read_double );
    Lua.register_(L , 'rPString' , @__read_pstring );

    Lua.register_(L , 'wInt' , @__write_int );
    Lua.register_(L , 'wByte' , @__write_byte );
    Lua.register_(L , 'wWord' , @__write_word );
    Lua.register_(L , 'wDword' , @__write_dword );
    Lua.register_(L , 'wSingle' , @__write_single );
    Lua.register_(L , 'wDouble' , @__write_double );
    Lua.register_(L , 'wPString' , @__write_pstring );

    Lua.register_(L , '__type' , @__type );
    Lua.register_(L , '__create' , @__create );
    Lua.register_(L , '__submit' , @__submit );


    Lua.register_(L , '__shr' , @__shr );
    Lua.register_(L , '__shl' , @__shl );
    Lua.register_(L , '__not' , @__not );
    Lua.register_(L , '__and' , @__and );
    Lua.register_(L , '__or' , @__or );
    Lua.register_(L , '__xor' , @__xor );
    Lua.register_(L , '__rbit' , @__rbit );
    Lua.register_(L , '__div' , @__div );
    Lua.register_(L , '__mod' , @__mod );

    Lua.register_(L , '__ishr' , @__ishr );
    Lua.register_(L , '__ishl' , @__ishl );
    Lua.register_(L , '__inot' , @__inot );
    Lua.register_(L , '__iand' , @__iand );
    Lua.register_(L , '__ior' , @__ior );
    Lua.register_(L , '__ixor' , @__ixor );
    Lua.register_(L , '__irbit' , @__irbit );
    Lua.register_(L , '__idiv' , @__idiv );
    Lua.register_(L , '__imod' , @__imod );

    Lua.register_(L , '__get_module' , @__get_module );
    Lua.register_(L , '__get_address' , @__get_address );
    Lua.register_(L , '__load_library' , @__load_library );
    Lua.register_(L , '__get_module_size' , @__get_module_size );

    Lua.register_(L , '__print' , @__print );
    Lua.register_(L , 'print' , @__print );

    Как видно некоторые одни и теже команды доступны под разными именами ( __read_* / r* и т.д. ) ( и команд не так уж и многа
    __print - пишет в консоль текст
    1-й параметр - сам текс
    2-й параметр (если есть деф= 1) - если 1 то добавлять в конец 0x0A иначе как есть
    3-й , 4-й , 5-й параметры если они есть то это цвет текста формата RGB
    3-й - R
    4-й - G
    5-й - B

    алиас
    print
    __include - подключает скрипт
    - аналог стандартной dofile толька ( dofile отнасительно текущей дир а include отнасительно lua/ )
    __include_once - подключает скрипт толька 1-н раз
    и там и там параметр относительный путь к файлу от lua/
    Пример:
    __include_once( "InitMem.lua" );
    __mem - выделяет память ( обертка над делфийским менеджером памяти( GetMem ) но вы можете найти virtualAlloc и написать свой менеджер на луа )
    1-й параметр - размер выделяемой памяти
    возвращает указатель на 1-й байт памяти либо 0 если не удалось

    __free - освободжает память ( имеет смысл толька если это неизмененный указатель на память полученную через __mem() )
    1-й параметр - указатель на 1-й байт памяти

    __copy - копирует память
    1-й параметр - куда копировать
    2-й параметр - откуда копировать
    3-й параметр - размер ( байты )
    4-й параметр ( если он есть ) - если 1 то ставить на копируемую и туда куда копируют разрешение PAGE_EXECUTE_READWRITE

    __fill - заполняет память
    1-й параметр - указатель на память
    2-й параметр - размер
    3-й параметр - байт которым заполнять
    4-й параметр( если он есть ) - если 1 то ставить на память разрешение PAGE_EXECUTE_READWRITE

    __protect - установить свое разрешение ( обертка над VirtualProtect )
    1-й параметр - указатель на память
    2-й параметр - размер
    3-й параметр( если он есть ) - его как новое разрешение ( или PAGE_EXECUTE_READWRITE )
    возвращает старое разрешение либо 0 если не удалось

    __find - главная поисковая функция ( для строк, чисел и т.д. )
    1-й параметр - Указатель на начальный адрес
    2-й параметр - Указатель на предельный адрес поиска( начальный адрес + размер поисковой области )
    3-й параметр - Указатель на 1-й байт шаблона
    4-й параметр - Размер шаблона
    5-й параметр - Оффсет ( результат + оффсет )
    Сам шаблон - это буфер с байтами ( 0xFF - на месте него может быть любой символ ) с которыми сверяется память
    возвращает адрес сопадения с шаблоном либо 0 если не найдено

    __read - читает память
    1-й параметр - Указатель на 1-й байт памяти
    2-й параметр - Размер
    3-й параметр( если он есть ) - если 1 то ставить на память разрешение PAGE_EXECUTE_READWRITE
    возвращает Lua таблицу от 1 до размера где каждая ячейка байт из памяти

    __write - пишет в память
    1-й параметр - Указатель на 1-й байт памяти
    2-й параметр - Размер( он впринцпе не важен ведь будет перебераться вся таблица , толька для 3-о параметра )
    3-й параметр( если он есть ) - если 1 то ставить на память разрешение PAGE_EXECUTE_READWRITE
    записывает в память таблицу ( каждая ячейка таблциы - байт в память )

    прототип для всех фукнций чтения
    1-й параметр - Указатель на память откуда читать
    2-й параметр( если он есть ) - если 1 то ставить на память разрешение PAGE_EXECUTE_READWRITE ( кроме фунции __read_pstring )

    __read_int - читает знаковый Int32 [ 4 Byte ]
    __read_byte - читает беззнаковый Byte [ 1 Byte ]
    __read_word - читает беззнаковый Word [ 2 Byte ]
    __read_dword - читает беззнаковый DWord [ 4 Byte ]
    __read_single - читает беззнаковый Single [ 4 Byte ]
    __read_double - читает беззнаковый Double [ 8 Byte ]
    __read_pstring - читает PString( до 1-о 0x00 )
    алиасы на них
    rInt не работает ( ошибся со знаком ) толька __read_int
    rByte
    rWord
    rDword
    rSingle
    rDouble
    rPString


    прототип для всех фукнций записи
    1-й параметр - Указатель на память куда писать
    2-й параметр - Значение которое надо записать
    3-й параметр( если он есть ) - если 1 то ставить на память разрешение PAGE_EXECUTE_READWRITE ( кроме фунции __read_pstring )

    __write_int [ 4 Byte ]
    __write_byte [ 1 Byte ]
    __write_word [ 2 Byte ]
    __write_dword [ 4 Byte ]
    __write_single [ 4 Byte ]
    __write_double [ 8 Byte ]
    __write_pstring [ Length(String)+1 Byte ]
    алиасы на них
    wInt
    wByte
    wWord
    wDword
    wSingle
    wDouble
    wPString
    __int - приводит число к Int32
    1-й параметр - число
    возвращает число
    __dword - приводт число к DWord
    1-й параметр - число
    возвращает число

    Прототип для функций:
    1-й параметр - число
    2-й параметр ( если по смыслу он нужен( в not толька 1-н например ) ) - число
    3-й и т .д.
    Пример:
    __and( 1 , 4 , 5 , 12 );

    Возвращают DWord
    __shr
    __shl
    __not
    __and
    __or
    __xor
    __rbit
    __div
    __mod
    Тоже самое но возвращают не DWord а Int32
    __ishr
    __ishl
    __inot
    __iand
    __ior
    __ixor
    __irbit
    __idiv
    __imod
    __get_module - Обертка над GetModuleHandleA ( тоесть по имени возращает адрес 1-й байта модуля ( хандл модуля ) или 0 если нету )
    1-й параметр - имя модуля
    Пример:
    HLBase = __get_module("hw.dll");

    __get_address - Обертка над GetProcAddress ( тоесть по адресу модуля обходит экспорт и ищет по имени функцию )
    1-й параметр - адрес 1-о байта модуля( хандл )
    2-й параметр - имся функции ( функция должна экпортироваться модулем )

    __load_library - Обертка над LoadLibraryA ( тоесть по имени dll загружает ее ( она может быть в system32 | curr dir | full path ) ) Возвращает адрес 1-о байта уже загруженного модуля
    1-й параметр - название модуля

    __get_module_size - получает полный размер модуля ( из PE заголовка ) Возвращает размер
    1-й параметр - адрес 1-о байта модуля
    Пожалуй это самая тяжелая часть в щите ( может и по труднее алгоритма подбора ревэми )
    Любая функция в конечном счете может принимать как единичный параметр толька следующие типы:
    DWord( регистры , стэк )
    Single( всегда толька стэк )
    Double( всегда толька стэк )

    Любая функция в конечном счете может возвращать параметры толька следующих 3-х типов:
    DWord( всегда толька EAX(регистр) )
    Single( всегда толька FPU )
    Double( всегда толька FPU )

    __type - функция создает тип; Возвращает ид
    1-й праметр строка вида "([^\=])\=(.*)"
    Пример:
    id = __type( "my_function = function( PChar ): DWord; cdecl;" );
    доступны в качаестве параметров и типа ретурна следующие типы
    Int == Int32
    DWord == DWord
    PChar == PAnsiString
    Single == Single
    Double == Double

    Фораматы передачи параметров:
    cdecl - C формат
    fastcall - формат Delphi( именно делфи, первые 3-е которые могу в рег. остальные прямо через стэк )
    stdcall - формат WinApi ( при обращиниее между cdecl и stdcall разницы ну будет ( толька на прдеставление ) )
    own - свой формат ( оставшиеся параметры обратна через стэк )
    доступны для own следующие фарматы регистров
    EAX , EDX , ECX , EBX , ESI , EDI
    Пример:
    id = __type( "my_function = function( EAX^DWord , Single , EDX^DWord , Double , ECX^DWord ): DWord; own;" );
    а также
    direct_own - свой формат ( оставшиеся параметры прямо через стэк )
    Пример:
    id = __type( "my_function = function( EAX^DWord , Single , EDX^DWord , Double , ECX^DWord ): DWord; direct_own;" );
    ну или так
    id = __type( "my_function = function( DWord , Single , DWord , Double , DWord ): DWord; fastcall;" );

    __create - создает обертку по заранее созданному типу и возвращает луа функцию
    1-й параметр - ид который вернула команда __type либо имя указанное при создании __type
    2-й параметр - абсолютный адрес функции ( ну которую надо будет вызвать )
    Пример:
    нашли тем или иным способом адрес функци ( Addr = 0xFFFFFFFF; -- для примера )
    Знаем тип функции:
    f_id = __type( "my_function = function( DWord, DWord ):PChar; cdecl;" );
    Создаем луа обертку:
    function_ob = __create( f_id , Addr ); -- Или так __create( "my_function" , Addr );
    И далее вызов:
    print( function_ob( 1 , 2 ) );


    Так же и с представлениями:

    __submit - Создает представление нужного ( указанного вами типа ) функцию которая будет вызывать Lua функцию; Возвращает Абсолютный адрес функции представления
    1-й параметр - ид который вернула команда __type либо имя указанное при создании __type
    2-й параметр - луа функция - которую следует вызывать
    Пример: ( он кстате есть в Example_miniHLSDK )
    [CODEBOX]
    -- Пример: Хукним HUD_Frame на луа
    HUD_Frame__Orig = 0;
    HUD_Frame__Gate = 0;
    function HUD_Frame__Hook( _time )

    print( tostring( _time ) );

    HUD_Frame__Gate( _time );

    end;
    function SETHOOK_FRAME()
    --Адрес 1-ого байта функции
    HUD_Frame__Orig = rDword( PClient + exporttable_t.HUD_Frame.Offset );
    --Создание луа функции обертки( тип описан в exporttable_t )
    HUD_Frame__Gate = __create( exporttable_t.HUD_Frame.FType , HUD_Frame__Orig );
    --Представление луа функци HUD_Frame__Hook ( возвращает путь к 1-му байту функции представления )
    local NewAddr = __submit( exporttable_t.HUD_Frame.FType , HUD_Frame__Hook );
    --Перезаписываем адрес в таблице оригинальной функции функцией предстовления
    wDword( PClient + exporttable_t.HUD_Frame.Offset , NewAddr );
    end;
    --SETHOOK_FRAME();
    [/CODEBOX]

    +Возможность обращатся / представлять 99% ВинАйпи функций... 90% функций движка
    -Немнога сложно
    >>> CLICK <<<
    Ответсвенности за потенциальный бан ВАК не несу...
     
Thread Status:
Not open for further replies.