欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

C/C++之win98扫雷外挂基础篇

程序员文章站 2022-06-07 17:29:54
...
本次以win98扫雷"高级"场为例子的基础篇代码,稍后会写出所有场通用篇

扫雷"高级"场是指

C/C++之win98扫雷外挂基础篇

下面是OD和win98扫雷下载

链接:http://pan.baidu.com/s/1gfA10K7 密码:eiqp


下面开始演示本次实验:

1.打开OD后,把winmine.exe拖入OD

2.在WM_LBUTTONUP上设置断点

3.然后单步步过到此位置

C/C++之win98扫雷外挂基础篇

在注释为消息处理(地址为01001FE1)跟随

4.跟随后我们在此处可以找到棋盘数据

C/C++之win98扫雷外挂基础篇

提取当前位置的数据如下:

C/C++之win98扫雷外挂基础篇

我们就知道地址010055330前双字为0x63(十进制为99)这表示雷数,后面双字分别是宽度和高度,0x10表示棋盘的边,0x8F表示雷

所以我们只要检索此段内存0x8F,并且把他改成0x8E(标志为红旗),就成功了

如下所示

C/C++之win98扫雷外挂基础篇

下面是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扫雷外挂基础篇的内容,更多相关内容请关注PHP中文网(www.php.cn)!