怎么输入“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并在菜单中选择“通过”!