扫雷"高等"场是指
下面是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扫雷外挂基本篇的内容,更多相关内容请关注ki4网(www.ki4.cn)!