const PCHAR gameCaption=
"SomeApp"
;
//mov
eax, eax
//mov
eax,eax
char shellcode[] = {0x8B,0xC0,0x8B,0xC0};
BOOL TestFunc()
{
int iCount = 1024;
DWORD dwNumberOfBytes = 0;
DWORD dwProcessID = 0;
LPVOID mFunc = CallSelectMonster;
BOOL fOk = FALSE;
HANDLE hProcess = NULL;
HANDLE hThread = NULL;
LPVOID ThreadAddr = NULL;
__try
{
HWND hGame = ::FindWindowA(NULL, gameCaption);
::GetWindowThreadProcessId(hGame, &dwProcessID);
hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
if
(hProcess == NULL)
__leave;
MEMORY_BASIC_INFORMATION mbi = {0};
if
(!::VirtualQueryEx(hProcess, (LPVOID)0x0041324A, &mbi, sizeof(mbi)) == sizeof(mbi))
{
DWORD dwError = ::GetLastError();
__leave;
}
//
这里看下内存的属性,如果是已提交的,就修改保护属性,否则还得在分配,保留,提交...
if
(mbi.State == MEM_COMMIT)
{
DWORD dwOldProtect = 0;
if
(!::VirtualProtectEx(hProcess, (LPVOID)0x0041324A, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &dwOldProtect))
{
DWORD dwError = ::GetLastError();
__leave;
}
}
else
{
ThreadAddr = ::VirtualAllocEx(hProcess, (LPVOID)0x0041324A, iCount, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if
(ThreadAddr == NULL)
{
//
如果分配失败了,那么由操作系统自己找内存,在来一次
DWORD i = ::GetLastError();
ThreadAddr = VirtualAllocEx(hProcess, NULL, iCount, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if
(ThreadAddr == NULL)
{
printf
(
"error of virtualallocex: %d"
,::GetLastError());
__leave;
}
}
}
BOOL bWrite = ::WriteProcessMemory(hProcess, (LPVOID)0x0041324A, shellcode, sizeof(shellcode), &dwNumberOfBytes);
if
(!bWrite)
{
printf
(
"error of writeprocessmemory: %d"
,::GetLastError());
__leave;
}
//hThread
= ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)ThreadAddr, NULL, 0, 0);
//if
(hThread == NULL)
//
{
//
printf
(
"error of createremotethread: %d"
, ::GetLastError());
//
__leave;
//
}
//
::WaitForSingleObject(hThread, INFINITE);
fOk = TRUE;
//
到了这里,everything is ok...
}
__finally
{
if
(hProcess != NULL)
{
::CloseHandle(hProcess);
}
}
return
fOk;
}
int main()
{
if
(TestFunc())
printf
(
"ok!"
);
else
printf
(
"failed!"
);
getchar();
return
0;
}