首页
社区
课程
招聘
[原创]一个间单的CrackMe的算法分析和算法注册机
发表于: 2011-3-17 14:03 5301

[原创]一个间单的CrackMe的算法分析和算法注册机

2011-3-17 14:03
5301
呵呵~~~~~~~~~~~
大家好~~~~~~~
前几看到了一个CRACKME,就拿来分析了下算法。
大家可能看到过这个CRACKME!!!!!!!!!!!!!!
可能已经有很多人分析过~~~不过我是自己分析出来!!!!
因为好久没有发贴了~
004279FC  4C 41 4E 4E 59 44 49 42 41 4E 44 49 4E 47 49 4E  LANNYDIBANDINGINANAKEKHYANGNGENTOT

00428884  4C 41 4E 4E 59 35 36 34 36 35 32 31              LANNY5646521

00427B47    6A 00           PUSH 0
00427B49    6A 00           PUSH 0
00427B4B    53              PUSH EBX
00427B4C    8BD8            MOV EBX,EAX
00427B4E    33C0            XOR EAX,EAX
00427B50    55              PUSH EBP
00427B51    68 FA7B4200     PUSH echap515.00427BFA
00427B56    64:FF30         PUSH DWORD PTR FS:[EAX]
00427B59    64:8920         MOV DWORD PTR FS:[EAX],ESP
00427B5C    8D55 FC         LEA EDX,DWORD PTR SS:[EBP-4]
00427B5F    8B83 DC010000   MOV EAX,DWORD PTR DS:[EBX+1DC]
00427B65    E8 26E2FEFF     CALL echap515.00415D90
00427B6A    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00427B6D    E8 3EBCFDFF     CALL echap515.004037B0
00427B72    48              DEC EAX
00427B73    7C 30           JL SHORT echap515.00427BA5
00427B75    8D55 FC         LEA EDX,DWORD PTR SS:[EBP-4]
00427B78    8B83 EC010000   MOV EAX,DWORD PTR DS:[EBX+1EC]
00427B7E    E8 0DE2FEFF     CALL echap515.00415D90
00427B83    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00427B86    50              PUSH EAX
00427B87    8D55 F8         LEA EDX,DWORD PTR SS:[EBP-8]
00427B8A    8B83 DC010000   MOV EAX,DWORD PTR DS:[EBX+1DC]
00427B90    E8 FBE1FEFF     CALL echap515.00415D90
00427B95    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
00427B98    5A              POP EDX
00427B99    E8 82FEFFFF     CALL echap515.00427A20                   ; 关键CALL跟进去
00427B9E    3D 4E61BC00     CMP EAX,0BC614E                          ; EAX=0X0BC614E就可以注册成功
00427BA3    7D 1E           JGE SHORT echap515.00427BC3              ; 关键
00427BA5    6A 00           PUSH 0
00427BA7    68 087C4200     PUSH echap515.00427C08                   ; ERROR
00427BAC    68 107C4200     PUSH echap515.00427C10                   ; Wrong Serial Number !
00427BB1    A1 44974200     MOV EAX,DWORD PTR DS:[429744]
00427BB6    E8 411EFFFF     CALL echap515.004199FC
00427BBB    50              PUSH EAX
00427BBC    E8 4FD9FDFF     CALL <JMP.&user32.MessageBoxA>
00427BC1    EB 1C           JMP SHORT echap515.00427BDF
00427BC3    6A 00           PUSH 0
00427BC5    68 287C4200     PUSH echap515.00427C28                   ; Success
00427BCA    68 307C4200     PUSH echap515.00427C30                   ; Congratulation ! You've Did It.\rMail Us : ekhmail@egroups.com
00427BCF    A1 44974200     MOV EAX,DWORD PTR DS:[429744]
00427BD4    E8 231EFFFF     CALL echap515.004199FC
*******************************************************************
00427A28    33C9            XOR ECX,ECX
00427A2A    894D F0         MOV DWORD PTR SS:[EBP-10],ECX
00427A2D    894D F4         MOV DWORD PTR SS:[EBP-C],ECX
00427A30    8955 F8         MOV DWORD PTR SS:[EBP-8],EDX
00427A33    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
00427A36    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00427A39    E8 26BFFDFF     CALL echap515.00403964
00427A3E    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
00427A41    E8 1EBFFDFF     CALL echap515.00403964
00427A46    33C0            XOR EAX,EAX
00427A48    55              PUSH EBP
00427A49    68 2A7B4200     PUSH echap515.00427B2A
00427A4E    64:FF30         PUSH DWORD PTR FS:[EAX]
00427A51    64:8920         MOV DWORD PTR FS:[EAX],ESP
00427A54    33DB            XOR EBX,EBX                              ; EBX清0
00427A56    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]             ; ASCII "wangwei"
00427A59    E8 52BDFDFF     CALL echap515.004037B0                   ; 取用户名的位数给EAX
00427A5E    8BF0            MOV ESI,EAX                              ; 把用户名位传给ESI用做下面循环体的参数
00427A60    85F6            TEST ESI,ESI
00427A62    7E 3C           JLE SHORT echap515.00427AA0
00427A64    B8 01000000     MOV EAX,1                                ; EAX置1
00427A69    8BD0            /MOV EDX,EAX                             ; EDX=EAX
00427A6B    8B4D FC         |MOV ECX,DWORD PTR SS:[EBP-4]            ; ASCII "wangwei"
00427A6E    0FB64C11 FF     |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1]       ; 逐位取用户名的ACSII码给ECX
00427A73    03D9            |ADD EBX,ECX                             ; EBX初始为0,EBX=EBX+ECX
00427A75    71 05           |JNO SHORT echap515.00427A7C
00427A77    E8 B4AFFDFF     |CALL echap515.00402A30
00427A7C    C1E3 08         |SHL EBX,8                               ; EBX 逻辑左移8位
00427A7F    8B0D 80884200   |MOV ECX,DWORD PTR DS:[428880]           ; ASCII "LANNYDIBANDINGINANAKEKHYANGNGENTOT"
00427A85    0FB65411 FF     |MOVZX EDX,BYTE PTR DS:[ECX+EDX-1]       ; 逐位字符列表中的ACSSII码给EDX
00427A8A    0BDA            |OR EBX,EDX                              ; EBX=EBX^EDX
00427A8C    85DB            |TEST EBX,EBX                            ; --------------->
00427A8E    7D 0C           |JGE SHORT echap515.00427A9C             ; 确保EBX的值不为负
00427A90    6BD3 FF         |IMUL EDX,EBX,-1                         ; <-------------------
00427A93    71 05           |JNO SHORT echap515.00427A9A
00427A95    E8 96AFFDFF     |CALL echap515.00402A30
00427A9A    8BDA            |MOV EBX,EDX
00427A9C    40              |INC EAX                                 ; EAX++
00427A9D    4E              |DEC ESI                                 ; ESI--
00427A9E  ^ 75 C9           \JNZ SHORT echap515.00427A69
00427AA0    81F3 78563412   XOR EBX,12345678                         ; 经上面循环体得到的EBX^0X12345678
00427AA6    8D55 F0         LEA EDX,DWORD PTR SS:[EBP-10]
00427AA9    8BC3            MOV EAX,EBX
00427AAB    E8 44E9FDFF     CALL echap515.004063F4                   ; 这个CALL作用是把EBX的16进制的数转化为10进数
00427AB0    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]            ; ASCII "998964017"
00427AB3    E8 F8BCFDFF     CALL echap515.004037B0                   ; 这个CALL是计算10进制数有几位数把给了EAX
00427AB8    8BF0            MOV ESI,EAX                              ; EAX存的是10进制的位数,传给ESI让它做下面循环体控制参数
00427ABA    85F6            TEST ESI,ESI
00427ABC    7E 38           JLE SHORT echap515.00427AF6
00427ABE    8BC3            /MOV EAX,EBX                             ; 把上面循环体得的EBX的值给EAX
00427AC0    B9 0A000000     |MOV ECX,0A                              ; ECX置0X0A
00427AC5    99              |CDQ                                     ; EDX清0
00427AC6    F7F9            |IDIV ECX                                ; EAX/0X0A
00427AC8    6215 3C7B4200   |BOUND EDX,QWORD PTR DS:[427B3C]
00427ACE    8A92 84884200   |MOV DL,BYTE PTR DS:[EDX+428884]         ; EAX/0X0A得到的佘数做为取出密码列表中的字符的参数用
00427AD4    8D45 F0         |LEA EAX,DWORD PTR SS:[EBP-10]
00427AD7    E8 FCBBFDFF     |CALL echap515.004036D8
00427ADC    8B55 F0         |MOV EDX,DWORD PTR SS:[EBP-10]
00427ADF    8D45 F4         |LEA EAX,DWORD PTR SS:[EBP-C]
00427AE2    E8 D1BCFDFF     |CALL echap515.004037B8
00427AE7    8BC3            |MOV EAX,EBX                             ; EAX=EBX
00427AE9    B9 0A000000     |MOV ECX,0A                              ; ECX置0X0A
00427AEE    99              |CDQ                                     ; EDX清0
00427AEF    F7F9            |IDIV ECX                                ; EAX/0X0A
00427AF1    8BD8            |MOV EBX,EAX                             ; EAX/0X0A得到的整数部分给EBX做下次循环
00427AF3    4E              |DEC ESI                                 ; ESI--
00427AF4  ^ 75 C8           \JNZ SHORT echap515.00427ABE
00427AF6    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
00427AF9    8B55 F8         MOV EDX,DWORD PTR SS:[EBP-8]
00427AFC    E8 BFBDFDFF     CALL echap515.004038C0                   ; 这个相当strcmp
00427B01    75 07           JNZ SHORT echap515.00427B0A              ; 用户名算出的注册码和我们输入的注册码相不实现
00427B03    BB 4E61BC00     MOV EBX,0BC614E                          ; EBX就置了0X0BC614E
00427B08    EB 05           JMP SHORT echap515.00427B0F
00427B0A    BB 91D61200     MOV EBX,12D691
00427B0F    33C0            XOR EAX,EAX
00427B11    5A              POP EDX
00427B12    59              POP ECX
00427B13    59              POP ECX
00427B14    64:8910         MOV DWORD PTR FS:[EAX],EDX
00427B17    68 317B4200     PUSH echap515.00427B31
00427B1C    8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]
00427B1F    BA 04000000     MOV EDX,4
00427B24    E8 2FBAFDFF     CALL echap515.00403558
00427B29    C3              RETN
00427B2A  ^ E9 A9B4FDFF     JMP echap515.00402FD8
00427B2F  ^ EB EB           JMP SHORT echap515.00427B1C
00427B31    8BC3            MOV EAX,EBX                             ;这实现EAX=EBX=0X0BC614E~~~~~
00427B33    5E              POP ESI
00427B34    5B              POP EBX
00427B35    8BE5            MOV ESP,EBP
00427B37    5D              POP EBP
00427B38    C3              RETN
############################################################################
呵呵我就来说说这个CRACKME的算法吧!!!
1.作者在CRACKME中设置了两个字符串列表A B,一个字符串列表A和我们输入用户名进行运算.
2.在把字符串列表A和我们输入用户名进行运算得到的16进制数转化10进制数,计算出这个10进制数的位数。用作循环取密码列表B中字符的参数。
3.把我们字符串列表A和我们输入用户名进行运算的结果/0X0A的佘数N作为从字符列表B取出第N位的字符。10进制数的位数用作了控制从字符列表B取多少个字符。

c++算法注册机的代码
#include <iostream>
using namespace std;
void main()
{  
        char a[10];                                     //用来接收用户名的!!
        char b[]="LANNYDIBANDINGINANAKEKHYANGNGENTOT";  //这组字符串是用来参加和用户名的运算的!
        char c[]="LANNY5646521";                        //这组字符串是密码表。注册码中的字符就从这个表中取出的!!
        cout<<"请输入用户名"<<endl;
        cin>>a;                                         //接收用户名!!!
        int i,d,e,f=0,g,m,w=0;                          //设置变量
        d=strlen(a);                                    //取用户名的位数
        for(i=0;i<d;i++)                                //把用户名的位数做为控制这个FOR的次数
        {
      f=f+a;                                     //用户名的字符加F变量中的值!!!
          f=f<<8;                                       //逻辑左移8位!!!
      f=f|b;                                     //得的结果和固定字符串相逻辑或
          if(f<0)f=-f;                                  //--------->保证结果是大于0的数
          else f=f;                                     //<-------------
         
        }
    m=f=f^0X12345678;                               //上次运算的结果逻辑异或 0X12345678!!!
    cout<<f<<endl;                                  //这个输出我是用来看看结果是否和OD中运算出的一样!!!
    while(m>0)                                      //----------->
        {                                               //这个是用来计算我们算的结果转化为10进制数后
                m=m/0X0A;                                   //有多少位数。它的位数要参加下面代码 的运算
                w++;                                        //用来控下个FOR的运算次数。
        }                                                //<-----------------
        cout<<w<<endl;                                  //呵呵这个也用来测试的!!!
        for(g=0;g<w;g++)
        {
                e=f%0X0A;                                   //取佘数
                f=f/0X0A;                                   //把/0经0A的结果给F用做个次运算!!
        cout<<c[e];                                 //
        }
     
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
知道 带学习下,
2011-3-21 19:38
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最近朋友好像很活跃
2011-4-2 12:49
0
游客
登录 | 注册 方可回帖
返回
//