怎么输入“xyzzy”五个字母然后按shift键扫雷就没用了?

呵呵,下面的文字可能比较难懂。

但如果你仔细观察,你会发现用这种方式找漏洞很有意思。

调试环境:Win2000,ollidbg1.10,ExeScope。

反向原因:我有个室友很擅长扫雷游戏。业余时间,我总是得不偿失,所以我反其道而行之。

作弊热键(本文已改为菜单)功能,往往胜在_。今天什么都没有,逆食。

希望能对刚入门的新手朋友有所帮助。

反向过程:

————————————————————————————————————————

一.分析

1.搞清楚程序的进程,在消息响应过程中挂上自己的处理代码。

//使用DefWindowProcW断开连接,然后抬头看消息响应过程。

//点击菜单后,会出现下面的代码。

010019AD & gt;\8B4D 10 mov ecx,dword ptr ss:[ebp+10];单击了菜单ID。

010019B0。0FB7C1 movzx eax,cx

010019B3。3D 0B020000 cmp eax,20B

010019B8。7F 76 jg空头winmine . 01001a 30;大于0x20B就跳到后面。

010019BA。3D 09020000 cmp eax,209

010019BF。7D 2D jge short winmine 06438+00019EE

010019C1。2D FE010000子eax,1FE

010019C6。74 1C我短winmine

010019C8。eax年12月48日

010019C9。eax年12月48日

010019CA。0f 85 7c 030000 jnz winmine . 01001D4C

010019D0。33FF异或edi,EDI;开关010019B3的外壳200

010019D2。57推edi/show state = & gt;隐藏软件

010019D3。FF35 A8520001推送dword ptr ds:[10052 A8];|hWnd = NULL

010019D9。FF15 EC100001呼叫dword ptr ds:[& lt;& amp用户32。ShowWi & gt;\显示窗口

010019DF。e9 a 2000000 jmp winmine . 01001A86

010019E4 >E8 26190000致电winmine . 0100330 f;开关010019B3的外壳1FE

010019E9。e9 5e 030000 jmp winmine . 01001D4C

010019EE & gt;8D81 F7FDFFFF lea eax,dword ptr ds:[ecx-209];开关010019B3的外壳209、20A、20B

010019F4。66:A3 C0520001 mov字ptr ds:[10052C0],ax

010019FA。0FB7C0 movzx eax,ax

010019FD。8D0440 lea eax,dword ptr ds:[eax+eax*2]

01001A00。C1E0 02 shl eax,2

01001A03。8B88 28500001 mov ecx,dword ptr ds:[eax+100502 & gt;

01001A09。890d c 4520001 mov dword ptr ds:[10052 C4],ecx

01001A0F。8B88 2C500001 mov ecx,dword ptr ds:[eax+100502 & gt;

01001A15。8B80 30500001 mov eax,dword ptr ds:[eax+100503 & gt;

01001A1B。890d c 8520001 mov dword ptr ds:[10052 c8],ecx

01001A21。a3 cc 520001 mov dword ptr ds:[10052 cc],eax

01001A26。E8 E4180000致电winmine 0100330 f

01001A30 & gt;\B9 4E020000 mov ecx,24E如果大于0x20B就跳到这里。

01001a 35 & gt;3BC1 cmp eax,ecx

01001A37。0F8F d 3000000 jg winmine . 01001b 10

01001A3D。0f 84 c 7000000 je winmine . 01001B0A

01001A43。2D 0C020000子eax,20C

根据上面的代码,我们可以知道只要从01001A30(其他地方也可以)跳转到我们添加的代码就可以回复消息了。

2.怎么作弊?

//要入门,点击它,转到下面的代码(第一次用PlaySoundW很容易到这里)。

01003772 |.833d f 4560001 00 CMP dword ptr ds:[10056 F4],0;//开始扫雷了吗?

01003779 |.6A 01推送1

0100377B |。5B pop ebx

0100377C |。75 4A jnz空头winmine . 010037 c8;第一次点击?

0100377E |。833d f 0560001 00 CMP dword ptr ds:[10056 f 0],0

01003785 |.75 41 jnz short winmine . 010037 c8

01003787 |.53推动ebx

01003788 |.E8 ED050000致电winmine.01003D7A

0100378D |。FF05 f 0560001 Inc dword ptr ds:[10056 f 0]

01003793 |.E8 1FF4FFFF致电winmine 01002 bb7

01003798 |.6A 00推0;/Timerproc = NULL

0100379A |。68 E8030000推3E8|Timeout = 1000。女士

0100379F |。53推ebx|时间标识

010037A0 |。891D 84510001 mov dword ptr ds:[1005184],ebx|

010037A6 |。FF35 A8520001推送dword ptr ds:[10052 A8];|hWnd = NULL

010037AC |。ff 15 6c 110001调用dword ptr ds:[& lt;& amp用户32。SetTim & gt;\设置计时间隔为1秒,在这里修改是为了骗时间。

//通过追踪,发现对应行和列对应的内存中有一个字节进行了变换,变换后值的高阶为1(0x80)。

//表示该位置是雷霆,游戏结束,如果不是雷霆,则显示该位置的编号。

01003144/$ 8b 4424 08 mov eax,dword ptr ss:[esp+8];线条

01003148 |.53推动ebx

01003149 |.55推动ebp

0100314A |。8BC8 mov ecx,eax

0100314C |。56推动esi

0100314D |。8B7424 10 mov esi,dword ptr ss:[esp+10];排

01003151 |.C1E1 05 shl ecx,5

01003154 |.F68431 00570001 80测试字节ptr ds:[ecx+esi+1005700],80;是雷吗?

0100315C |。8d 9431 00570001 lea EDX,dword ptr ds:[ecx+ESI+1005700]

01003163 |.57推动edi

01003164 |.74 6B je做空winmine . 010031d 1;不是雷,跳

01003166 |.833d f 4560001 00 CMP dword ptr ds:[10056 F4],0

0100316D |。75 55 jnz short winmine . 06438+00031 C4

0100316F |。8B2D 685A0001 mov ebp,dword ptr ds:[1005A68]

01003175 |.6A 01推送1

01003177 |.58 pop eax

01003178 |.3BE8 cmp ebp,eax

0100317A |。7E 70 jle short winmine 06438+00031EC

0100317C |。8B1D F8560001 mov ebx,dword ptr ds:[10056F8]

01003182 |.BF 20570001 mov edi,win mine . 060008+00001

01003187 | >6A 01/推送1

01003189 |.59 |pop ecx

0100318A |。3BD9 |cmp ebx,ecx

0100318C |。7E 0B | jle short winmine . 01003199

0100318E | >f 60439 80 |/测试字节ptr ds:[ecx+edi],80

01003192 |.74 0F | |我短winmine.010031A3

01003194 |.41 ||inc ecx

01003195 |.3BCB ||cmp ecx,ebx

01003197 |.^ 7c F5 | \ JL short winmine . 0100318e

01003199 | >40 |inc eax

0100319A |。83C7 20 |添加edi,20

0100319D |。3BC5 |cmp eax,ebp

0100319F |。^ 7c E6 \ JL short win mine . 0600338087

010031A1 |。EB 49 jmp short winmine . 0638+00031EC

010031A3 | >FF7424 18推送dword ptr ss:[esp+18];/Arg2

010031A7 |。C602 0F mov字节ptr ds:[edx],0F;|

010031AA |。C1E0 05 shl eax,5;|

010031AD |。56推esi|Arg1

010031AE |。808C08 00570001 80或字节ptr ds:[eax+ecx+1005700],80;|

010031B6 |。8D8408 00570001 lea eax,dword ptr ds:[eax+ecx+1005700];|

010031BD |。E8 EDFEFFFF调用winmine . 010030 af;\winmine.010030AF

010031C2 |。EB 28 jmp short winmine 0638+00031EC

010031C4 | >6A 4C推送4C

010031C6 |。50推eax

010031C7 |。56推动esi

010031C8 |。E8 53FCFFFF呼叫winmine.01002E20

010031CD |。6A 00推0

010031CF |。EB 16 jmp short winmine . 010031e 7

//跳到这里的不是雷。

010031D1 | >50推eax线条

010031D2 |。56推esi排

010031D3 |。E8 D7FEFFFF调用winmine . 010030 af;显示位置的编号。

010031D8 |。A1 F4560001 mov eax,dword ptr ds:[10056 F4];

010031DD |。3B05 FC560001 cmp eax,dword ptr ds:[10056FC]

010031E3 |。75 07 jnz做空winmine . 010031EC;雷扫完了吗?

010031E5 |。6A 01推送1

010031E7 | >E8 86FDFFFF调用winmine . 01002 f72;游戏圆满结束。

010031EC | >5F pop edi我还没扫完。继续

010031ED |。5E pop esi

010031EE |。5D流行乐ebp

010031EF |。5B pop ebx

010031F0 \。C2 0800 retn 8

//根据行列,调用下面的过程,计算出如果高位是1(0x80),内存中的值就是迅雷。

010033E9/$ 8B442408moveax,dword ptrs:[ESP+8]//line

010033ed | .8b4c24 04movecx,dword ptrs:[esp+4]//column

010033F1 |。C1E0 05 shl eax,5

010033 F4 | . 8d 94080057001 leaedx,dword ptrds:[EAX+ECX+1005700]//地点

010033FB |。8A8408 00570001 mov al,字节指针ds:[eax+ecx+1005700]

01003402 |.8AC8 mov cl,al

01003404 |.83E1 1F和ecx 1F

01003407 |.83F9 0D cmp ecx,0D

0100340A |。75 05 jnz short winmine . 01003411

0100340C |。6A 09推9

0100340E |。59 pop ecx

0100340F |。EB 07 jmp short winmine 06034638+08

01003411 | >83F9 0F cmp ecx,0F

01003414 |.75 02 jnz short winmine 06038+00033848386

01003416 |.33C9 xor ecx,ecx

01003418 | >24 E0和al,0E0

0100341A |。0AC1或al,cl

0100341C |。8802 mov字节ptr ds:[edx],al

0100341E \。C2 0800 retn 8

//根据行和列,经过上述过程转换后,恢复内存中的值。

01003421/$ 8b 4424 08 mov eax,dword ptr ss:[esp+8]

01003425 |.8B4C24 04 mov ecx,dword ptr ss:[esp+4]

01003429 |.C1E0 05 shl eax,5

0100342C |。8D9408 00570001 lea edx,dword ptr ds:[eax+ecx+1005700]

01003433 |.8A8408 00570001 mov al,字节指针ds:[eax+ecx+1005700]

0100343A |。8AC8 mov cl,al

0100343C |。83E1 1F和ecx 1F

0100343F |。83F9 09 cmp ecx,9

01003442 |.75 04 jnz short win mine 0638+00000863686

01003444 |.6A 0D推0D

01003446 |.EB 06 jmp short winmine . 0100344 e

01003448 | >85C9测试ecx,ecx

0100344A |。75 03 jnz short winmine . 0100344 f

0100344C |。6A 0F推0F

0100344E | >59 pop ecx

0100344F | >24 E0和al,0E0

01003451 |.0AC1或al,cl

01003453 |.8802 mov字节ptr ds:[edx],al

01003455 \.C2 0800 retn 8

————————————————————————————————————————

第二,反过来

1.用ExeScope为Winmine.exe添加一个菜单项:ID=0x259=601(大于0x20B),Name= "Pass the Customs "。

2.在Winmine.exe的消息循环中做如下修改,这样你添加的菜单选项就可以得到响应。

01001A30 & gt;\B9 4E020000 mov ecx,24E

01001A35。3BC1 cmp eax,ecx

= = >修改为

01001a 30/E9 4b 2f 0000 jmp winmine . 01004980//跳转到自己的处理代码。

01001A35。|3BC1 cmp eax,ecx

3.在01004980处编写以下代码:

下面的代码写在Winmine.exe所有零的地方,或者可以添加一个节后写作部分。

01004980 3D 58020000 cmp eax,258;

01004985 7F 0A jg空头winmine . 01004991;& gt0x258

01004987 B9 4E020000 mov ecx,24E恢复原始代码

0100498 c ^ e9 a 4d 0 ffff jmp winmine . 01001a 35;向后跳

01004991 3D 59020000 CMP eax,259;您是否选择了“通过”

01004996 7F 40 jg空头winmine . 06438+00049 D8;& gt0x259?跳转到继续处理其他。

//这是通关密码。

01004998 B8 01000000 mov eax,1;双循环遍历;

0100499d B9 01000000 mov ecx,1

010049A2 50推送eax

010049A3 51推送ecx

010049A4 50推eax

010049A5 51推送ecx

010049A6 50推送eax

010049A7 51推送ecx

010049A8 E8 3CEAFFFF调用winmine . 010033 e 9;变化

010049AD A8 80测试al,80;是打雷吗?

010049AF 75 07 jnz做空winmine . 06438+00049 b8;

010049B1 E8 F9E6FFFF调用winmine . 010030 af;不是雷。关掉它。

010049 B6 EB 05 jmp short winmine . 010049 BD

010049B8 E8 64EAFFFF调用winmine . 01003421;是雷,恢复

010049BD 59 pop ecx

010049BE 58 pop eax

010049 BF 41 Inc ecx;列数增加了1

010049 c 0 3B0D cc 520001 CMP ecx,dword ptr ds:[10052 cc];遍历该行的所有列?

010049 C6 ^ 7e da jle short winmine

010049 c8 40 Inc eax;行数增加了1

010049 c 9 3 b05 c 8520001 CMP eax,dword ptr ds:[10052 c8];遍历所有行?

010049 cf ^ 7e cc jle short winmine

010049D1 6A 01推送1

010049D3 E8 9AE5FFFF调用winmine . 01002 f72;游戏通关

010049 D8 ^ e9 58d 3 ffff jmp winmine . 01001d 35;返回到原始消息周期的末尾。

在OD中写完代码后,复制到可执行文件中保存!

4.运行Winmine.exe并在菜单中选择“通过”!