Sirioga
16.02.2010, 12:10
Injection Codes - Delphi/C++/AutoIt
Все адреса в функциях устарели!
Оригинал на elitepvpers ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
По скольку большенство умных сдесь людей несколько эгоистичны, я решил написать свой гайд и поделится им с форумом!
Ну начнем, во перых Injecting это лучший способ написания своего бота или чего нибудь другого, а во вторых, давайте перестанем быть нубами и просто менять адреса, давайте играть жестко!
Вся информация здесь основана на Perfect World International
Для начала:
Давайте разберёмся кое в чем. Все люди здесь говорят о изменении адресов, офсетах и указателях...Вы понимаете о чем я говорю? (идите в google и поищите парочку гайдов)
Я нашел 4 типа адресов:
1. Базовый адрес (0x0096d1dc)
--> Базовый адрес в Wikipedia ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) (EN)
--> Мы начнём отсюда. Все Inject функции нужно начинать с указателя от правильного адреса!
--> Используйте гайд как найти базовый адрес...Когда вы нашли базовый адрес, вычтите 0x1C и выполните еще один поиск в Hex значении для того что бы узнать РЕАЛЬНЫЙ базовый адрес.
--> Все Inject функции начинаются отсюда. Попробуйте найти ассемблерный код [0096d1dc] в отладчике Cheat Engine ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) и вы будите иметь все возможные адреса для Injecting`а
2. Динамический адрес (0x0096d1dc + 0x1C -> указывает на 0x0096d87c)
--> Это адрес начала блока игровой сесии, называется по ошибке большинством как тот самый base address. Используется для ботов таких как MHS.
--> Its the Load-in-Time allocator... in other words, its a memory redirector.
3. Окружающая среда Адреса (0x0096d87c + 0x8 -> указывает на динамический адрес)
--> Указатель, который выделяет динамической адресации для петель и охраняемые блоки.
4. Роль Адреса (0x0096d87c + 0x20 -> указывает на динамический адрес)
--> Указатель, который выделяет динамический адрес как глобальные переменные, константы и типы.
Разъяснение:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Функции для Injecting`а
Delphi: (by asgborges)
procedure InjectFunc(ProcessID: Cardinal; Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
// ---- Write function address
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Address to write parameters
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Create a remote thread
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Thread to wait for the end of
WaitForSingleObject(hThread, 3000);
GetExitCodeThread(hThread,lpExitCode);
TerminateThread(hThread,lpExitCode);
VirtualFreeEx(ProcessID,ThreadAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,ParamAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,Func,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,aParams,0,MEM_RELEASE);
CloseHandle(hThread);
end
end;
C++ Builder: (найдено в инете)
#include <tlhelp32.h>
...
typedef tagPROCESSENTRY32W pGameProcess;
...
bool CallRemoteFunction(pGameProcess pProcess)
{
//Remote Thread Handle
HANDLE hProcess=NULL;
//Inject Thread handle
HANDLE hThread=NULL;
//Inject Fuction Address after allocate
LPVOID ThreadCodeAddr=NULL;
//Inject Function
LPVOID Func=SelectMonster;
//Inject Fuction Stack Address after allocate
LPVOID ThreadDataAddr=NULL;
//Inject Fuction Stack Data
LPCVOID lpParam = NULL;
DWORD Value = 0;
lpParam = &Value;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pProcess.th32ProcessID);
if (!hProcess)
{
//Do your Error message (OpenProcess);
return false;
}
ThreadCodeAddr=VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
ThreadDataAddr=VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory (hProcess, ThreadCodeAddr, Func, 4096, NULL);
WriteProcessMemory (hProcess, ThreadDataAddr, lpParam, 256, NULL);
hThread = CreateRemoteThread(hProcess, NULL, NULL,(LPTHREAD_START_ROUTINE)ThreadCodeAddr, ThreadDataAddr, NULL, NULL);
if (!hThread)
{
//Do your Error message (CreateRemoteThread);
}
else
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess, ThreadCodeAddr, 4096, MEM_RELEASE);
VirtualFreeEx(hProcess, ThreadDataAddr, 256, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
AutoIt (нет библиотеки с опкодами)
Func INJECTCODE($PID)
If $PID <> 0 And $OPCODE <> "" Then
Local $DATA = DllStructCreate("byte[" & StringLen($OPCODE) / 2 & "]")
For $I = 1 To DllStructGetSize($DATA)
DllStructSetData($DATA, 1, Dec(StringMid($OPCODE, ($I - 1) * 2 + 1, 2)), $I)
Next
Local $RESULT, $PROCESS, $ADD, $THREAD
$RESULT = DllCall("Kernel32.Dll", "int", "OpenProcess", "int", 2035711, "int", 0, "int", $PID)
$PROCESS = $RESULT[0]
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "int", $PROCESS, "ptr", 0, "int", DllStructGetSize($DATA), "int", 4096, "int", 64)
$ADD = $RESULT[0]
$RESULT = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $PROCESS, "ptr", $ADD, "ptr", DllStructGetPtr($DATA), "int", DllStructGetSize($DATA), "int", 0)
$RESULT = DllCall("kernel32.dll", "int", "CreateRemoteThread", "int", $PROCESS, "ptr", 0, "int", 0, "int", $ADD, "ptr", 0, "int", 0, "int", 0)
$THREAD = $RESULT[0]
Do
$RESULT = DllCall("kernel32.dll", "int", "WaitForSingleObject", "int", $THREAD, "int", 50)
Until $RESULT[0] <> 258
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $THREAD)
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualFreeEx", "hwnd", $PROCESS, "ptr", DllStructGetPtr($DATA), "int", DllStructGetSize($DATA), "int", 32768)
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $PROCESS)
$OPCODE = ""
$DATA = 0
EndIf
EndFunc
Примеры Injecting`а
Delphi: (by asgborges)
//************************************************** ***********//
// Select the Moster (Full Target HP)
// OBS: Working well
//************************************************** ***********//
procedure SelectMonster(MonID: PParams); stdcall;
(*
004596AD - a1 dc d1 96 00 - mov eax,[0096d1dc] : 0096D860
004596B2 - 57 - push edi
004596B3 - 8b 48 20 - mov ecx,[eax+20]
004596B6 - 81 c1 ec 00 00 00 - add ecx,000000ec
004596BC - e8 8f c7 14 00 - call 005a5e50
*)
var
P1: DWORD;
begin
P1:=MonID^.Param1;
asm
mov edx, DWORD PTR [$0096d1dc]
push P1
mov ecx, DWORD PTR [edx+$20]
add ecx, $EC
mov edx, $005a5e50
call edx
end;
end;
//************************************************** ***********//
// Fly command
// OBS: Working well
//************************************************** ***********
procedure Fly(aPParams: PParams); stdcall;
(*
0044A926 - 8b 15 dc d1 96 00 - mov edx,[0096d1dc] : 0096D860
0044A92C - 6a 01 - push 01
0044A92E - 51 - push ecx
0044A92F - 8b 4a 20 - mov ecx,[edx+20]
0044A932 - 6a 0c - push 0c
0044A934 - 6a 01 - push 01
0044A936 - 81 c1 ec 00 00 00 - add ecx,000000ec
0044A93C - e8 bf b2 15 00 - call 005a5c00
*)
begin
asm
mov edx, DWORD PTR [$0096d1dc]
push $01
push $31f7
mov ecx, DWORD PTR [edx+$20]
push $0C
push $01
add ecx, $EC
mov edx, $005a5c00
call edx
end;
end;
//************************************************** ***********//
// Pick Items on ground
// OBS: Working... need to stay close of the Item
//************************************************** ***********//
procedure PickItem(aPParams: PParams); stdcall;
(*
00467693 - 8b 15 dc d1 96 00 - mov edx,[0096d1dc] : 0096D860
00467699 - 50 - push eax
0046769A - 51 - push ecx
0046769B - 8b 4a 20 - mov ecx,[edx+20]
0046769E - 81 c1 ec 00 00 00 - add ecx,000000ec
004676A4 - e8 37 e7 13 00 - call 005a5de0
*)
var
Address: pointer;
Pa1,pa2: cardinal;
begin
Pa1:=aPParams^.Param1;
pa2:=aPParams^.Param2;
asm
mov edx, DWORD PTR [$0096d1dc]
push Pa1 // Item SN
push Pa2 // Item ID
mov ecx, DWORD PTR [edx+$20]
add ecx, $EC
mov edx, $005a5de0
call edx
end;
end;
C++ Builder: (adapted to work with PWI)
static DWORD WINAPI SelectMonster(LPCVOID lpParam)
{
//004596AD - a1 dc d1 96 00 - mov eax,[0096d1dc] : 0096D860
//004596B2 - 57 - push edi
//004596B3 - 8b 48 20 - mov ecx,[eax+20]
//004596B6 - 81 c1 ec 00 00 00 - add ecx,000000ec
//004596BC - e8 8f c7 14 00 - call 005a5e50
DWORD BaseAddress= 0x0096d1dc;
DWORD CallAddress= 0x005a5e50;
DWORD MonsterID = (DWORD)lpParam;
__try
{
_asm
{
mov edx, DWORD PTR [BaseAddress]
push MonsterID
mov ecx, DWORD PTR [edx+0x20]
add ecx, 0xEC
mov edx, CallAddress
call edx
}
}
__except(1)
{
}
return 0;
}
AutoIt (Неверное так как "шприц" указан не полностью)
Func SETCURENTMOBID($ID)
_MEMORYWRITE($MOB_ID_ADD, $MEMID, $ID)
If $ID <> 0 Then
$OPCODE = ""
PUSHAD()
MOV_EDX_DWORD_PTR(9875524)
PUSH($ID)
MOV_ECX_DWORD_PTR_EAX_ADD(32)
$OPCODE &= "81c1ec000000"
MOV_EDX(5916464)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PID)
EndIf
EndFunc
________________
Переведено для Zhyk.Ru, по возможности будет исправлятся и дополнятся.
Кооректоры: TBX1n ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Все адреса в функциях устарели!
Оригинал на elitepvpers ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
По скольку большенство умных сдесь людей несколько эгоистичны, я решил написать свой гайд и поделится им с форумом!
Ну начнем, во перых Injecting это лучший способ написания своего бота или чего нибудь другого, а во вторых, давайте перестанем быть нубами и просто менять адреса, давайте играть жестко!
Вся информация здесь основана на Perfect World International
Для начала:
Давайте разберёмся кое в чем. Все люди здесь говорят о изменении адресов, офсетах и указателях...Вы понимаете о чем я говорю? (идите в google и поищите парочку гайдов)
Я нашел 4 типа адресов:
1. Базовый адрес (0x0096d1dc)
--> Базовый адрес в Wikipedia ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) (EN)
--> Мы начнём отсюда. Все Inject функции нужно начинать с указателя от правильного адреса!
--> Используйте гайд как найти базовый адрес...Когда вы нашли базовый адрес, вычтите 0x1C и выполните еще один поиск в Hex значении для того что бы узнать РЕАЛЬНЫЙ базовый адрес.
--> Все Inject функции начинаются отсюда. Попробуйте найти ассемблерный код [0096d1dc] в отладчике Cheat Engine ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) и вы будите иметь все возможные адреса для Injecting`а
2. Динамический адрес (0x0096d1dc + 0x1C -> указывает на 0x0096d87c)
--> Это адрес начала блока игровой сесии, называется по ошибке большинством как тот самый base address. Используется для ботов таких как MHS.
--> Its the Load-in-Time allocator... in other words, its a memory redirector.
3. Окружающая среда Адреса (0x0096d87c + 0x8 -> указывает на динамический адрес)
--> Указатель, который выделяет динамической адресации для петель и охраняемые блоки.
4. Роль Адреса (0x0096d87c + 0x20 -> указывает на динамический адрес)
--> Указатель, который выделяет динамический адрес как глобальные переменные, константы и типы.
Разъяснение:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Функции для Injecting`а
Delphi: (by asgborges)
procedure InjectFunc(ProcessID: Cardinal; Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
// ---- Write function address
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Address to write parameters
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Create a remote thread
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Thread to wait for the end of
WaitForSingleObject(hThread, 3000);
GetExitCodeThread(hThread,lpExitCode);
TerminateThread(hThread,lpExitCode);
VirtualFreeEx(ProcessID,ThreadAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,ParamAddr,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,Func,0,MEM_RELEASE);
VirtualFreeEx(ProcessID,aParams,0,MEM_RELEASE);
CloseHandle(hThread);
end
end;
C++ Builder: (найдено в инете)
#include <tlhelp32.h>
...
typedef tagPROCESSENTRY32W pGameProcess;
...
bool CallRemoteFunction(pGameProcess pProcess)
{
//Remote Thread Handle
HANDLE hProcess=NULL;
//Inject Thread handle
HANDLE hThread=NULL;
//Inject Fuction Address after allocate
LPVOID ThreadCodeAddr=NULL;
//Inject Function
LPVOID Func=SelectMonster;
//Inject Fuction Stack Address after allocate
LPVOID ThreadDataAddr=NULL;
//Inject Fuction Stack Data
LPCVOID lpParam = NULL;
DWORD Value = 0;
lpParam = &Value;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pProcess.th32ProcessID);
if (!hProcess)
{
//Do your Error message (OpenProcess);
return false;
}
ThreadCodeAddr=VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
ThreadDataAddr=VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory (hProcess, ThreadCodeAddr, Func, 4096, NULL);
WriteProcessMemory (hProcess, ThreadDataAddr, lpParam, 256, NULL);
hThread = CreateRemoteThread(hProcess, NULL, NULL,(LPTHREAD_START_ROUTINE)ThreadCodeAddr, ThreadDataAddr, NULL, NULL);
if (!hThread)
{
//Do your Error message (CreateRemoteThread);
}
else
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess, ThreadCodeAddr, 4096, MEM_RELEASE);
VirtualFreeEx(hProcess, ThreadDataAddr, 256, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
AutoIt (нет библиотеки с опкодами)
Func INJECTCODE($PID)
If $PID <> 0 And $OPCODE <> "" Then
Local $DATA = DllStructCreate("byte[" & StringLen($OPCODE) / 2 & "]")
For $I = 1 To DllStructGetSize($DATA)
DllStructSetData($DATA, 1, Dec(StringMid($OPCODE, ($I - 1) * 2 + 1, 2)), $I)
Next
Local $RESULT, $PROCESS, $ADD, $THREAD
$RESULT = DllCall("Kernel32.Dll", "int", "OpenProcess", "int", 2035711, "int", 0, "int", $PID)
$PROCESS = $RESULT[0]
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "int", $PROCESS, "ptr", 0, "int", DllStructGetSize($DATA), "int", 4096, "int", 64)
$ADD = $RESULT[0]
$RESULT = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $PROCESS, "ptr", $ADD, "ptr", DllStructGetPtr($DATA), "int", DllStructGetSize($DATA), "int", 0)
$RESULT = DllCall("kernel32.dll", "int", "CreateRemoteThread", "int", $PROCESS, "ptr", 0, "int", 0, "int", $ADD, "ptr", 0, "int", 0, "int", 0)
$THREAD = $RESULT[0]
Do
$RESULT = DllCall("kernel32.dll", "int", "WaitForSingleObject", "int", $THREAD, "int", 50)
Until $RESULT[0] <> 258
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $THREAD)
$RESULT = DllCall("Kernel32.dll", "ptr", "VirtualFreeEx", "hwnd", $PROCESS, "ptr", DllStructGetPtr($DATA), "int", DllStructGetSize($DATA), "int", 32768)
DllCall("Kernel32.dll", "int", "CloseHandle", "int", $PROCESS)
$OPCODE = ""
$DATA = 0
EndIf
EndFunc
Примеры Injecting`а
Delphi: (by asgborges)
//************************************************** ***********//
// Select the Moster (Full Target HP)
// OBS: Working well
//************************************************** ***********//
procedure SelectMonster(MonID: PParams); stdcall;
(*
004596AD - a1 dc d1 96 00 - mov eax,[0096d1dc] : 0096D860
004596B2 - 57 - push edi
004596B3 - 8b 48 20 - mov ecx,[eax+20]
004596B6 - 81 c1 ec 00 00 00 - add ecx,000000ec
004596BC - e8 8f c7 14 00 - call 005a5e50
*)
var
P1: DWORD;
begin
P1:=MonID^.Param1;
asm
mov edx, DWORD PTR [$0096d1dc]
push P1
mov ecx, DWORD PTR [edx+$20]
add ecx, $EC
mov edx, $005a5e50
call edx
end;
end;
//************************************************** ***********//
// Fly command
// OBS: Working well
//************************************************** ***********
procedure Fly(aPParams: PParams); stdcall;
(*
0044A926 - 8b 15 dc d1 96 00 - mov edx,[0096d1dc] : 0096D860
0044A92C - 6a 01 - push 01
0044A92E - 51 - push ecx
0044A92F - 8b 4a 20 - mov ecx,[edx+20]
0044A932 - 6a 0c - push 0c
0044A934 - 6a 01 - push 01
0044A936 - 81 c1 ec 00 00 00 - add ecx,000000ec
0044A93C - e8 bf b2 15 00 - call 005a5c00
*)
begin
asm
mov edx, DWORD PTR [$0096d1dc]
push $01
push $31f7
mov ecx, DWORD PTR [edx+$20]
push $0C
push $01
add ecx, $EC
mov edx, $005a5c00
call edx
end;
end;
//************************************************** ***********//
// Pick Items on ground
// OBS: Working... need to stay close of the Item
//************************************************** ***********//
procedure PickItem(aPParams: PParams); stdcall;
(*
00467693 - 8b 15 dc d1 96 00 - mov edx,[0096d1dc] : 0096D860
00467699 - 50 - push eax
0046769A - 51 - push ecx
0046769B - 8b 4a 20 - mov ecx,[edx+20]
0046769E - 81 c1 ec 00 00 00 - add ecx,000000ec
004676A4 - e8 37 e7 13 00 - call 005a5de0
*)
var
Address: pointer;
Pa1,pa2: cardinal;
begin
Pa1:=aPParams^.Param1;
pa2:=aPParams^.Param2;
asm
mov edx, DWORD PTR [$0096d1dc]
push Pa1 // Item SN
push Pa2 // Item ID
mov ecx, DWORD PTR [edx+$20]
add ecx, $EC
mov edx, $005a5de0
call edx
end;
end;
C++ Builder: (adapted to work with PWI)
static DWORD WINAPI SelectMonster(LPCVOID lpParam)
{
//004596AD - a1 dc d1 96 00 - mov eax,[0096d1dc] : 0096D860
//004596B2 - 57 - push edi
//004596B3 - 8b 48 20 - mov ecx,[eax+20]
//004596B6 - 81 c1 ec 00 00 00 - add ecx,000000ec
//004596BC - e8 8f c7 14 00 - call 005a5e50
DWORD BaseAddress= 0x0096d1dc;
DWORD CallAddress= 0x005a5e50;
DWORD MonsterID = (DWORD)lpParam;
__try
{
_asm
{
mov edx, DWORD PTR [BaseAddress]
push MonsterID
mov ecx, DWORD PTR [edx+0x20]
add ecx, 0xEC
mov edx, CallAddress
call edx
}
}
__except(1)
{
}
return 0;
}
AutoIt (Неверное так как "шприц" указан не полностью)
Func SETCURENTMOBID($ID)
_MEMORYWRITE($MOB_ID_ADD, $MEMID, $ID)
If $ID <> 0 Then
$OPCODE = ""
PUSHAD()
MOV_EDX_DWORD_PTR(9875524)
PUSH($ID)
MOV_ECX_DWORD_PTR_EAX_ADD(32)
$OPCODE &= "81c1ec000000"
MOV_EDX(5916464)
CALL_EDX()
POPAD()
RET()
INJECTCODE($PID)
EndIf
EndFunc
________________
Переведено для Zhyk.Ru, по возможности будет исправлятся и дополнятся.
Кооректоры: TBX1n ([Ссылки могут видеть только зарегистрированные и активированные пользователи])