CT-Shield v2.0 (Protector)

😁
Олдфаг
Статус
Оффлайн
Регистрация
27 Ноя 2016
Сообщения
2,091
Реакции[?]
2,025
Поинты[?]
6K
Обновленная версия протектора, который был создан для защиты клиента Counter-Strike 1.6, от нежелательных изменений в нем. Основная задача "щита" состояла и состоит в том, чтобы на корню пресекать все потуги Администрации сервера, засунуть свои длинные лапы туда, куда это делать определенно не следует, и не дать изменить настройки клиента.
- Скачать файл по ссылке в конце описания.
- Скопировать файл в корневую директорию клиента.
- Надпись в консоли при запуске, будет свидетельствовать об успешной установке.
Важно! Имя файла можно переименовать на любое другое. Рекомендую сделать это сразу!
Основные настройки, осуществляется в конфигурационном файле: - \Counter-Strike\ct-shield\settings.ini.
-----------------------------------------------------------------------------------------------
Фильтрация команд из следующих источников:

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-й под лист

Более сложный пример по которуму реализована фильтрация биндов:
Код:
// 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" "="
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" - значит привязку квара к сетинфо тоесть при смене данного квара будет меняться и сетинфо

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-й параметр - сам текст для выполнения

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

При загрузке 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 ):tongueout:Char; cdecl;" );
Создаем луа обертку:
function_ob = __create( f_id , Addr ); -- Или так __create( "my_function" , Addr );
И далее вызов:
print( function_ob( 1 , 2 ) );


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

__submit - Создает представление нужного ( указанного вами типа ) функцию которая будет вызывать Lua функцию; Возвращает Абсолютный адрес функции представления
1-й параметр - ид который вернула команда __type либо имя указанное при создании __type
2-й параметр - луа функция - которую следует вызывать
Пример: ( он кстате есть в Example_miniHLSDK )

Код:
--  Пример: Хукнем HUD_Frame на lua
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();
+Возможность обращаться / представлять 99% WinAPI функций... 90% функций движка
-Немного сложно

ct_create_pack - создает локальный фейк сервер. присоединяетесь со 2-го окна для сохранения тикета на пиратке, или с этого же окна(при ct_emu_select original) и потом копируете тикет в no-steam.
ct_load_last_pack - загружает тикет созданный ct_create_pack либо полученный через php фейк-серв.
ct_emu_ran [ 1/0 ] - устанавливает рандомное значение steam id при каждом коннекте(по дефолту 1).
ct_emu_set - задает выбранное значение steam id.
ct_emu_next - берет стим ид игроков. находясь на сервере вводите ct_emu_next(можно забиндить) возьмется чей-то ид, далее релог и вы играете под другим стимом.., а если вас банят, то вне сервера снова вводите ct_emu_next притом старый запоминается/выбираться больше не будет.
ct_cdkey_ran [ 1/0 ] - рандомный сдкей при каждом коннекте(по умолчанию 1)
ct_cdkey_set - свой cdkey(любые 32 символа).
ct_load_list - менять ники каждую секунду.
ct_game_list - тоже, что и выше, только теперь будут браться ники игроков сервера.
ct_connect_load_list - случайный ник при каждом присоединении.
ct_connect_game_list - брать ники игроков сервера при каждом присоединении.
ct_connect_nick - присоединятся под случайным ником, после чего менять на стандартный ( обход супер бана в реконект ~ 5-15сек ).
ct_connect_set_nick - установить стандартный ник для команды выше.ct_show_steam - аналог команды "status", выводит стим ид игроков.ct_emu_select - устанавливает эмулятор(по умолчанию RevEmu ) но можно и следующие:
1. revemu - самый распространенный эмулятор.
2. avsmp - редкий, но дает возможность брать стеам_0:1:ХХ..
3. setti - генерация по ip, при этом по умолчанию префикс 4.
4. revemuold - старый эмулятор.
5. revemuold_cm - старый эмулятор( тот же revemuold но при SteamEmuCompatMode = 1(в кфг Dproto).
6. steamemu - 2-й по распространенности эмулятор.
7. steamemu_cm - 2-й по распространенности эмулятор( тот же steamemu но при SteamEmuCompatMode = 1 (в конфиге Dproto).
8. original - проходит оригинальный тикет и сд-кей( если был steam_id_lan, то будет он, если коннект со стима, то будет стим и т.д).

Для просмотра содержимого вам необходимо авторизоваться.


Автор: OSTROG.
 
Сверху Снизу