CrackMe#46

这个CM的重点在于脱壳  和几个调试器的配合使用~

由于脱壳后代码依然加密 所以修改NAX只能外部16进制工具修改机器码实现~

Serial算法隐藏在按键过程响应中…

一组可用Key:

N/S List:
ShadowKong

2FAF27C1
UnLock:
001182102

KeyGen

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

继续阅读“CrackMe#44 lstrlenA is a joke”

CrackMe#42.LV6

今天这个Cm是LV6 难度不错  因为用到了浮点数~~搞了我一天…最后LV6的最后一个算法没有完全逆出来!

/*************************************************

0044C1F6  |.  DB3C24        fstp    tbyte ptr [esp]
0044C1F9  |.  9B            wait
0044C1FA  |.  B8 03000000   mov     eax, 3                           ;  3!
0044C1FF  |.  E8 ECF6FCFF   call    0041B8F0
0044C204  |.  D805 50C34400 fadd    dword ptr [44C350]               ;  512.+5.
0044C20A  |.  D9FA          fsqrt                                    ;  开根号
0044C20C  |.  E8 F365FBFF   call    00402804                         ;  求余弦
0044C211  |.  DB7D B8       fstp    tbyte ptr [ebp-48]
0044C214  |.  9B            wait
0044C215  |.  D905 54C34400 fld     dword ptr [44C354]               ;  1
0044C21B  |.  DC45 E8       fadd    qword ptr [ebp-18]               ;  9+…
0044C21E  |.  D9FA          fsqrt                                    ;   开根号
0044C220  |.  D9E0          fchs                                     ;  正负求反
0044C222  |.  DB6D B8       fld     tbyte ptr [ebp-48]               ;  8经过算法后的值
0044C225  |.  DEC1          faddp   st(1), st                        ;  9+1求反+8经过算法的值
0044C227  |.  DB7D AC       fstp    tbyte ptr [ebp-54]               ;  保存 -3.8963…
0044C22A  |.  9B            wait
0044C22B  |.  D905 58C34400 fld     dword ptr [44C358]               ;  3!
0044C231  |.  DC4D D8       fmul    qword ptr [ebp-28]               ;  3*7
0044C234  |.  D805 54C34400 fadd    dword ptr [44C354]               ;  3*7+1
0044C23A  |.  D9ED          fldln2                                   ;  加载LN2
0044C23C  |.  D9C9          fxch    st(1)                            ;  与LN2交换

继续阅读“CrackMe#42.LV6”

CrackMe#41:the CM too two

这同样有壳  去壳过程没技术含量~

不知道是作者太那啥还是所用的编译器太那啥~看下面一段代码…

004431FC  |> /A1 34584400   /mov     eax, dword ptr [445834]
00443201  |. |8B13          |mov     edx, dword ptr [ebx]
00443203  |. |0FB64410 FF   |movzx   eax, byte ptr [eax+edx-1]       ;  NameList~
00443208  |. |8D55 F8       |lea     edx, dword ptr [ebp-8]
0044320B  |. |E8 4844FCFF   |call    00407658                        ;  %d
00443210  |. |8B55 F8       |mov     edx, dword ptr [ebp-8]
00443213  |. |B8 38584400   |mov     eax, 00445838
00443218  |. |E8 0706FCFF   |call    00403824
0044321D  |. |8B03          |mov     eax, dword ptr [ebx]            ;  [ebx]
0044321F  |. |A3 44584400   |mov     dword ptr [445844], eax
00443224  |. |A1 38584400   |mov     eax, dword ptr [445838]
00443229  |. |E8 5A44FCFF   |call    00407688
0044322E  |. |F72D 44584400 |imul    dword ptr [445844]              ;  115D*[ebx]?
00443234  |. |A3 4C584400   |mov     dword ptr [44584C], eax
00443239  |. |6B03 13       |imul    eax, dword ptr [ebx], 13        ;  eax== [ebx]*0x13
0044323C  |. |8906          |mov     dword ptr [esi], eax
0044323E  |. |8B06          |mov     eax, dword ptr [esi]
00443240  |. |03C0          |add     eax, eax                        ;  eax*2
00443242  |. |83C0 03       |add     eax, 3                          ;  +3
00443245  |. |8906          |mov     dword ptr [esi], eax
00443247  |. |A1 4C584400   |mov     eax, dword ptr [44584C]
0044324C  |. |F72E          |imul    dword ptr [esi]                 ;  115D*~
0044324E  |. |A3 50584400   |mov     dword ptr [445850], eax
00443253  |. |A1 50584400   |mov     eax, dword ptr [445850]
00443258  |. |F72E          |imul    dword ptr [esi]                 ;  *~
0044325A  |. |0105 40584400 |add     dword ptr [445840], eax         ;  0x53++++
00443260  |. |FF03          |inc     dword ptr [ebx]                 ;  ++
00443262  |> |A1 34584400    mov     eax, dword ptr [445834]
00443267  |. |E8 E007FCFF   |call    00403A4C
0044326C  |. |3B03          |cmp     eax, dword ptr [ebx]
0044326E  |.^\7D 8C         \jge     short 004431FC

一点精简 效率性都没有…=.=
一组可用Key:

KeyOne:

13028-31x23e93-z14d20

KeyTwo:

ShadowKong

464411239-Oc3k

DownMe:KeyGen

关于这个CM  作者排除了几个Name  Dasm翻几下就能知道~

还有CM那里限制了只能输入0xF个Name字符~

CrackMe#40:Static

这是一个非常有意思的CrackMe!

首先查壳 又是UPX 直接手脱 脱壳毫无技术含量不值一提.

然后载入OD直接找到算法部分~

发现这个CM比较特别 其中的两个静态变量作为标志更是亮点中的亮点~

这意味着要输入两次Key验证,第一次使得第一个STATIC a==1,b==1;

第二次使得STAIC b++;

要当a==1,b==2的时候才算CONS~

在验证过程会发现算法只取前8位注册码 不够8位用0x20补全~

而且这个算法也是这个CM的非常漂亮的地方之一,特别是第一轮的~:

第一轮:

/*************************************************/

004568FC  /$  55            push    ebp
004568FD  |.  31C9          xor     ecx, ecx
004568FF  |.  8D30          lea     esi, dword ptr [eax]
00456901  |.  83C6 04       add     esi, 4
00456904  |.  BB 998F3337   mov     ebx, 37338F99
00456909  |.  AD            lods    dword ptr [esi]                  ;  后四位
0045690A  |.  31C3          xor     ebx, eax
0045690C  |.  C1C3 30       rol     ebx, 30
0045690F  |.  81F3 00009999 xor     ebx, 99990000
00456915  |.  C1CB 50       ror     ebx, 50
00456918  |.  83EE 08       sub     esi, 8
0045691B  |.  AD            lods    dword ptr [esi]                  ;  前四位
0045691C  |.  01C3          add     ebx, eax
0045691E  |.  81F3 99999999 xor     ebx, 99999999
00456924  |.  C1C3 70       rol     ebx, 70
00456927  |.  81FB 75533D53 cmp     ebx, 533D5375
0045692D      75 1C         jnz     short 0045694B
0045692F  |.  41            inc     ecx/*标志*/
00456930  |.  83EE 04       sub     esi, 4
00456933  |.  AD            lods    dword ptr [esi]                  ;  前四位
00456934  |.  89C3          mov     ebx, eax
00456936  |.  AD            lods    dword ptr [esi]                  ;  后四位
00456937  |.  C1CB 80       ror     ebx, 80
0045693A  |.  81F3 99990000 xor     ebx, 9999
00456940  |.  31C3          xor     ebx, eax
00456942  |.  81FB 998F3337 cmp     ebx, 37338F99
00456948      75 01         jnz     short 0045694B
0045694A  |.  41            inc     ecx/*标志*/
0045694B  |>  5D            pop     ebp
0045694C  \.  C3            retn
/******************************************************/
分析算法之前我们设两个变量:
L4==后四位注册码
F4==前四位注册码
把上面第一轮的算法翻译成数学公式就是:
(I)
(((((L4 xor 0x37338F99)rol 0x10)xor 0x99990000)rol 0x10+F4)xor 0x99999999)rol 0x10 ==0x533D5375
(II)
(F4 xor 0x00009999) xor L4==0x37338F99
由上面的(I)(II)可得:
(III)
L4==0x37338F99 xor (F4 xor 0x00009999)
再由(I)(III)可得:
(IIII)
(((((F4 xor 0x00009999)rol 0x10)xor 0x99990000)rol 0x10+F4) xor 0x99999999)rol 0x10==0x533D5375
由(IIII)可以看出 F4在第一轮中高低位互相不影响~也就是说 在这里L4 高低位是独立的~
然后我们由(IIII)推出L4  F4的计算公式:
F4=((0x533D5375 rol 0x10)xor 0x99999999)/2
L4=(F4 xor 0x9999)xor 0x37338F99
然后 第一个注册码就是:F4+L4 ==ReveRsER
第二轮的算法相对于第一轮来说没啥好说的~
/******************************************************/

一组Key:

FirstTime:ReveRsER

SecondTime:CraCkiNG

DownMe:KeyGen