本次以win98掃雷"進階"場為例子的基礎篇代碼,稍後會寫出所有場通用篇
掃雷"進階"場是指
下面是OD和win98掃雷下載
連結:http://pan.baidu.com/s/1gfA10K7 密碼:eiqp
下面開始示範本次實驗:
1.開啟OD後,把winmine.exe拖入OD
2.在WM_LBUTTONUP上設定斷點
3.然後單步步過到此位置
在注釋為訊息處理(地址為01001FE1)跟隨
4.跟隨後我們在此處可以找到棋盤資料
提取當前位置的資料如下:
我們就知道地址010055330前雙字為0x63(十進位為99)這表示雷數,後面雙字分別是寬度和高度,0x10表示棋盤的邊,0x8F表示雷
所以我們只要檢索此段記憶體0x8F,並且把他改成0x8E(標誌為紅旗),就成功了
如下所示
下面是C/C++代碼
#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; }
以上就是 C/C++之win98掃雷外掛基礎篇的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!