在玩game 時, 補血, 補時間, 補寶物, 補人數. 如何做到.
如果我們可以知道存放在記憶的位置, 又有一權限可以修改記憶體. 這樣就可以永久保持人數不往下掉.
必要的步驟如下,
一. 知道要修改的 PID
a. 如果你知道 window Handle hWnd,
DWORD proccess_ID;
GetWindowThreadProcessId(hWnd, &proccess_ID);
b. 不如果不知道, 可使用 function FindWindow( ) 拿回 hWnd,
MFC 可使用 this->m_hWnd;
二. OpenProcess() with desired access right
a. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID);
b. 或使用工具 processExplorer, process viewer 等可以查到 ProcessID, 再放到 OpenProcess 中.
三. ReadProcessMemory( ) / WriteProcessMemory( )
char string[4096];
int a = (int)GetClipboardData; //此例可以拿回GetClipboardData() function 的ASM 前4個BYTE
ReadProcessMemory(
hProcess,
(LPVOID)a, // 可改回你在process 中要讀取的 address.
string,
4,
&ss);
四. 關閉 process handle
CloseHandle(hProcess);
也要印出 ss, 是否 READ/WRITE 是否有成功, ss 是傳回 多少Bytes 有讀寫成功.
五. 完整function
主程式中找個地方call 以下Function.
void ProcessReadWriteTEST(HWND hWnd) // 可以傳入其他window 的handle , 就可以寫到其他程式的記憶體.
{
TCHAR strX[1000];
DWORD proccess_ID;
GetWindowThreadProcessId(hWnd, &proccess_ID);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID);
if (!hProcess)
{
//FAIL to open process;
}
else
{
SIZE_T ss;
char dddd[5] = { 0x8b,0xff,0x55,0x8b,0xec };
char str[4096];
int a = (int)GetClipboardData;
ReadProcessMemory(
hProcess,
(LPVOID)a,
str,
4,
&ss);
char bb[100];
sprintf(bb, "%2x %2x %2x %2x %2x", str[0] & 0xff, str[1] & 0xff, str[2] & 0xff, str[3] & 0xff, str[4] & 0xff);
strncpy(str, (char*)bb, 20);
str[100] = 0; //
swprintf(strX, 1000, L"%hs", str);
MessageBox(NULL, strX, strX, MB_OK);
char eeee[5] = { 0x11,0x22,0x33,0x44, 0 };
if (WriteProcessMemory(hProcess, (LPVOID)a, eeee, 5, &ss)) // 這例子有破壞性, 請自行找另一個地方寫入做測試.
;
CloseHandle(hProcess);
}
}
如果MEMORY 有被Process 保護, 不能READ/WRITE. 這樣這支function 就不會成功.