###############################
Можно былобы добавить все основные команды движка.. систему хуков но я решил сделать это более уневерсально
Вы сами можете найти по сигнатурам нужную функцию и создать на нее представление.. либо представить луа функцию и хукнуть что надо...
Как установить:
[spoiler]Если игра поддерживает плагин систему asi( грузит loadlibrary все файлы *.asi из определенной папки , ищет условную экпортируемую функцию и передает ей условный интерфейс если нет то freelibrary.. но достаточна чтобы хоть раз загрузила ) добавить файл в папку с *.asi
Или инжектить ( перейменовав в *.dll ) любым инжектором..
Папка с луа скриптами находится на томже уровне что и файл( и имеет такоеже название без расшерения )
LuaMod Уневерсален и подходит для любого процесса..( сводиться все к изменению памяти/обращению к функциям/хуку функций[/spoiler]
Как подключить свой скрипт:
[spoiler]При загрузке dll выполняется следующий скприпт ( Отнасительно папки луа мода )
lua/main.lua
Все скрипты идут в 1-н поток
тоесть если надо поставить допустим задачу на время / фраймы то надо найти и хукнуть худфрайм игры и внем мини планировщик..
( если худфарйма еще нету как в cs1.6 , то нада хукнуть любую часто вызывающююся функции ( sleep например ) и вней проверять )[/spoiler]
Все команды моего расширения:
[spoiler]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 );
Как видно некоторые одни и теже команды доступны под разными именами ( __read_* / r* и т.д. ) ( и команд не так уж и многа[/spoiler]
Include:
[spoiler]__include - подключает скрипт
- аналог стандартной dofile толька ( dofile отнасительно текущей дир а include отнасительно lua/ )
__include_once - подключает скрипт толька 1-н раз
и там и там параметр относительный путь к файлу от lua/
Пример:
__include_once( "InitMem.lua" );[/spoiler]
Работа с памятью:
[spoiler]__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[/spoiler]
Работа с числами:
[spoiler]__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[/spoiler]
Системные:
[spoiler]__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-о байта модуля[/spoiler]
Система позволяющая обращаться и представлять функции:
[spoiler]Пожалуй это самая тяжелая часть в щите ( может и по труднее алгоритма подбора ревэми )
Легенда:Позволяет обращатся и предстовлять функции по следующим прототипам:
Любая функция в конечном счете может принимать как единичный параметр толька следующие типы:
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;" );
Можно указать на очистку стека ( retn sizeof(stack.argv) ):
id = __type( "my_function = function( PChar ): DWord; cdecl^std;" );
ну или так
id = __type( "my_function = function( PChar ): DWord; stdcall;" );
( толька ^std можна и с овн и с фасткалл )
__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% функций движка
-Немнога сложно[/spoiler]
Detours( переписал с Delphi на луа ):
[pawn]
- -- Example mini Detours :: for Lua Mod by OSTROG
- __include_once( "InitMem.lua" );
- __include_once( "Common.lua" );
- DiAsm = {
- Base = 0 ,
- Channel = 0 ,
- read_length ,
- cmd_size ,
- last_prefix_size_operand = false ,
- last_prefix_size_addr = false ,
- gb_size_addr = 32 ,
- gb_size_operand = 32 ,
- opcode2 = false ,
- is_debug = true
- };
- function DiAsm:Inc( b )
- if ( b == nil ) then
- b = 1;
- end;
- self.Channel = self.Channel + b;
- self.read_length = self.read_length + b;
- self.cmd_size = self.cmd_size + b;
- end;
- function DiAsm:Dec( b )
- if ( b == nil ) then
- b = 1;
- end;
- self.Channel = self.Channel - b;
- self.read_length = self.read_length - b;
- self.cmd_size = self.cmd_size - b;
- end;
- function DiAsm:GetByte()
- return rByte( self.Channel , 1 );
- end;
- function DiAsm:GetMRM( shr )
- if ( shr == nil ) then
- shr = true;
- end;
- local MRM = {};
- local B = self:GetByte();
- MRM.mod = __and( __shr( B , 6 ) , 3 );
- MRM.reg = __and( __shr( B , 3 ) , 7 );
- MRM.rm = __and( B , 7 );
- if ( shr ) then
- self:Inc();
- end;
- return MRM;
- end;
- function DiAsm:GetSIB( shr )
- if ( shr == nil ) then
- shr = true;
- end;
- local MRM = {};
- local B = self:GetByte();
- MRM.scale = __and( __shr( B , 6 ) , 3 );
- MRM.index = __and( __shr( B , 3 ) , 7 );
- MRM.base = __and( B , 7 );
- if ( shr ) then
- self:Inc();
- end;
- return SIB;
- end;
- function DiAsm:ProcessMRM()
- local MRM = self:GetMRM();
- if ( MRM.mod == 0 ) then
- if ( MRM.rm == 4 ) then
- local SIB = self:GetSIB();
- if ( SIB.base == 5 ) then
- self:Inc( 4 );
- end;
- end;
- elseif ( MRM.mod == 1 ) then
- if ( MRM.rm == 4 ) then
- local SIB = self:GetSIB();
- self:Inc();
- else
- self:Inc();
- end;
- elseif ( MRM.mod == 2 ) then
- if ( MRM.rm == 4 ) then
- local SIB = self:GetSIB();
- self:Inc( 4 );
- else
- self:Inc( 4 );
- end;
- elseif ( MRM.mod == 3 ) then
- end;
- end;
- function DiAsm:ReadCmd__Prefix( B )
- if (
- ( B == 0x26 ) or
- ( B == 0x26 ) or
- ( B == 0x2E ) or
- ( B == 0x36 ) or
- ( B == 0x3E ) or
- ( B == 0x64 ) or
- ( B == 0x65 ) or
- ( B == 0xF0 ) or
- ( B == 0xF2 ) or
- ( B == 0xF3 )
- ) then
- self:Inc();
- return true;
- end;
- if ( B == 0x66 ) then
- self.last_prefix_size_operand = true;
- self:Inc();
- return true;
- end;
- if ( B == 0x67 ) then
- self.last_prefix_size_addr = true;
- self:Inc();
- return true;
- end;
- if ( B == 0x0F ) then
- self.opcode2 = true;
- self:Inc();
- return true;
- end;
- return false;
- end;
- function DiAsm:ReadCmd__One( B )
- if (
- ( ( B >= 0x40 ) and ( B <= 0x61 ) ) or
- ( ( B >= 0x9B ) and ( B <= 0x9F ) ) or
- ( ( B >= 0x90 ) and ( B <= 0x99 ) ) or
- ( ( B >= 0x6C ) and ( B <= 0x6F ) ) or
- ( ( B >= 0xA4 ) and ( B <= 0xA7 ) ) or
- ( ( B >= 0xAA ) and ( B <= 0xAF ) ) or
- ( ( B >= 0xEC ) and ( B <= 0xF5 ) ) or
- ( ( B >= 0xF8 ) and ( B <= 0xFD ) ) or
- ( B == 0x06 ) or
- ( B == 0x07 ) or
- ( B == 0x0E ) or
- ( B == 0x16 ) or
- ( B == 0x17 ) or
- ( B == 0x1E ) or
- ( B == 0x1F ) or
- ( B == 0x27 ) or
- ( B == 0x2F ) or
- ( B == 0x37 ) or
- ( B == 0x3F ) or
- ( B == 0xC3 ) or
- ( B == 0xC9 ) or
- ( B == 0xCB ) or
- ( B == 0xCC ) or
- ( B == 0xCE ) or
- ( B == 0xCF ) or
- ( B == 0xD6 ) or
- ( B == 0xD7 )
- ) then
- self:Inc();
- return true;
- end;
- return false;
- end;
- function DiAsm:ReadCmd__MrmOrigin( B )
- if (
- ( ( B >= 0x00 ) and ( B <= 0x03 ) ) or
- ( ( B >= 0x08 ) and ( B <= 0x0B ) ) or
- ( ( B >= 0x10 ) and ( B <= 0x13 ) ) or
- ( ( B >= 0x18 ) and ( B <= 0x1B ) ) or
- ( ( B >= 0x20 ) and ( B <= 0x23 ) ) or
- ( ( B >= 0x28 ) and ( B <= 0x2B ) ) or
- ( ( B >= 0x30 ) and ( B <= 0x33 ) ) or
- ( ( B >= 0x38 ) and ( B <= 0x3B ) ) or
- ( ( B >= 0x62 ) and ( B <= 0x63 ) ) or
- ( ( B >= 0x84 ) and ( B <= 0x8E ) ) or
- ( ( B >= 0xC4 ) and ( B <= 0xC5 ) )
- ) then
- self:Inc();
- self:ProcessMRM();
- return true;
- end;
- return false;
- end;
- function DiAsm:ReadCmd__Data1(B )
- if (
- ( ( B >= 0xB0) and ( B <= 0xB7 ) ) or
- ( ( B >= 0xE0) and ( B <= 0xE7 ) ) or
- ( ( B >= 0x70) and ( B <= 0x7F ) ) or
- ( B == 0x04 ) or
- ( B == 0x0C ) or
- ( B == 0x14 ) or
- ( B == 0x1C ) or
- ( B == 0x24 ) or
- ( B == 0x2C ) or
- ( B == 0x34 ) or
- ( B == 0x3C ) or
- ( B == 0x6A ) or
- ( B == 0xA8 ) or
- ( B == 0xCD )
- ) then
- self:Inc();
- self:Inc();
- return true;
- end;
- return false;
- end;
- function DiAsm:ReadCmd__Data2i4( B )
- if (
- ( ( B >= 0xA0 ) and ( B <= 0xA3 ) ) or
- ( ( B >= 0xB8 ) and ( B <= 0xBF ) ) or
- ( B == 0x05 ) or
- ( B == 0x0D ) or
- ( B == 0x15 ) or
- ( B == 0x1D ) or
- ( B == 0x25 ) or
- ( B == 0x2D ) or
- ( B == 0x35 ) or
- ( B == 0x3D ) or
- ( B == 0x68 ) or
- ( B == 0xA9 ) or
- ( B == 0xE8 ) or
- ( B == 0xE9 )
- ) then
- self:Inc();
- self:Inc( 4 );
- return true;
- end;
- return false;
- end;
- function DiAsm:ReadCmd__MrmData1( B )
- if ( B == 0x69 ) then
- self:Inc();
- self:ProcessMRM();
- self:Inc( 4 );
- return true;
- end;
- return false;
- end;
- function DiAsm:ReadCmd__NnnData1( B )
- if (
- ( B == 0x80 ) or
- ( B == 0x82 ) or
- ( B == 0x83 ) or
- ( B == 0xC0 ) or
- ( B == 0xC1 ) or
- ( B == 0xC6 )
- ) then
- self:Inc();
- self:ProcessMRM();
- sefl:Inc();
- return true;
- end;
- return false;
- end;
- function DiAsm:ReadCmd__NnnData2i4( B )
- if (
- ( B == 0x81 ) or
- ( B == 0xC7 )
- ) then
- self:Inc();
- MRM = self:GetMRM();
- if ( MRM.mod == 0 ) then
- if ( MRM.rm == 4 ) then
- local SIB = self:GetSIB();
- if ( SIB.base == 5 ) then
- self:Inc( 4 );
- end;
- elseif ( MRM.rm == 5 ) then
- self:Inc( 4 );
- end;
- elseif ( MRM.mod == 1 ) then
- if ( MRM.rm == 4 ) then
- local SIB = self:GetSIB();
- self:Inc();
- else
- self:Inc();
- end;
- elseif ( MRM.mod == 2 ) then
- if ( MRM.rm == 4 ) then
- local SIB = self:GetSIB();
- self:Inc( 4 );
- else
- self:Inc( 4 );
- end;
- elseif ( MRM.mod == 3 ) then
- end;
- self:Inc( 4 );
- return true;
- end;
- return false;
- end;
- function DiAsm:Reset()
- self.opcode2 = false;
- self.last_prefix_size_addr = false;
- self.last_prefix_size_operand = false;
- self.cmd_size = 0;
- end;
- function DiAsm:Init( Addr )
- self.Channel = Addr;
- self.gb_size_addr = 32;
- self.gb_size_operand = 32;
- self.read_length = 0;
- self:Reset();
- end;
- function DiAsm:ReadCmd()
- self:Reset();
- while( self:ReadCmd__Prefix() ) do end;
- local Cmd = self:GetByte();
- if ( self.opcode2 ) then
- else
- if (
- ( self:ReadCmd__One( Cmd ) ) or
- ( self:ReadCmd__MrmOrigin( Cmd ) ) or
- ( self:ReadCmd__Data1( Cmd ) ) or
- ( self:ReadCmd__Data2i4( Cmd ) ) or
- ( self:ReadCmd__MrmData1( Cmd ) ) or
- ( self:ReadCmd__NnnData1( Cmd ) ) or
- ( self:ReadCmd__NnnData2i4( Cmd ) )
- ) then
- return true;
- end;
- end;
- return false;
- end;
- function DiAsm:DebugShow( t )
- if ( self.is_debug ) then
- if ( t == 0 ) then
- print( "---------------------------------------------" );
- print( string.format( "Addr = %s" , IntToHex( self.Channel ) ) );
- print( string.format( "Opcode = %s" , IntToHex( rByte(self.Channel) ) ) );
- end;
- if ( t == 1 ) then
- print( string.format( "Size cmd = %s" , IntToHex( self.cmd_size ) ) );
- print( string.format( "Milc cmd = %s" , IntToHex( self.read_length ) ) );
- end;
- if ( t == 2 ) then
- print( string.format( "Size cmd = %s" , IntToHex( self.cmd_size ) ) );
- print( string.format( "Milc cmd = %s" , IntToHex( self.read_length ) ) );
- print( "---------------------------------------------" );
- print( string.format( "Addr = %s" , IntToHex( self.Channel ) ) );
- print( string.format( "Opcode = %s" , IntToHex( rByte(self.Channel) ) ) );
- end;
- end;
- end;
- function DiAsm:GetMinLen( Addr , Len )
- if ( Len == nil ) then
- Len = 5;
- end;
- self:Init( Addr );
- self:DebugShow( 0 );
- while( self:ReadCmd() ) do
- if ( self.read_length >= Len ) then
- self:DebugShow( 1 );
- return self.read_length;
- end;
- self:DebugShow( 2 );
- end;
- return -1;
- end;
- Detours = { hooks = {} };
- function Detours.Attach( Addr_Orig , Addr_New )
- if ( Detours.hooks[ Addr_Orig ] ) then
- return 0;
- end;
- Addr_Orig = __dword( Addr_Orig );
- Addr_New = __dword( Addr_New );
- local Len = DiAsm:GetMinLen( Addr_Orig , 5 );
- if ( Len < 5 ) then
- -- Error('Detours: length error commands');
- return 0;
- end;
- info = { Size = 0 , Memory = 0 };
- info.Size = Len;
- info.Memory = __dword( __mem( Len + 5 ) );
- __copy( info.Memory , Addr_Orig , Len , 1 );
- wByte( Addr_Orig , 0xE9 , 1 );
- wDword( __dword( Addr_Orig + 1 ) , __dword( Addr_New - Addr_Orig - 5 ) , 1 );
- wByte( info.Memory + info.Size , 0xE9 , 1 );
- wDword( info.Memory + info.Size + 1 , __dword( Addr_Orig - info.Memory - 5 ) , 1 );
- Detours.hooks[ Addr_Orig ] = info;
- return info.Memory;
- end;
- function Detours.Deatch( Addr_Orig )
- if ( not( Detours.hooks[ Addr_Orig ] ) ) then
- return false;
- end;
- __copy( Addr_Orig , info.Memory , 5 , 1 );
- __free( info.Memory );
- Detours.hooks[ Addr_Orig ] = nil;
- return true;
- end;
- function Detours.AttachLua( Addr_Orig , LuaHookFunction , FunctionType )
- local NewAddr = __submit( FunctionType , LuaHookFunction );
- local Gate = Detours.Attach( Addr_Orig , NewAddr );
- if ( Gate == 0 ) then
- -- Errors
- return 0;
- end;
- Gate = __create( FunctionType , Gate );
- return Gate;
- end;
Деторс для x32 команд без 0x0F* - но этого достаточна чтобы хукать 99,9 виайпи( их вроде с хп сп3 изза mod edi,edi и так можна длинна всегда 5 ) и практически все функции движка в авто режиме( тоесть не нужно смотреть в дизас. длинну и т.д. достаточна знать адрес функции )
Также я писал что в 1-н поток.. тоесть хукать sleep и т.д. но при хуке sleep вылезает не понятная ошибка.. зато при открытиее дургова потока ( даже на томже стеке луа ) не каких ошибок нету.. пример:
[pawn]
- PCreateThread = GetFunctionAddress( "Kernel32.dll" , "CreateThread" );
- TCreateThread = __type( "TCreateThread = function( DWord , DWord , DWord , DWord , DWord , DWord ):DWord; stdcall;" );
- CreateThread = __create( TCreateThread , PCreateThread );
- function NewThread()
- while( true ) do
- Sleep( 1000 );
- print( "Text" );
- end;
- end;
- MNewThread = __submit( "function();" , NewThread );
- CreateThread( 0 , 0 , MNewThread , 0 , 0 , 0 );
тоесть искать во 2-м потоке можна и без ошибок..
пример использования деторса ( хукним криатефайлА )
[pawn]
- function HOOK_CreateFileA( lpFileName , dwDesiredAccess , dwShareMode , lpSecurityAttributes , dwCreationDisposition , dwFlagsAndAttributes , hTemplateFile )
- print( lpFileName );
- CreateFileA_Gate( lpFileName , dwDesiredAccess , dwShareMode , lpSecurityAttributes , dwCreationDisposition , dwFlagsAndAttributes , hTemplateFile );
- end;
- CreateFileA_Gate = 0;
- PCreateFileA = GetFunctionAddress( "Kernel32.dll" , "CreateFileA" );
- TCreateFileA = __type( "TCreateFileA = function( PChar , DWord , DWord , DWord , DWord , DWord , DWord ): DWord; stdcall;" );
- if ( not( PCreateFileA == 0 ) ) then
- CreateFileA_Gate = Detours.AttachLua( PCreateFileA , HOOK_CreateFileA , TCreateFileA );
- --Detours.Deatch( PCreateFileA );
- end;
- -- вот и все.. и так можна хукать все WinAPI
Вы должны зарегистрироваться, чтобы видеть ссылки.
Вы должны зарегистрироваться, чтобы видеть ссылки.
Добавлено спустя 8 минут 56 секунд:
Можна писать скрипты для cs1.6( если хотите сделать вашу сборку уникальной )
А также скрипты к серверной части:
Установка:
[spoiler]Перейменовать в *.dll
Лучше всего дописать в файл liblist.gam строчку вида:
gamedll "addons\LuaMod.dll"
но можна и как плагин метамода тогда в addons\metamod\plugins.ini дописать строчку вида:
win32 addons\LuaMod.dll
если нет доступа и на это то можна запустить как плагин для amx .. в этом случае дописать в addons\amxmodx\configs\modules.ini строчку вида:
SVShield
а саму дилку переименовать в SVShield_amxx.dll и закинуть по адресу
addons\amxmodx\modules\LuaMod_amxx.dll
а вообще инжектить можно как угодно и чем угодна...
у процесса должны быть полные права на папку рядом с дилкой имеющюю такое же название[/spoiler]