Русское сообщество по скриптингу

Уневерсальный LuaMod

Новые плагины для Metamod, которые были добавлены в базу плагинов нашего форума. Плагины еще не утвеждены администратором/модератором.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

Данный раздел форума служит для добавления новых плагинов в базу нашего форума. После того, как администратор/модератор утвердит плагин, он будет перемещен в раздел "Утвежденные плагины".

Правила при добавлении новых плагинов:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. Обязательно выкладывайте исходник плагина. Запрещено выкладывать dll/so файлы без исходников.
4. Обязательно указывайте настоящих авторов плагина, если вы использовали чьи-то наработки или функции, указывайте их авторов в сообщении.
5. Необходимо заполнять детальную информацию о плагине (версию, настройки, список изменений и другую).

Уневерсальный LuaMod

Сообщение 0STROG » 06 июн 2014, 14:40

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

Как установить:
[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]
  1.  

  2. --      Example mini Detours :: for Lua Mod by OSTROG

  3.  

  4. __include_once( "InitMem.lua"   );

  5. __include_once( "Common.lua"    );

  6.  

  7. DiAsm = {

  8.         Base  = 0 ,

  9.         Channel = 0 ,  

  10.         read_length ,

  11.         cmd_size ,

  12.         last_prefix_size_operand = false ,

  13.         last_prefix_size_addr = false ,

  14.         gb_size_addr = 32 ,

  15.         gb_size_operand = 32 ,

  16.         opcode2 = false ,

  17.         is_debug = true

  18. };

  19.  

  20. function DiAsm:Inc( b )

  21.  

  22.         if ( b == nil ) then

  23.        

  24.                 b = 1;

  25.                

  26.         end;

  27.  

  28.         self.Channel = self.Channel + b;

  29.         self.read_length = self.read_length + b;

  30.         self.cmd_size = self.cmd_size + b;

  31.  

  32. end;

  33. function DiAsm:Dec( b )

  34.  

  35.         if ( b == nil ) then

  36.        

  37.                 b = 1;

  38.                

  39.         end;

  40.  

  41.         self.Channel = self.Channel - b;

  42.         self.read_length = self.read_length - b;

  43.         self.cmd_size = self.cmd_size - b;

  44.  

  45. end;

  46. function DiAsm:GetByte()

  47.  

  48.         return rByte( self.Channel , 1 );

  49.  

  50. end;

  51.  

  52. function DiAsm:GetMRM( shr )

  53.  

  54.         if ( shr == nil ) then

  55.        

  56.                 shr = true;

  57.                

  58.         end;

  59.        

  60.         local MRM = {};

  61.  

  62.         local B = self:GetByte();

  63.        

  64.         MRM.mod = __and( __shr( B , 6 ) , 3 );

  65.         MRM.reg = __and( __shr( B , 3 ) , 7 );

  66.         MRM.rm  = __and( B              , 7 );

  67.                

  68.         if ( shr ) then

  69.        

  70.                 self:Inc();

  71.        

  72.         end;

  73.        

  74.         return MRM;

  75.  

  76. end;

  77. function DiAsm:GetSIB( shr )

  78.  

  79.         if ( shr == nil ) then

  80.        

  81.                 shr = true;

  82.                

  83.         end;

  84.        

  85.         local MRM = {};

  86.  

  87.         local B = self:GetByte();

  88.        

  89.         MRM.scale       = __and( __shr( B , 6 ) , 3 );

  90.         MRM.index       = __and( __shr( B , 3 ) , 7 );

  91.         MRM.base        = __and( B              , 7 );

  92.        

  93.         if ( shr ) then

  94.        

  95.                 self:Inc();

  96.        

  97.         end;

  98.        

  99.         return SIB;

  100.  

  101. end;

  102. function DiAsm:ProcessMRM()

  103.  

  104.         local MRM = self:GetMRM();

  105.  

  106.         if              ( MRM.mod == 0 ) then

  107.                

  108.                 if ( MRM.rm == 4 ) then

  109.                

  110.                         local SIB = self:GetSIB();

  111.                                

  112.                         if ( SIB.base == 5 ) then

  113.                                

  114.                                 self:Inc( 4 );

  115.                                

  116.                         end;

  117.                

  118.                 end;

  119.        

  120.         elseif  ( MRM.mod == 1 ) then

  121.                

  122.                 if ( MRM.rm == 4 ) then

  123.                

  124.                         local SIB = self:GetSIB();

  125.                        

  126.                         self:Inc();

  127.                

  128.                 else

  129.                

  130.                         self:Inc();

  131.                

  132.                 end;

  133.        

  134.         elseif  ( MRM.mod == 2 ) then

  135.        

  136.                 if ( MRM.rm == 4 ) then

  137.                

  138.                         local SIB = self:GetSIB();

  139.                        

  140.                         self:Inc( 4 );

  141.                        

  142.                 else

  143.                

  144.                         self:Inc( 4 );

  145.                        

  146.                 end;

  147.                

  148.         elseif  ( MRM.mod == 3 ) then

  149.        

  150.         end;

  151.  

  152. end;

  153.  

  154. function DiAsm:ReadCmd__Prefix( B )

  155.  

  156.         if (

  157.                 ( B == 0x26 ) or

  158.                 ( B == 0x26 ) or

  159.                 ( B == 0x2E ) or

  160.                 ( B == 0x36 ) or

  161.                 ( B == 0x3E ) or

  162.                 ( B == 0x64 ) or

  163.                 ( B == 0x65 ) or

  164.                 ( B == 0xF0 ) or

  165.                 ( B == 0xF2 ) or

  166.                 ( B == 0xF3 )

  167.         ) then

  168.        

  169.                 self:Inc();

  170.        

  171.                 return true;

  172.                

  173.         end;

  174.        

  175.         if ( B == 0x66 ) then

  176.                

  177.                 self.last_prefix_size_operand = true;

  178.                

  179.                 self:Inc();

  180.                

  181.                 return true;

  182.  

  183.         end;

  184.  

  185.         if ( B == 0x67 ) then

  186.        

  187.                 self.last_prefix_size_addr = true;

  188.                

  189.                 self:Inc();

  190.                

  191.                 return true;

  192.  

  193.         end;

  194.  

  195.         if ( B == 0x0F ) then

  196.  

  197.                 self.opcode2 = true;

  198.                

  199.                 self:Inc();

  200.                

  201.                 return true;

  202.                

  203.         end;

  204.  

  205.         return false;

  206.  

  207. end;

  208. function DiAsm:ReadCmd__One( B )

  209.  

  210.         if (

  211.                 ( ( B >= 0x40 ) and ( B <= 0x61 ) ) or

  212.                 ( ( B >= 0x9B ) and ( B <= 0x9F ) ) or

  213.                 ( ( B >= 0x90 ) and ( B <= 0x99 ) ) or

  214.                 ( ( B >= 0x6C ) and ( B <= 0x6F ) ) or

  215.                 ( ( B >= 0xA4 ) and ( B <= 0xA7 ) ) or

  216.                 ( ( B >= 0xAA ) and ( B <= 0xAF ) ) or

  217.                 ( ( B >= 0xEC ) and ( B <= 0xF5 ) ) or

  218.                 ( ( B >= 0xF8 ) and ( B <= 0xFD ) ) or

  219.                 ( B == 0x06 ) or

  220.                 ( B == 0x07 ) or

  221.                 ( B == 0x0E ) or

  222.                 ( B == 0x16 ) or

  223.                 ( B == 0x17 ) or

  224.                 ( B == 0x1E ) or

  225.                 ( B == 0x1F ) or

  226.                 ( B == 0x27 ) or

  227.                 ( B == 0x2F ) or

  228.                 ( B == 0x37 ) or

  229.                 ( B == 0x3F ) or

  230.                 ( B == 0xC3 ) or

  231.                 ( B == 0xC9 ) or

  232.                 ( B == 0xCB ) or

  233.                 ( B == 0xCC ) or

  234.                 ( B == 0xCE ) or

  235.                 ( B == 0xCF ) or

  236.                 ( B == 0xD6 ) or

  237.                 ( B == 0xD7 )

  238.         ) then

  239.        

  240.                 self:Inc();

  241.                

  242.                 return true;

  243.        

  244.         end;

  245.        

  246.         return false;

  247.  

  248. end;

  249. function DiAsm:ReadCmd__MrmOrigin( B )

  250.  

  251.         if (

  252.                 ( ( B >= 0x00 ) and ( B <= 0x03 ) ) or

  253.                 ( ( B >= 0x08 ) and ( B <= 0x0B ) ) or

  254.                 ( ( B >= 0x10 ) and ( B <= 0x13 ) ) or

  255.                 ( ( B >= 0x18 ) and ( B <= 0x1B ) ) or

  256.                 ( ( B >= 0x20 ) and ( B <= 0x23 ) ) or

  257.                 ( ( B >= 0x28 ) and ( B <= 0x2B ) ) or

  258.                 ( ( B >= 0x30 ) and ( B <= 0x33 ) ) or

  259.                 ( ( B >= 0x38 ) and ( B <= 0x3B ) ) or

  260.                 ( ( B >= 0x62 ) and ( B <= 0x63 ) ) or

  261.                 ( ( B >= 0x84 ) and ( B <= 0x8E ) ) or

  262.                 ( ( B >= 0xC4 ) and ( B <= 0xC5 ) )

  263.         ) then

  264.  

  265.                 self:Inc();

  266.                

  267.                 self:ProcessMRM();

  268.                

  269.                 return true;

  270.  

  271.         end;

  272.        

  273.         return false;

  274.  

  275. end;

  276. function DiAsm:ReadCmd__Data1(B )

  277.  

  278.         if (

  279.                 ( ( B >= 0xB0) and ( B <= 0xB7 ) ) or

  280.                 ( ( B >= 0xE0) and ( B <= 0xE7 ) ) or

  281.                 ( ( B >= 0x70) and ( B <= 0x7F ) ) or

  282.                 ( B == 0x04 ) or

  283.                 ( B == 0x0C ) or

  284.                 ( B == 0x14 ) or

  285.                 ( B == 0x1C ) or

  286.                 ( B == 0x24 ) or

  287.                 ( B == 0x2C ) or

  288.                 ( B == 0x34 ) or

  289.                 ( B == 0x3C ) or

  290.                 ( B == 0x6A ) or

  291.                 ( B == 0xA8 ) or

  292.                 ( B == 0xCD )

  293.         ) then

  294.        

  295.                 self:Inc();

  296.  

  297.                 self:Inc();

  298.                

  299.                 return true;

  300.                

  301.         end;

  302.        

  303.         return false;

  304.        

  305. end;

  306. function DiAsm:ReadCmd__Data2i4( B )

  307.  

  308.         if (

  309.                 ( ( B >= 0xA0 ) and ( B <= 0xA3 ) ) or

  310.                 ( ( B >= 0xB8 ) and ( B <= 0xBF ) ) or

  311.                 ( B == 0x05 ) or

  312.                 ( B == 0x0D ) or

  313.                 ( B == 0x15 ) or

  314.                 ( B == 0x1D ) or

  315.                 ( B == 0x25 ) or

  316.                 ( B == 0x2D ) or

  317.                 ( B == 0x35 ) or

  318.                 ( B == 0x3D ) or

  319.                 ( B == 0x68 ) or

  320.                 ( B == 0xA9 ) or

  321.                 ( B == 0xE8 ) or

  322.                 ( B == 0xE9 )

  323.         ) then

  324.  

  325.                 self:Inc();

  326.                        

  327.                 self:Inc( 4 );

  328.  

  329.                 return true;

  330.                

  331.         end;

  332.        

  333.         return false;

  334.        

  335. end;

  336. function DiAsm:ReadCmd__MrmData1( B )

  337.  

  338.         if ( B == 0x69 ) then

  339.  

  340.                 self:Inc();

  341.  

  342.                 self:ProcessMRM();

  343.                

  344.                 self:Inc( 4 );

  345.                

  346.                 return true;

  347.                

  348.         end;

  349.  

  350.         return false;

  351.  

  352. end;

  353. function DiAsm:ReadCmd__NnnData1( B )

  354.  

  355.         if (

  356.                 ( B == 0x80 ) or

  357.                 ( B == 0x82 ) or

  358.                 ( B == 0x83 ) or

  359.                 ( B == 0xC0 ) or

  360.                 ( B == 0xC1 ) or

  361.                 ( B == 0xC6 )

  362.         ) then

  363.        

  364.                 self:Inc();

  365.                

  366.                 self:ProcessMRM();

  367.                

  368.                 sefl:Inc();

  369.                

  370.                 return true;

  371.        

  372.         end;

  373.        

  374.         return false;

  375.  

  376. end;

  377. function DiAsm:ReadCmd__NnnData2i4( B )

  378.  

  379.         if (

  380.                         ( B == 0x81 ) or

  381.                         ( B == 0xC7 )

  382.                 ) then

  383.        

  384.                 self:Inc();

  385.                

  386.                 MRM = self:GetMRM();

  387.                

  388.                 if              ( MRM.mod == 0 ) then

  389.                

  390.                         if              ( MRM.rm == 4 ) then

  391.                        

  392.                                 local SIB = self:GetSIB();

  393.                                

  394.                                 if ( SIB.base == 5 ) then

  395.                                

  396.                                         self:Inc( 4 );

  397.                                

  398.                                 end;

  399.                        

  400.                         elseif  ( MRM.rm == 5 ) then

  401.                                

  402.                                 self:Inc( 4 );

  403.                                

  404.                         end;

  405.                        

  406.                 elseif  ( MRM.mod == 1 ) then

  407.                

  408.                         if ( MRM.rm == 4 ) then

  409.                                

  410.                                 local SIB = self:GetSIB();

  411.                                

  412.                                 self:Inc();                    

  413.                        

  414.                         else

  415.                        

  416.                                 self:Inc();

  417.                                

  418.                         end;

  419.                

  420.                 elseif  ( MRM.mod == 2 ) then

  421.                

  422.                         if ( MRM.rm == 4 ) then

  423.                                

  424.                                 local SIB = self:GetSIB();

  425.                                

  426.                                 self:Inc( 4 );

  427.                        

  428.                         else

  429.                        

  430.                                 self:Inc( 4 );

  431.                                

  432.                         end;

  433.                

  434.                 elseif  ( MRM.mod == 3 ) then

  435.                

  436.                 end;

  437.                

  438.                 self:Inc( 4 );

  439.                

  440.                 return true;

  441.                

  442.         end;

  443.        

  444.         return false;

  445.        

  446. end;

  447.  

  448. function DiAsm:Reset()

  449.  

  450.         self.opcode2 = false;

  451.         self.last_prefix_size_addr = false;

  452.         self.last_prefix_size_operand = false;

  453.         self.cmd_size = 0;

  454.  

  455. end;

  456. function DiAsm:Init( Addr )

  457.  

  458.         self.Channel = Addr;

  459.         self.gb_size_addr = 32;

  460.         self.gb_size_operand = 32;

  461.         self.read_length = 0;

  462.         self:Reset();

  463.  

  464. end;

  465. function DiAsm:ReadCmd()

  466.  

  467.         self:Reset();

  468.  

  469.         while( self:ReadCmd__Prefix() ) do end;

  470.        

  471.         local Cmd = self:GetByte();

  472.        

  473.         if ( self.opcode2 ) then

  474.  

  475.         else

  476.        

  477.                 if (

  478.                         ( self:ReadCmd__One( Cmd ) ) or

  479.                         ( self:ReadCmd__MrmOrigin( Cmd ) ) or

  480.                         ( self:ReadCmd__Data1( Cmd ) ) or

  481.                         ( self:ReadCmd__Data2i4( Cmd ) ) or

  482.                         ( self:ReadCmd__MrmData1( Cmd ) ) or

  483.                         ( self:ReadCmd__NnnData1( Cmd ) ) or

  484.                         ( self:ReadCmd__NnnData2i4( Cmd ) )

  485.                 ) then

  486.        

  487.                         return true;

  488.        

  489.                 end;

  490.        

  491.         end;

  492.  

  493.         return false;

  494.  

  495. end;

  496. function DiAsm:DebugShow( t )

  497.  

  498.         if ( self.is_debug ) then

  499.                

  500.                 if ( t == 0 ) then

  501.  

  502.                         print( "---------------------------------------------" );

  503.                         print( string.format( "Addr   = %s" , IntToHex( self.Channel ) ) );

  504.                         print( string.format( "Opcode = %s" , IntToHex( rByte(self.Channel) ) ) );

  505.                

  506.                 end;

  507.                

  508.                 if ( t == 1 ) then

  509.                

  510.                         print( string.format( "Size cmd = %s" , IntToHex( self.cmd_size ) ) );

  511.                         print( string.format( "Milc cmd = %s" , IntToHex( self.read_length ) ) );

  512.                

  513.                 end;

  514.                

  515.                 if ( t == 2 ) then

  516.                

  517.                         print( string.format( "Size cmd = %s" , IntToHex( self.cmd_size ) ) );

  518.                         print( string.format( "Milc cmd = %s" , IntToHex( self.read_length ) ) );

  519.  

  520.                         print( "---------------------------------------------" );

  521.                         print( string.format( "Addr   = %s" , IntToHex( self.Channel ) ) );

  522.                         print( string.format( "Opcode = %s" , IntToHex( rByte(self.Channel) ) ) );

  523.                

  524.                 end;

  525.                

  526.         end;

  527.  

  528. end;

  529. function DiAsm:GetMinLen( Addr , Len )

  530.  

  531.         if ( Len == nil ) then

  532.        

  533.                 Len = 5;

  534.                

  535.         end;

  536.  

  537.         self:Init( Addr );

  538.        

  539.         self:DebugShow( 0 );

  540.  

  541.         while( self:ReadCmd() ) do

  542.        

  543.                 if ( self.read_length >= Len ) then

  544.                

  545.                         self:DebugShow( 1 );

  546.                        

  547.                         return self.read_length;

  548.                        

  549.                 end;

  550.                

  551.                 self:DebugShow( 2 );

  552.        

  553.         end;

  554.        

  555.         return -1;

  556.  

  557. end;

  558.  

  559.  

  560.  

  561. Detours = { hooks = {} };

  562.  

  563. function Detours.Attach( Addr_Orig , Addr_New )

  564.  

  565.         if ( Detours.hooks[ Addr_Orig ] ) then

  566.        

  567.                 return 0;

  568.        

  569.         end;

  570.  

  571.         Addr_Orig       = __dword( Addr_Orig );

  572.  

  573.         Addr_New        = __dword( Addr_New );

  574.  

  575.         local Len = DiAsm:GetMinLen( Addr_Orig , 5 );

  576.  

  577.         if ( Len < 5 ) then

  578.                

  579.                 --      Error('Detours: length error commands');

  580.  

  581.                 return 0;

  582.                

  583.         end;

  584.  

  585.         info = { Size = 0 , Memory = 0 };

  586.        

  587.         info.Size = Len;

  588.         info.Memory = __dword( __mem( Len + 5 ) );

  589.        

  590.         __copy( info.Memory , Addr_Orig , Len , 1 );

  591.  

  592.         wByte( Addr_Orig , 0xE9 , 1 ); 

  593.         wDword( __dword( Addr_Orig + 1 ) , __dword( Addr_New - Addr_Orig - 5 ) , 1 );

  594.        

  595.         wByte( info.Memory + info.Size , 0xE9 , 1 );   

  596.         wDword( info.Memory + info.Size + 1 , __dword( Addr_Orig - info.Memory - 5 ) , 1 );

  597.        

  598.         Detours.hooks[ Addr_Orig ] = info;

  599.        

  600.         return info.Memory;

  601.        

  602. end;

  603. function Detours.Deatch( Addr_Orig )

  604.  

  605.         if ( not( Detours.hooks[ Addr_Orig ] ) ) then

  606.        

  607.                 return false;

  608.        

  609.         end;

  610.  

  611.         __copy( Addr_Orig , info.Memory , 5 , 1 );

  612.  

  613.         __free( info.Memory );

  614.        

  615.         Detours.hooks[ Addr_Orig ] = nil;

  616.        

  617.         return true;

  618.  

  619. end;

  620. function Detours.AttachLua( Addr_Orig , LuaHookFunction , FunctionType )

  621.  

  622.         local NewAddr = __submit( FunctionType , LuaHookFunction );

  623.        

  624.         local Gate = Detours.Attach( Addr_Orig , NewAddr );

  625.  

  626.         if ( Gate == 0 ) then

  627.        

  628.                 --      Errors

  629.                

  630.                 return 0;

  631.        

  632.         end;

  633.  

  634.         Gate = __create( FunctionType , Gate );

  635.  

  636.         return Gate;

  637.        

  638. end;

  639.  
[/pawn]

Деторс для x32 команд без 0x0F* - но этого достаточна чтобы хукать 99,9 виайпи( их вроде с хп сп3 изза mod edi,edi и так можна длинна всегда 5 ) и практически все функции движка в авто режиме( тоесть не нужно смотреть в дизас. длинну и т.д. достаточна знать адрес функции )

Также я писал что в 1-н поток.. тоесть хукать sleep и т.д. но при хуке sleep вылезает не понятная ошибка.. зато при открытиее дургова потока ( даже на томже стеке луа ) не каких ошибок нету.. пример:

[pawn]
  1.  

  2. PCreateThread = GetFunctionAddress( "Kernel32.dll" , "CreateThread" );

  3.  

  4. TCreateThread = __type( "TCreateThread = function( DWord , DWord , DWord , DWord , DWord , DWord ):DWord; stdcall;" );

  5.  

  6. CreateThread = __create( TCreateThread , PCreateThread );

  7.  

  8. function NewThread()

  9.  

  10.   while( true ) do

  11.  

  12.     Sleep( 1000 );

  13.  

  14.     print( "Text" );

  15.  

  16.   end;

  17.  

  18. end;

  19.  

  20. MNewThread = __submit( "function();" , NewThread );

  21.  

  22. CreateThread( 0 , 0 , MNewThread , 0 , 0 , 0 );

  23.  
[/pawn]
тоесть искать во 2-м потоке можна и без ошибок..

пример использования деторса ( хукним криатефайлА )
[pawn]
  1.  

  2. function HOOK_CreateFileA( lpFileName , dwDesiredAccess , dwShareMode , lpSecurityAttributes , dwCreationDisposition , dwFlagsAndAttributes , hTemplateFile )

  3.  

  4.   print( lpFileName );

  5.  

  6.   CreateFileA_Gate( lpFileName , dwDesiredAccess , dwShareMode , lpSecurityAttributes , dwCreationDisposition , dwFlagsAndAttributes , hTemplateFile );

  7.  

  8. end;

  9.  

  10. CreateFileA_Gate = 0;

  11.  

  12. PCreateFileA = GetFunctionAddress( "Kernel32.dll" , "CreateFileA" );

  13.  

  14. TCreateFileA = __type( "TCreateFileA = function( PChar , DWord , DWord , DWord , DWord , DWord , DWord ): DWord; stdcall;" );

  15.  

  16. if ( not( PCreateFileA == 0 ) ) then

  17.  

  18.   CreateFileA_Gate = Detours.AttachLua( PCreateFileA , HOOK_CreateFileA , TCreateFileA );

  19.  

  20.   --Detours.Deatch( PCreateFileA );

  21.  

  22. end;

  23.  

  24. -- вот и все.. и так можна хукать все WinAPI

  25.  

  26.  
[/pawn]

Вы должны зарегистрироваться, чтобы видеть ссылки.
Вы должны зарегистрироваться, чтобы видеть ссылки.

Добавлено спустя 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]
Последний раз редактировалось 0STROG 12 июн 2014, 21:30, всего редактировалось 1 раз.
Аватара пользователя
0STROG
 
Сообщения: 94
Зарегистрирован: 15 апр 2014, 22:33
Благодарил (а): 10 раз.
Поблагодарили: 23 раз.
Языки программирования: Counter-Strike 1.6

Re: Уневерсальный LuaMod

Сообщение seregaiv1999 » 10 июн 2014, 19:44

У меня не работает.Тестил на Дота 2
Аватара пользователя
seregaiv1999
 
Сообщения: 1
Зарегистрирован: 10 июн 2014, 18:20
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike: Source
Dota 2

Re: Уневерсальный LuaMod

Сообщение 0STROG » 12 июн 2014, 21:45

Up! Добавил мини detours, а также пример с 2-м потоком .
Вы должны зарегистрироваться, чтобы видеть ссылки.

Добавлено спустя 1 минуту 11 секунд:
seregaiv1999 писал(а):У меня не работает.Тестил на Дота 2

хм..
Чем ты инжектил?
Как ты понял что не работает?
Сделай тест с выводм в MessageBox

Добавлено спустя 12 минут 16 секунд:
Вот с этим примером попробуй.. должна мессага появиться
[pawn]
  1.  

  2.  

  3. __include_once( "InitMem.lua"                   );

  4. __include_once( "Example_miniHLSDK.lua" );

  5. __include_once( "Example_WinAPI.lua"    );

  6. __include_once( "Common.lua"    );

  7.  

  8.  

  9.  

  10. PMessageBoxA = GetFunctionAddress( "User32.dll" , "MessageBoxA" );

  11.  

  12. TMessageBoxA = __type( "TMessageBoxA = function( DWord , PChar , PChar , DWord ): Int; stdcall;" );

  13.  

  14. MessageBoxA = __create( TMessageBoxA , PMessageBoxA );

  15.  

  16. MessageBoxA( 0 , "Test Msg" , "Test Caption" , 0 );

  17.  
[/pawn]
Аватара пользователя
0STROG
 
Сообщения: 94
Зарегистрирован: 15 апр 2014, 22:33
Благодарил (а): 10 раз.
Поблагодарили: 23 раз.
Языки программирования: Counter-Strike 1.6

Re: Уневерсальный LuaMod

Сообщение oplya » 18 июн 2014, 23:22

0STROG писал(а):Up! Добавил мини detours, а также пример с 2-м потоком .
Вы должны зарегистрироваться, чтобы видеть ссылки.

Добавлено спустя 1 минуту 11 секунд:
seregaiv1999 писал(а):У меня не работает.Тестил на Дота 2

хм..
Чем ты инжектил?
Как ты понял что не работает?
Сделай тест с выводм в MessageBox

Добавлено спустя 12 минут 16 секунд:
Вот с этим примером попробуй.. должна мессага появиться
[pawn]
  1.  

  2.  

  3. __include_once( "InitMem.lua"                   );

  4. __include_once( "Example_miniHLSDK.lua" );

  5. __include_once( "Example_WinAPI.lua"    );

  6. __include_once( "Common.lua"    );

  7.  

  8.  

  9.  

  10. PMessageBoxA = GetFunctionAddress( "User32.dll" , "MessageBoxA" );

  11.  

  12. TMessageBoxA = __type( "TMessageBoxA = function( DWord , PChar , PChar , DWord ): Int; stdcall;" );

  13.  

  14. MessageBoxA = __create( TMessageBoxA , PMessageBoxA );

  15.  

  16. MessageBoxA( 0 , "Test Msg" , "Test Caption" , 0 );

  17.  
[/pawn]

Похоже он надеялся на самонаводящийся хук пуджа :-D
Аватара пользователя
oplya
 
Сообщения: 35
Зарегистрирован: 12 сен 2013, 17:06
Благодарил (а): 40 раз.
Поблагодарили: 6 раз.
Языки программирования: Тетрис


Вернуться в Добавленные новые плагины

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2