• 技术文章 >后端开发 >C#.Net教程

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

    黄舟黄舟2017-01-22 14:16:55原创1211
    本次以win98扫雷"高级"场为例子的基础篇代码,稍后会写出所有场通用篇

    扫雷"高级"场是指

    752.png

    下面是OD和win98扫雷下载

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


    下面开始演示本次实验:

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

    2.在WM_LBUTTONUP上设置断点

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

    753.png

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

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

    754.png

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

    755.png

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

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

    如下所示

    756.png

    下面是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中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇: C/C++轻松写可塞满硬盘的程序 下一篇: 最简单的模拟U盘病毒(Autorun.inf)
    PHP编程就业班

    相关文章推荐

    • 分享一道逻辑面试题,看看你能答对吗!• C++设计模式浅识装饰模式• SUNWEN教程之----C#进阶(五)• asp.net core mvc实现文件上传实例• asp.net 图片验证码的HtmlHelper

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网