- 1,214
- 1,043
Ahk2Dll
Компилятор AHK в DLL.
И можно инжектнуть ахк скрипт в любой процесс.
Для GTA SA, можно поменять расширение на .asi и закинуть в папку с игрой.
Скачать можно во вложении.
Нововведения:
AHK Injector
Пример кода для инжекта dll в процесс:
Компилятор AHK в DLL.
И можно инжектнуть ахк скрипт в любой процесс.
Для GTA SA, можно поменять расширение на .asi и закинуть в папку с игрой.
Скачать можно во вложении.
Нововведения:
- Функция reload не действует в DLL, из-за проблем с очисткой памяти и GUI.
- Функция ExitApp в DLL переделана под закрытие потока, а не процесса.
- Добавлена встроенная переменная A_IsDll, содержит 1 (true) если код исполняется в dll'ке, и 0 (false) в противоположном случае.
- Для DLL добавлены переменные A_DllName, A_DllDir, A_DllPath (Аналог A_ScriptName, A_ScriptDir, A_ScriptFullPath), так как переменные по типу A_ScriptName и т.п содержат название процесса в который инжекнута DLL.
AHK Injector
Пример кода для инжекта dll в процесс:
AutoHotKey:
Process, Exist, gta_sa.exe
PID := ErrorLevel
if (PID != 0)
InjectDll(PID, A_WorkingDir "\AHK.dll")
InjectDll(PID, DllPath)
{
static PROCESS_ALL_ACCESS := 0xFFFFF
, MEM_COMMIT := 0x00001000
, MEM_RESERVE := 0x00002000
, PAGE_READWRITE := 0x04
Size := VarSetCapacity(DllFile, StrLen(DllPath))
StrPut(DllPath, &DllFile)
; Получаем доступ к процессу.
if (!pHandle := DllCall("OpenProcess", "UInt", PROCESS_ALL_ACCESS, "Int", FALSE, "UInt", PID))
goto Error
; Ищем kernel32.dll.
if (!pModule := DllCall("GetModuleHandle", "Str", "kernel32.dll"))
goto Error
; Ищем LoadLibrary (Суффикс A означает что работаем в ANSI, один байт на символ).
if (!pFunc := DllCall("GetProcAddress", "Ptr", pModule, "AStr", "LoadLibraryA"))
goto Error
; Выделяем память под аргумент LoadLibrary, а именно - строку с адресом инъектируемой DLL.
if (!pLibrary := DllCall("VirtualAllocEx", "Ptr", pHandle, "Ptr", NULL, "Ptr", Size, "UInt", MEM_RESERVE | MEM_COMMIT, "UInt", PAGE_READWRITE))
goto Error
; Пишем байты по указанному адресу.
if (!pWrite := DllCall("WriteProcessMemory", "Ptr", pHandle, "Ptr", pLibrary, "Ptr", &DllFile, "Ptr", Size, "Ptr", NULL))
goto Error
; Создаем поток, передаем адрес LoadLibrary и адрес ее аргумента.
if (!hThread := DllCall("CreateRemoteThread", "Ptr", pHandle, "UIntP", NULL, "UInt", NULL, "Ptr", pFunc, "Ptr", pLibrary, "UInt", NULL, "UIntP", NULL))
goto Error
DllCall("CloseHandle", "UInt", pHandle)
return true
Error:
DllCall("CloseHandle", "UInt", pHandle)
return false
}
Вложения
Последнее редактирование: