Dieses Mal verwenden wir das Feld „Erweitert“ von Win98 Minesweeper als Beispiel für den Basiscode. Später werden wir einen gemeinsamen Code für alle Felder schreiben
Das Feld „Erweitert“ Minesweeper bezieht sich auf
Das Folgende ist der OD- und Win98 Minesweeper-Download-Link
: http://pan.baidu.com/s/1gfA10K7 Passwort: eiqp
Beginnen wir mit der Demonstration dieses Experiments:
1. Ziehen Sie nach dem Öffnen von OD winmine.exe in OD
2 Haltepunkt auf WM_LBUTTONUP
3. Gehen Sie dann zu diesem Speicherort
Der Kommentar ist Nachrichtenverarbeitung (die Adresse ist 01001FE1) und folgen Sie
4. Danach sind wir hier. Die Schachbrettdaten finden Sie unter
Die Daten zum Extrahieren der aktuellen Position lauten wie folgt:
Wir kennen die ersten beiden Wörter der Adresse 010055330. Es ist 0x63 (99 in Dezimalzahl), was die Anzahl der Donner darstellt. Die folgenden Doppelwörter sind Breite und Höhe bzw. 0x10 . 0x8F steht für Donner
Wir müssen also nur diesen Speicher 0x8F abrufen und in 0x8E ändern (markiert als rote Flagge), es ist erfolgreich
wie unten gezeigt
Das Folgende ist der C/C++-Code
#include <windows.h> #include <stdio.h> int main() { HWND hWinmine = FindWindow(NULL, L"扫雷"); DWORD dwPID = 0; GetWindowThreadProcessId(hWinmine, &dwPID); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPID); //基础地址、雷数、宽度、高度 DWORD dwBaseAddr = 0x01005330; DWORD dwNum = 0, dwWidth = 0, dwHight = 0, dwSize = 0; //读取内存信息 //读进程的内存空间数据 //参数:第1个参数: HANDLE hProcess进程句柄。 //第2个参数: LPCVOID lpBaseAddress基址指针。 //第3个参数: LPVOID lpBuffer接收数据缓冲区指针。 //第4个参数: DWORD nSize接收数据缓冲区缓冲区大小。 //第5个参数: LPDWORD lpNumberOfBytesRead读入数据量大小指针。 返回值: 成功:TRUE 失败:FALSE ReadProcessMemory(hProcess, (LPVOID)dwBaseAddr, &dwNum, sizeof(DWORD), &dwSize); ReadProcessMemory(hProcess, (LPVOID)(dwBaseAddr +0x4), &dwWidth, sizeof(DWORD), &dwSize); ReadProcessMemory(hProcess, (LPVOID)(dwBaseAddr + 0x8), &dwHight, sizeof(DWORD), &dwSize); //棋盘总大小=棋盘+空白边+4角 DWORD dwReadsize = dwWidth*dwHight + dwHight * 2 + dwWidth * 2 + 4; PBYTE pByte = new BYTE[dwReadsize]; ReadProcessMemory(hProcess, (LPVOID)(dwBaseAddr + 0x16), pByte, dwReadsize, &dwSize); BYTE bClear = 0x8E; for (size_t i = 0; i < dwReadsize; i++) { if (pByte[i] == 0x8F) { WriteProcessMemory(hProcess, (LPVOID)(dwBaseAddr + 0x16 + i), &bClear, sizeof(BYTE), &dwSize); } } //函数功能: 得到窗体客户区的大小。 //第1个参数: HWND hWnd窗体句柄。 //第2个参数: LPRECT lpRect客户区RECT结构的指针。 RECT rt = { 0 }; GetClientRect(hWinmine, &rt); InvalidateRect(hWinmine, &rt, true);//这个函数屏蔽一个窗口客户区的全部或部分区域。这会导致窗口在事件期间部分重画 delete pByte; CloseHandle(hProcess); getchar(); return 0; }
oben Dies ist der Inhalt der Grundlagen des Win98-Minesweeper-Plug-Ins in C/C++. Weitere verwandte Inhalte finden Sie hier. Bitte beachten Sie die chinesische PHP-Website (m.sbmmt.com)!