h_one 发表于 2013-12-14 02:30

【吾爱2013CM大赛解答】----CrackMe -- 苏紫方璇 CM分析

本帖最后由 zxcfvasd 于 2013-12-14 02:30 编辑

0x1
【作者】:zxcfvasd
【操作平台】:xp sp3
【使用工具】:OD

0x2
随便输入后程序就会退出,然后就可以找到退出原因,eax = 调用的服务编号,使用0x7FFE0300 ntdll.KiFastSystemCall快速切入内核调用退出函数。 这也就是为什么作者说逆向分析在sp3上的原因吧


顺藤摸瓜:找点关键点让其断下(4012E0)

这里检查关键点是否下有断点,我直接将原来的je,该为jmp,即使检查到有断点也不会退出,
00401388   .FF15 00304000 call dword ptr ds:[<&KERNEL32.GetProcAdd>; \GetProcAddress
0040138E   .6A 14         push 0x14
00401390   .50            push eax
00401391   .E8 DA040000   call CrackMe1.00401870    ;软件断点检查函数
00401396   .83C4 08       add esp,0x8
00401399   .85C0          test eax,eax
0040139B   .EB 05         jmp XCrackMe1.004013A2
0040139D   .E8 BE040000   call CrackMe1.00401860   ;进程退出函数
004013A2   >68 9E000000   push 0x9E
004013A7   .68 A0184000   push CrackMe1.004018A0
004013AC   .E8 BF040000   call CrackMe1.00401870
004013B1   .83C4 08       add esp,0x8
004013B4   .85C0          test eax,eax
004013B6   .EB 05         jmp XCrackMe1.004013BD
004013B8   .E8 A3040000   call CrackMe1.00401860


接下来调用两个SetTimer,分别在TimeProc函数上下断


F9然程序跑气;
会断到时间会调函:
在4018A0: 调用QueryPerformanceFrequency函数,计算程序运行时间(dagai),然后比较值进行反调试
004018D3   > \68 F0404000   push CrackMe1.004040F0                   ; /pPerformanceFreq = CrackMe1.004040F0
004018D8   .FF15 08304000 call dword ptr ds:[<&KERNEL32.QueryPerfo>; \QueryPerformanceFrequency
004018DE   .68 F8404000   push CrackMe1.004040F8
004018E3   .FFD6          call esi
00401931   .3D D0070000 cmp eax,0x7D0      比较计算的时间值
00401936   .5E            pop esi
00401937   .EB 05       jmp XCrackMe1.0040193E   我使用同样的方法jmp
00401939   .E8 22FFFFFF   call CrackMe1.00401860
0040193E   >C2 1000       retn 0x10



在401950中:
同样是对关键点是否下有断点检查
下面这段代码是判断是否有硬件断点存在,我只直接将结束call xxoo了
00401A86   .FF15 14304000 call dword ptr ds:[<&KERNEL32.GetCurrent>; |[GetCurrentThread
00401A8C   .50            push eax                                 ; |hThread
00401A8D   .FF15 10304000 call dword ptr ds:[<&KERNEL32.GetThreadC>; \GetThreadContext
00401A93   .395C24 4C   cmp dword ptr ss:,ebx
00401A97   .75 12         jnz XCrackMe1.00401AAB
00401A99   .395C24 50   cmp dword ptr ss:,ebx
00401A9D   .75 0C         jnz XCrackMe1.00401AAB
00401A9F   .395C24 54   cmp dword ptr ss:,ebx
00401AA3   .75 06         jnz XCrackMe1.00401AAB
00401AA5   .395C24 58   cmp dword ptr ss:,ebx
00401AA9   .74 05         je XCrackMe1.00401AB0
00401AAB   >90            nop
00401AAC   .90            nop
00401AAD   .90            nop
00401AAE   .90            nop
00401AAF   .90            nop


作者这样不断的检查一些地址,同样也给逆向人员带来了方便,因为这样很快就能发现程序关键点了。
这就是程序的关键call了,

算法很简单的:
00401550|> /33C0          /xor eax,eax
00401552|. |8A03          |mov al,byte ptr ds:
00401554|. |8D0440      |lea eax,dword ptr ds:
00401557|. |99            |cdq
00401558|. |2BC2          |sub eax,edx
0040155A|. |D1F8          |sar eax,1
0040155C|. |25 FF000000   |and eax,0xFF
00401561|. |50            |push eax
00401562|. |8D4424 14   |lea eax,dword ptr ss:
00401566|. |50            |push eax
00401567|. |56            |push esi
00401568|. |FFD5          |call ebp                              ;msvcrt.sprintf


黑夜伴影 发表于 2013-12-14 04:01

我对破解还不会、只能膜拜会破解的大婶

朦胧中的罪 发表于 2013-12-14 04:03

我对破解还不会、只能膜拜会破解的大婶

h_one 发表于 2013-12-15 16:31

黑夜伴影 发表于 2013-12-14 04:01 static/image/common/back.gif
我对破解还不会、只能膜拜会破解的大婶

多敲代码{:1_908:}

bambooqj 发表于 2013-12-15 16:39

围剿 发表于 2013-12-16 20:27

起码先把汇编看完再说了
页: [1]
查看完整版本: 【吾爱2013CM大赛解答】----CrackMe -- 苏紫方璇 CM分析