霍霍 这次要实战搞一个外挂出来了 打算先从单机入手
比如 扫雷 植物大战僵尸 等等~~~ 但是这个只是 一个非常简单的入门
本来扫雷我也不是很想搞 但是 但是要实战 没办法 只能这样来了
扫雷 这里 先分析雷是怎么来的 玩过的都知道 他这个并不是每局都是一样的位置 那么 我们可以 从随机这里下手 断点rand
然后可以分析
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
然后在函数里面 还有
然后再往下的话 可以在主函数 断下消息鼠标事件 如下面
然后 我们往下分析
我们直接断下我们内存 内存断点 (我们的地图 ) 然后 往下走 发现了
本来我还没有怀疑这个地方 当我看到
然后感觉还是仔细走了几遍 发现了 这个
此时push的edi esi 就是我们的 坐标点 那么 这个call 就很值得怀疑
然后我们发现这里就是判断是不是炸弹的地方了~~~~~
我们其实就可以写外挂了
这个程序没有什么壳 驱动的保护 所以我们就可以简单的功能 入手点很多
比如 我们可以读取的内存 可以把我们 雷的点都搞出来
分析出来入手点真的是太多了 就看根据需求写出什么东西了
写外挂的前提== 我们已经知道 数组的基址是 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