扫雷群规则资讯

支付宝红包群I⑩的游戏修改小课堂2——扫雷

发布人:微信禁抢红包群赚钱吗 来源:微信抢红包群,支付宝红包群,红包群,红包扫雷群发布时间:2022-08-22 05:40:44 热度:

考完试之后过得好堕落……晚上觉得这样不行,所以咱就逆向了一下扫雷(win2000的,因为咱不喜欢win7扫雷的界面……),再写一篇文章~

这次的文章,步骤就比上一次的简单一点啦~毕竟露米娅变懒了……

如何分析扫雷?我们可以猜测,点击鼠标右键之后,程序会执行某个函数语句,使雷数减少,之后应该进行判断当前游戏是否已经获得胜利。

首先,我们用CE来找到雷数的内存地址。New Scan搜索当前雷数(初级是10)之后,随便右键一下,雷数就会减少,这时再用Next Scan搜索变化之后的雷数(图中是9),就可以轻易找到雷的地址。双击添加到下方的地址列表。

CE操作比较简单,就不多讲了~

之后,对下方的地址右键,点击Find out what writes to this address,之后继续点击右键,从而找到写这个地址的指令。

看来指令地址是0100 3871~

用OD打开扫雷,ctrl+G跳转到这个地址

执行到返回,看看是什么函数调用的

可以看到有两个CALL指令

发现可能会执行两个CALL,先F8到第一个CALL这里,按F8步过

假死的扫雷界面突然刷新了一个旗子~

我们发现已经假死(因为0D暂停了程序的运行)的扫雷界面上突然就出现了一个小旗子!

这说明,这个函数的功能是让你右键的格子变成一个小旗子……

可疑的跳转

继续F8,我们发现,这里有一个判断跳转,会跳过某个函数的调用……这怎么行呢?我们到寄存器窗口,双击Z标志位使其为1,让跳转不发生,再看看会发生什么。

双击Z后面的数字就行啦

F8继续运行之后,我们就会突然发现,扫雷的界面又有一部分刷新了!看起来,所有的雷被标出,而笑脸戴上了墨镜。我们可以猜测,这个函数就是游戏结束之后,更新界面的函数。

更新出了胜利界面的样子……

我们把跳转语句替换成nop,这样,无论如何这个函数都会被执行了。

替换成nop,消除跳转

之后,重新开始游戏,右键一下……

直接胜利……

直接就获得了胜利= =!

我们可以猜测,程序要更新界面,就需要读取扫雷的地图的值,来做对应的显示处理。设断点后F7进入这个函数,发现一大堆的CALL。没关系,重新进行一下刚才的操作(F8,看看哪个函数会让界面更新,这样就找到了一个函数。

设断点后跟入这个函数

一进入就可以看到一个二重循环,我们就可以猜测,这个二重循环就是对扫雷的地图进行遍历。

这显然是重点算法~大家分析一下吧~
01002F0F /$ A1 685A0001 mov eax, [1005A68] ; 推测EAX为地图高度 01002F14 |. 83F8 01 cmp eax, 1 01002F17 |. 7C 51 jl short 01002F6A 01002F19 |. 57 push edi 01002F1A |. 56 push esi 01002F1B |. 8B35 F8560001 mov esi, [10056F8] ; 推测ESI为地图宽度 01002F21 |. 53 push ebx 01002F22 |. BF 20570001 mov edi, 01005720 ; 推测为地图基址!!! 01002F27 |. 8BD0 mov edx, eax 01002F29 |> 6A 01 /push 1 ; 循环遍历地图 01002F2B |. 59 |pop ecx 01002F2C |. 3BF1 |cmp esi, ecx 01002F2E |. 7C 31 |jl short 01002F61 01002F30 |> 8A0439 |/mov al, [ecx+edi] ; 推测EDI为每行的首地址 01002F33 |. A8 40 ||test al, 40 01002F35 75 25 ||jnz short 01002F5C 01002F37 A8 80 ||test al, 80 01002F39 |. 8AD8 ||mov bl, al 01002F3B 74 10 ||je short 01002F4D 01002F3D |. 80E3 1F ||and bl, 1F 01002F40 |. 80FB 0E ||cmp bl, 0E 01002F43 |. 74 17 ||je short 01002F5C 01002F45 |. 24 E0 ||and al, 0E0 01002F47 |. 0A4424 10 ||or al, [esp+10] 01002F4B |. EB 0C ||jmp short 01002F59 01002F4D |> 80E3 1F ||and bl, 1F 01002F50 |. 80FB 0E ||cmp bl, 0E 01002F53 |. 75 07 ||jnz short 01002F5C 01002F55 |. 24 EB ||and al, 0EB 01002F57 |. 0C 0B ||or al, 0B 01002F59 |> 880439 ||mov [ecx+edi], al 01002F5C |> 41 ||inc ecx 01002F5D |. 3BCE ||cmp ecx, esi 01002F5F |.^ 7E CF |\jle short 01002F30 01002F61 |> 83C7 20 |add edi, 20 01002F64 |. 4A |dec edx 01002F65 |.^ 75 C2 \jnz short 01002F29 01002F67 |. 5B pop ebx 01002F68 |. 5E pop esi 01002F69 |. 5F pop edi 01002F6A |> E8 A4FAFFFF call 01002A13 01002F6F \. C2 0400 retn 4

复制出来如上~

我们可以分析出01005720为地图的基址,也可以分析出地图的宽与高。

其中,地图每行有0x20个byte(因为外层循环中EDI加上了0x20),用0x10来标志每一行的开始与结束(因为实际游戏中宽度不一定是0x1E)

我们来看看内存,如图

可以看到,每一行有0x20个byte(),用0x10标志开始与结束。对照内存与游戏之后,我们怀疑,最高位为1表示有雷。

新开一局,修改一下内存

果然,最高位为1表示有雷。

经过我的试验,低四位每个格子表示要显示的不同的图案,1~8表示数字,9表示问号,A表示雷,B表示标错了的雷,C表示踩中了的雷,D表示问号(格子是弹起的,也就是没有按下的样子),E表示旗子,F表示初始状态。

这样,咱就可以写一个扫雷辅助了~

includeincludeincludeintmain(void){HWNDhandle=FindWindow("扫雷",// pointer to class name"扫雷"// pointer to window name);if(handle==NULL)return0;DWORDpid;GetWindowThreadProcessId(handle,&pid);printf("PID: %d\n",pid);HANDLEprocess_handle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);BYTEh,w;ReadProcessMemory(process_handle,(void*)0x01005A68,&h,sizeof(h),NULL);ReadProcessMemory(process_handle,(void*)0x010056F8,&w,sizeof(w),NULL);printf("Height: %d, Width: %d\n",h,w);BYTE*buf=(BYTE*)malloc(h*0x20);ReadProcessMemory(process_handle,(void*)0x01005720,(void*)buf,h*0x20,NULL);inti,j;BYTE*line=buf;for(i=0;i<h;i++){for(j=1;j<=w;j++){if(line[j]&0x80){putchar(*);}else{putchar();}putchar();//printf("%2X ", line[j]);}line=line+0x20;putchar(\n);}getchar();return0;}

运行效果如下,会显示出雷的位置~是不是很开心呢~

... 
上一篇 : 红包群I群晖修改引导盘,虚拟光驱软件
下一篇 : 微信红包群I抖音内测“排雷小助手”视频提前审核,违规可修改
猜你喜欢的微信抢红包群,支付宝红包群,红包群,红包扫雷群