CrackMe#44 lstrlenA is a joke

今天这个CM估计是XP2000以前的老东西了,在很久以前的lstrlenA函数可能和现在的不一样~那里不一样?现在的会影响除了eax之外的寄存器,或者说在我的机器上会发生这种影响(已知我从来没有修改过kernel32.dll ),如果你也遇到过这种问题的话…

总之在我的机器上调用strlenA返回值除了eax==ASCII`s Len之外 还有一点就是ecx==addr strlenA+SZIE(strlenA的函数代码宽度)

由于这点问题直接导致了我今天的困扰 所幸现在已经解决~这也就是今天这个CM的关键所在~

首先看这个CM的DASM原版:

00401654  /$  55            push    ebp
00401655  |.  8BEC          mov     ebp, esp
00401657  |.  51            push    ecx
00401658  |.  57            push    edi
00401659  |.  52            push    edx
0040165A  |.  56            push    esi
0040165B  |.  33C9          xor     ecx, ecx
0040165D  |.  8B7D 08       mov     edi, dword ptr [ebp+8]
00401660  |.  FF75 08       push    dword ptr [ebp+8]                ; /String
00401663  |.  E8 FC000000   call    <jmp.&KERNEL32.lstrlenA>         ; \lstrlenA

00401668      EB 23         jmp     short 0040168D
0040166A      33D2          xor     edx, edx
0040166C      8A17          mov     dl, byte ptr [edi]
0040166E  |.  80EA 30       |sub     dl, 30                          ;  -0x30
00401671  |.  8BF0          |mov     esi, eax
00401673  |.  4E            |dec     esi
00401674  |.  50            |push    eax
00401675  |.  8BC2          |mov     eax, edx
00401677  |.  53            |push    ebx
00401678  |.  BB 0A000000   |mov     ebx, 0A
0040167D  |.  EB 03         |jmp     short 00401682
0040167F  |>  F7E3          |/mul     ebx                            ;  *0x0A
00401681  |.  4E            ||dec     esi
00401682  |>  83FE 00       | cmp     esi, 0
00401685  |.^ 77 F8         |\ja      short 0040167F
00401687  |.  5B            |pop     ebx
00401688  |.  03C8          |add     ecx, eax
0040168A  |.  58            |pop     eax
0040168B  |.  47            |inc     edi
0040168C  |.  48            |dec     eax
0040168D  |>  0BC0           or      eax, eax
0040168F    ^ 75 D9         jnz     short 0040166A
00401691      8BC1          mov     eax, ecx
00401693      5E            pop     esi
00401694      5A            pop     edx
00401695  |.  5F            pop     edi
00401696  |.  59            pop     ecx
00401697  |.  C9            leave
00401698  \.  C2 0400       retn    4

在红色代码处  函数返回后 发现eax==Len  ecx==0x7C80BE56+0X30==0X7C80BE86

其中0x30是在我机子上strlenA的执行代码长度,0x7C80BE56是strlenA的地址~

这段代码是属于今天这个CM的算法之内  起初我还以为作者取API函数地址加入CM算法 实在高明  后来写逆算法的时候发现  完全不是这么回事~

再翻翻作者给出的答案 发现其实上面那句 xor ecx,ecx才是作者意图

附近中有原版和加入补丁后的正确版本~注册机针对修改后版本…

而跟踪一边lstrlenA的运行会发现…一下三句:

pop ecx

…..

push ecx

retn

这说明啥  说明函数把ecx当作保存返回地址的寄存器了…所以返回后ecx才会等于 addr lstrlenA+他的运行长度

一组可用Key:

shadowkong

C81+6>

CM隐藏控件属性:Name输入必须是字母!

DownMe KeyGen

发表评论

邮箱地址不会被公开。 必填项已用*标注