C++扫雷外挂编写

霍霍 这次要实战搞一个外挂出来了  打算先从单机入手 

比如 扫雷 植物大战僵尸 等等~~~ 但是这个只是 一个非常简单的入门 

本来扫雷我也不是很想搞 但是  但是要实战 没办法 只能这样来了 

扫雷 这里 先分析雷是怎么来的 玩过的都知道 他这个并不是每局都是一样的位置  那么 我们可以 从随机这里下手 断点rand

然后可以分析

C++扫雷外挂编写_第1张图片

0F  8F 
0F^80=8F
8F^80=0F

压入9->rand(9)%9 esi 为种子保存的值+1->rand(9)%9  ecx  种子的值+1->  
->比较【eax+ecx+1005340】是否为0x8f  1->重复上面的操作
                                                                    0->然后异或0x80 变成0x8f

然后在函数里面 还有 

C++扫雷外挂编写_第2张图片

然后再往下的话  可以在主函数 断下消息鼠标事件 如下面 

C++扫雷外挂编写_第3张图片

然后 我们往下分析  

我们直接断下我们内存 内存断点 (我们的地图 ) 然后 往下走 发现了 

C++扫雷外挂编写_第4张图片

 

本来我还没有怀疑这个地方   当我看到

C++扫雷外挂编写_第5张图片

然后感觉还是仔细走了几遍   发现了 这个

C++扫雷外挂编写_第6张图片  

此时push的edi  esi 就是我们的 坐标点  那么  这个call 就很值得怀疑 

C++扫雷外挂编写_第7张图片

然后我们发现这里就是判断是不是炸弹的地方了~~~~~

我们其实就可以写外挂了

这个程序没有什么壳 驱动的保护 所以我们就可以简单的功能  入手点很多 

比如 我们可以读取的内存   可以把我们 雷的点都搞出来

分析出来入手点真的是太多了 就看根据需求写出什么东西了

写外挂的前提== 我们已经知道 数组的基址是  address=0x1005340;

但是1 1对应的是address=0x1005361    因为 0x1005340+1*0x20+1=0x1005361 如果这样能确定的话 

那么问题就很好解决了

 

我的是模拟点击事件   首先获得句柄

    gameh=FindWindow(NULL,"扫雷");
    GetWindowThreadProcessId(gameh, &gameProcessId);
    gameProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, gameProcessId);

 

然后 

DWORD addr=0x1005361;			//雷区基址
DWORD width=0x10056A8;	        //雷区宽度地址
DWORD high= 0x10056AC;			//雷区高度地址
HWND gameh=NULL;
DWORD gameProcessId=-1;
HANDLE gameProcess=NULL;
POINT p;
RECT r1;
    ReadProcessMemory(gameProcess, (LPCVOID)width, &nx, 1, NULL);    //获取横向方格长度
    ReadProcessMemory(gameProcess, (LPCVOID)high, &ny, 1, NULL);    //获取纵向方格长度
    SetCursorPos(22 + r1.left, 115 + r1.top);		//选定窗口,22和115是第一个雷块中心点的x,y坐标
    for(int i = 0; i < nx * 32; i += 32)
    {
        for(int j = 0; j < ny; j++)
       ReadProcessMemory(gameProcess, (LPCVOID)(addr + i + j), &b, 1, NULL);



       SetCursorPos(22+j*16+r1.left,115+i/32*16+r1.top);
        mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
        mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0); 

就算模拟完成了   唯一的缺点就是 因为是模拟点击 所以 我们的程序不能隐藏。。

程序打包放在百度云盘了

链接:https://pan.baidu.com/s/1bhHiP9aBXxq8ERoJOZLy9w 
提取码:t57i 

你可能感兴趣的:(逆向之旅)