Господа, кто знаком С++ помогите пожалуйста.
Не могу понять почему вылетает клиент при инжекции.
Code:
static DWORD WINAPI SelectMonster(LPCVOID lpParam)
{
DWORD BaseAddress = 0x00976b1c;
DWORD CallAddress = 0x005ae040;
DWORD MonsterID = (DWORD)lpParam;
__try
{
_asm
{
mov eax, BaseAddress;
mov eax, dword ptr[eax];
mov edi, MonsterID
push edi;
mov ecx, dword ptr[eax+0x20];
add ecx, 0xEC;
mov edx, CallAddress;
call edx
}
}
__except(1)
{
}
return 0;
}
static void GiveMeNewTarget(int monID)
{
HANDLE hProcess=NULL;
HANDLE hThread=NULL;
LPVOID ThreadCodeAddr=NULL;
LPVOID Func=SelectMonster;
LPVOID ThreadDataAddr=NULL;
LPCVOID lpParam = NULL;
DWORD Value = monID;
lpParam = &Value;
HWND windowHandle =FindWindow(0, "Element Client");
DWORD dwProcessID;
::GetWindowThreadProcessId(windowHandle,&dwProcessID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
if (!hProcess)
{
//Error(_T("OpenProcess"));
return;
}
ThreadCodeAddr=VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory (hProcess, ThreadCodeAddr, Func, 4096, NULL);
ThreadDataAddr=VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory (hProcess, ThreadDataAddr, lpParam, 256, NULL);
[COLOR="Red"]hThread = CreateRemoteThread(hProcess, NULL, NULL,(LPTHREAD_START_ROUTINE)ThreadCodeAddr, ThreadDataAddr, NULL, NULL);[/COLOR]
if (!hThread)
{
//Error(_T("CreateRemoteThread"));
return;
}
else
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess, ThreadCodeAddr, 4096, MEM_RELEASE);
VirtualFreeEx(hProcess, ThreadDataAddr, 256, MEM_RELEASE);
CloseHandle(hProcess);
}
Клиент вылетает в месте выделенным красным цветом. Но самое интересное, что этот же код работает на Дельфи.
Code:
procedure SelMonCall(MonID: PParams); Stdcall;
var
Address: pointer;
P1: DWORD;
begin
Address := Pointer($005ae040);
P1 := MonID^.Param1 ;
asm
mov eax, PW_BASE_ADDRESS
mov eax, [eax]
mov edi, P1
push edi
mov ecx, DWORD PTR [eax+$20]
add ecx,$0EC
call address
end;
end;
Помогите плиз разобраться в чем загвоздка.
"dwar" предлагал записать все регистры общего назначения в стек до начала выполнения кода, а потом вернуть их значения в исходное состояние, т.е. в начале добавить pushad, а в конце popad. Это не помогло.