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

CrackMe#37:亮点在于lods和stos

这个CM和以往的有点区别~亮点还是有的~

首先PEID查看 有壳~~

我们重点不是这 轻易脱掉

首先这并不是明码比较(很多都不是明码比较..)

其次这是一组Name 和Key混合算法

再其次这个算法的关键在于:

A[i]=F1(Name[i-1])-F2(Key[i-1]);

i=KeyLen+1;

然后循环算出A[KeyLen];

最后再比较~~

总之这个算法不需要逆 但是需要有很好的数学思维 特别是数列和解N个变量的方程函数方面的…

最后这个CM有几处代码非常漂亮:

004013C3    BF 20334000     mov     edi, 00403320
004013C8    BE 20334000     mov     esi, 00403320
004013CD    AC              lods    byte ptr [esi]
004013CE    0C 00           or      al, 0
004013D0    74 05           je      short 004013D7
004013D2    0C 20           or      al, 20
004013D4    AA              stos    byte ptr es:[edi]
004013D5  ^ EB F6           jmp     short 004013CD

如果你有点汇编基础 就看看出这段代码是多么的漂亮~

一组可用Key:

ShadowKong

rg`\e

DownMe:KeyGen

注册机并不完美 因为这算法解太多…

逆向反汇编基础之三十五:这个CM的KF不错~

今天这个KEYfile不错~

一段内联的代码…

关键在于当字节是00的判断~

这里用了一种巧妙的 就是让他一直不为0~

szA=szSum;
__asm mov eax,szSum
__asm and eax,0x000000FF
__asm mov szA,eax
szKeyList[14]=szA;
__asm mov eax,szSum
__asm and eax,0x0000FF00
__asm shr eax,8
__asm mov szA,eax
szKeyList[15]=szA;
__asm mov eax,szSum
__asm and eax,0x00FF0000
__asm shr eax,16
__asm mov szA,eax
szKeyList[16]=szA;
__asm mov eax,szSum
__asm and eax,0xFF000000
__asm shr eax,24
__asm mov szA,eax
szKeyList[17]=szA;

DownMe:KeyGen

逆向反汇编基础之三十四:当年BCG入门的一个小小KeyFile

这是当年BCG入门的一个小KeyFile

接触的KeyFile方式的CM不多

但这个算简单的

只要掌握好CreateFile ReadFile 和注册表的几个操作函数就OK了~

PS:有壳..直接去之..

PPS:话说当年红遍大江南北的BCG邀请码那么简单就能获得?

http://dl.dbank.com/c0829w3u07