C/C++之win98扫雷外挂基础篇
生活随笔
收集整理的這篇文章主要介紹了
C/C++之win98扫雷外挂基础篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本次以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失敗:FALSEReadProcessMemory(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扫雷外挂基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt实现全屏下玫瑰花(含详细注释)
- 下一篇: 工科计算机考研311分今年能上吗,202