【文章标题】: 吾爱破解2012CM大赛破文-zhi5231
【文章作者】: DZ
【软件名称】: zhi5231.exe
【难 度】: 中
【下载地址】: http://down.52pojie.cn/2012CM/%E4%B8%AD/zhi5231/
【作者声明】: 一个一个来,慢慢分析,直到最难 ^^
--------------------------------------------------------------------------------
【详细过程】
此CM为易语言编写,所以OD加载运行后下易语言万能断点,然后随便输入假码,点击“按钮”,
你会发现,按钮点击了没反应,但是你看下任务栏就明白了,这个CM启动时创建了2个完全一样的窗体,
2个窗体重叠在一起,真正有作用的是被遮盖的那个窗体,好了,我们把看到的窗体拖动一下,就看到
下面那个窗口了,在下面窗口输入假码点击按钮,就断下来了 0041A78D |> \FF55 FC call [local.1] ; zhi5231.00401004 //断到此处
我们F7进入call,代码如下: 00401087 /. 55 push ebp
00401088 |. 8BEC mov ebp,esp
0040108A |. 81EC 0C000000 sub esp,0C
00401090 |. 833D 50604C00 0>cmp dword ptr ds:[4C6050],2
00401097 |. 0F85 05000000 jnz zhi5231.004010A2
0040109D |. E9 0A000000 jmp zhi5231.004010AC
004010A2 |> C705 50604C00 8>mov dword ptr ds:[4C6050],1F2F0E8B
004010AC |> E8 E1020000 call zhi5231.00401392
004010B1 |. 6A FF push -1
004010B3 |. 6A 08 push 8
004010B5 |. 68 09000116 push 16010009
004010BA |. 68 01000152 push 52010001
004010BF |. E8 5F080000 call zhi5231.00401923 ; 取密码
004010C4 |. 83C4 10 add esp,10
004010C7 |. 8945 FC mov [local.1],eax
call内容就很简单了,跟踪一下就发现关键点是2个大跳转和一个小跳转,代码基本相同,如下: 00401178 |. E8 8E070000 call zhi5231.0040190B
0040117D |. 83C4 10 add esp,10
00401180 |. 8945 F8 mov [local.2],eax
00401183 |. 837D F8 00 cmp [local.2],0
00401187 |. 0F85 01020000 jnz zhi5231.0040138E ; // 大跳转1 ,爆破直接nop掉
0040127F |. E8 87060000 call zhi5231.0040190B
00401284 |. 83C4 10 add esp,10
00401287 |. 8945 F8 mov [local.2],eax
0040128A |. 837D F8 00 cmp [local.2],0
0040128E |. 0F85 FA000000 jnz zhi5231.0040138E ; //大跳转2,爆破直接nop掉
0040136A |. E8 9C050000 call zhi5231.0040190B
0040136F |. 83C4 10 add esp,10
00401372 |. 8945 F8 mov [local.2],eax
00401375 |. 837D F8 00 cmp [local.2],0
00401379 |. 0F85 0F000000 jnz zhi5231.0040138E ; //小跳转,爆破直接nop掉
上面把三个jnz NOP掉是一种方法,还有一种方法是根据3个地方代码的相似性,它们都调用了 call zhi5231.0040190B,然后根据eax的值进行判断, 所以我们可以在这个call里面做文章,好的,我们进call看看,同时注意对eax的赋值语句,代码如下: 0041A6A0 . 8D5424 08 lea edx,dword ptr ss:[esp+8]
0041A6A4 . 83EC 0C sub esp,0C
0041A6A7 . 52 push edx
0041A6A8 . FF7424 14 push dword ptr ss:[esp+14]
0041A6AC . C74424 08 00000>mov dword ptr ss:[esp+8],0
0041A6B4 . C74424 0C 00000>mov dword ptr ss:[esp+C],0
0041A6BC . C74424 10 00000>mov dword ptr ss:[esp+10],0
0041A6C4 . 8D5424 08 lea edx,dword ptr ss:[esp+8]
0041A6C8 . 52 push edx
0041A6C9 . FFD3 call ebx
0041A6CB . 8B4424 0C mov eax,dword ptr ss:[esp+C] //对eax赋值了
0041A6CF . 8B5424 10 mov edx,dword ptr ss:[esp+10]
0041A6D3 . 8B4C24 14 mov ecx,dword ptr ss:[esp+14]
0041A6D7 . 83C4 18 add esp,18
0041A6DA . C3 retn
我们注意到在 0041A6CB 处,对eax进行赋值[esp+0xC],我们先走一遍,记住[esp+0xC]的地址,然后重来,这次进到上面那个 call ebx 去寻找对[esp+0xC]的赋值,此call代码如下: 00449330 . 8B4424 0C mov eax,dword ptr ss:[esp+C]
00449334 . 56 push esi
00449335 . 8B7424 08 mov esi,dword ptr ss:[esp+8]
00449339 . C706 01000000 mov dword ptr ds:[esi],1
0044933F . 8B08 mov ecx,dword ptr ds:[eax]
00449341 . 8B01 mov eax,dword ptr ds:[ecx]
00449343 . 85C0 test eax,eax
00449345 . 74 30 je short zhi5231.00449377
00449347 . 8B50 04 mov edx,dword ptr ds:[eax+4]
0044934A . 85D2 test edx,edx
0044934C . 75 0B jnz short zhi5231.00449359
0044934E . 33C9 xor ecx,ecx
00449350 . 85D2 test edx,edx
00449352 . 0F94C1 sete cl
00449355 . 890E mov dword ptr ds:[esi],ecx ; [esi] 就是上层的[esp+0xC]
00449357 . 5E pop esi
00449358 . C3 retn
00449359 > 8B48 08 mov ecx,dword ptr ds:[eax+8]
0044935C . B8 ABAAAA2A mov eax,2AAAAAAB
00449361 . 2BCA sub ecx,edx
00449363 . F7E9 imul ecx
00449365 . D1FA sar edx,1
00449367 . 8BC2 mov eax,edx
00449369 . 33C9 xor ecx,ecx
0044936B . C1E8 1F shr eax,1F
0044936E . 03D0 add edx,eax
00449370 . 85D2 test edx,edx
00449372 . 0F94C1 sete cl
00449375 . 890E mov dword ptr ds:[esi],ecx ; [esi] 就是上层的[esp+0xC]
00449377 > 5E pop esi
00449378 . C3 retn
进来发现后面[esi]其实就是上层里的[esp+0xC],也就是ecx把值传给了[esp+0xC], 而调试发现经过 sete cl 这句后,cl=1 ,所以我们把 00449352 . 0F94C1 sete cl 这句改成相反的操作
00449352 0F95C1 setne cl //改成这样,之后cl=0
再之后运行看看,两个窗口点击测试,都提示破解成功! 大功告成^^
|