surge 发表于 2006-3-21 03:46:24

五个crackme中的第五个分析

【破文标题】五个crackme中的第五个分析
【破文作者】surge
【作者邮箱】[email protected]
【作者主页】http://surge.blog.com.cn

这是我发的五个crackme中的第五个,提供的答案是老外用delphi写的控制台程序源代码,不过他没有给出第五个的答案。这里简单分析一下。

程序加壳了,od载入就出现异常,shift+F9通过异常后,单步几下,用esp定律很容易脱去。
这个crackme的关键其实是keyfile,下面的代码载入了map文件,map文件可以用ida生成,因为是borland c++程序,用dede也应该可以生成map,不过我用了ida。
为了看起来更整齐一点我将机器码删了。

004012B0    push    ebp                            ;DialogFunc
004012B1    mov   ebp, esp
004012B3    push    ebx
004012B4    mov   ebx, 0040D878
004012B9    mov   eax,
004012BC    sub   eax, 10                      ;Switch (cases 10..111)
004012BF    je      00401394
004012C5    sub   eax, 8
004012C8    je      short 004012DA
004012CA    sub   eax, 0F9
004012CF    je      004013A5
004012D5    jmp   004013CF
004012DA    push    0040B26F                   ; /step 5 of 5by:
004012DF    push    dword ptr    ; |hWnd
004012E2    call    <SetWindowTextA>   ; \SetWindowTextA
004012E7    push    0040B296                  ; /r
004012EC    push    0040B289                   ; |step5key.key
004012F1    call    <_fopen>                      ; \5.004040C0

上面可以知道是在读step5key.key文件,所以创建这个文件,随便输入点内容。
再次载入脱壳的程序。

004012F6   add   esp, 8
004012F9   mov   , eax
004012FE   cmp   dword ptr , 0
00401305   je      004013D3
0040130B   xor   edx, edx
0040130D   mov   , edx
0040130F   jmp   short 00401331
00401311   /push    dword ptr       ; /Arg1 = 00000000
00401317   |call    00404C5C                        ; \5.00404C5C
0040131C   |pop   ecx
0040131D   |mov   , al                  ;al=文件中的一个字节内容
00401322   |mov   ecx,
00401324   |mov   al,
00401329   |mov   , al         ;文件中的内容放到40b14c开始的内存处
0040132F   |inc   dword ptr                ;计数加1
00401331    cmp   dword ptr , 0F       ;读0x0F个字节
00401334   \jb      short 00401311
00401336   push    dword ptr        ; /Arg1 = 00000000
0040133C   call    <_fclose>                         ; \5.00403D54
00401341   pop   ecx
00401342   xor   edx, edx
00401344   mov   , edx                      ;计数清0
00401346   jmp   short 00401357
00401348   /mov   cl,
0040134A   |add   cl, 77                           ;循环次数加上0x77
0040134D   |mov   eax,
0040134F   |xor   , cl          ;(读入文件内容的每一个字节) 异或 (循环次数加0x77)
00401355   |inc   dword ptr
00401357    cmp   dword ptr , 0F      ;计数加1
0040135A   \jb      short 00401348
0040135C   push    0040B15C                     ;step 5 was fun!
00401361   push    0040B14C                     ;计算结果与开始的内容比较,相等ok
00401366   call    <_strcmp>

构造正确的step5key.key内容,先不着急计算,因为算法只是简单的异或一次,根据异或原理,a==a xor a xor a,所以把40b15c的内容输入到step5key.key中,并在401361下断点,让程序自己来帮我们算正确的key,重新运行,断下来后看40b14c的内容是什么240C1C0A5B495D091EF3A1E4F6EAA400,找个十六进制编辑器,把这些写入step5key.key。


再次运行程序显示:
Step5 has been solved
Step5 unlock code is: 1A2E3D
这应该是crackme的作者想看到的答案吧。


【版权声明】本文纯属技术交流,转载请注明作者信息并保持文章的完整,谢谢!

hyd009 发表于 2006-3-21 13:52:54

支持一下,呵呵

godhack 发表于 2006-5-1 03:33:23

写的不错,支持!!!

yybns 发表于 2008-2-15 19:02:20

支持一下,呵呵/:001 /:001
页: [1]
查看完整版本: 五个crackme中的第五个分析