首页
社区
课程
招聘
一个比较典型的CRACKME的算法分析(适合新手)
2006-2-6 12:52 7617

一个比较典型的CRACKME的算法分析(适合新手)

2006-2-6 12:52
7617
------------------------------------------------------------
1)PEID查壳,Borland Delphi 6.0 - 7.0,无壳。
2)试运行程序,任意输入注册信息后没有错误提示。
3)OD载入程序,用“超级字符串查找”发现有注册成功的提示。
超级字串参考+        , 条目 62
地址=00408E6D
反汇编=PUSH CodeFant.00408FB8
文本字串=恭喜您,注册码正确!
4)找到突破口了,双击来到00408E6D处,
发现有两个地方使用了GetDlgItemTextA,好!那就在第一处(00408DDC)这里下断。
运行程序,任意输入信息后,点击确定程序被中断。
00408DDC  |> \68 FF000000   PUSH 0FF                                 ; /Count = FF (255.); Case 3EA of switch 00408DBB
00408DE1  |.  68 9CA24000   PUSH CodeFant.0040A29C                   ; |Buffer = CodeFant.0040A29C
00408DE6  |.  68 F2030000   PUSH 3F2                                 ; |ControlID = 3F2 (1010.)
00408DEB  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ; |
00408DEE  |.  50            PUSH EAX                                 ; |hWnd
00408DEF  |.  E8 68B9FFFF   CALL <JMP.&user32.GetDlgItemTextA>       ; \GetDlgItemTextA
00408DF4  |.  8D45 B4       LEA EAX,DWORD PTR SS:[EBP-4C]            ;  取注册名位数
00408DF7  |.  BA 9CA24000   MOV EDX,CodeFant.0040A29C
00408DFC  |.  B9 FF000000   MOV ECX,0FF
00408E01  |.  E8 6AAAFFFF   CALL CodeFant.00403870
00408E06  |.  837D B4 00    CMP DWORD PTR SS:[EBP-4C],0
00408E0A  |.  0F84 9E000000 JE CodeFant.00408EAE
00408E10  |.  68 FF000000   PUSH 0FF                                 ; /Count = FF (255.)
00408E15  |.  68 9CA34000   PUSH CodeFant.0040A39C                   ; |Buffer = CodeFant.0040A39C
00408E1A  |.  68 F3030000   PUSH 3F3                                 ; |ControlID = 3F3 (1011.)
00408E1F  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ; |
00408E22  |.  50            PUSH EAX                                 ; |hWnd
00408E23  |.  E8 34B9FFFF   CALL <JMP.&user32.GetDlgItemTextA>       ; \GetDlgItemTextA
00408E28  |.  8D45 AC       LEA EAX,DWORD PTR SS:[EBP-54]            ;  取注册码位数
00408E2B  |.  BA 9CA24000   MOV EDX,CodeFant.0040A29C
00408E30  |.  B9 FF000000   MOV ECX,0FF
00408E35  |.  E8 36AAFFFF   CALL CodeFant.00403870
00408E3A  |.  8B45 AC       MOV EAX,DWORD PTR SS:[EBP-54]
00408E3D  |.  8D55 B0       LEA EDX,DWORD PTR SS:[EBP-50]
00408E40  |.  E8 23FCFFFF   CALL CodeFant.00408A68                   ;  算法CALL,进!
00408E45  |.  8B45 B0       MOV EAX,DWORD PTR SS:[EBP-50]
00408E48  |.  50            PUSH EAX
00408E49  |.  8D45 A8       LEA EAX,DWORD PTR SS:[EBP-58]
00408E4C  |.  BA 9CA34000   MOV EDX,CodeFant.0040A39C
00408E51  |.  B9 FF000000   MOV ECX,0FF
00408E56  |.  E8 15AAFFFF   CALL CodeFant.00403870
00408E5B  |.  8B55 A8       MOV EDX,DWORD PTR SS:[EBP-58]
00408E5E  |.  58            POP EAX
00408E5F  |.  E8 84ABFFFF   CALL CodeFant.004039E8                   这个CALL作用是将注册码和输入的假码进行比较
00408E64  |.  75 48         JNZ SHORT CodeFant.00408EAE              若不相等则跳向失败,相等则成功
00408E66  |.  6A 40         PUSH 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00408E68  |.  68 AC8F4000   PUSH CodeFant.00408FAC                   ; |注册提示
00408E6D  |.  68 B88F4000   PUSH CodeFant.00408FB8                   ; |恭喜您,注册码正确!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入00408E40 处的CALL,来到这里
00408A68  /$  55            PUSH EBP
。。。。。。省略一些无关的代码。
00408AAB  |.  7E 28         JLE SHORT CodeFant.00408AD5
00408AAD  |.  BE 01000000   MOV ESI,1
00408AB2  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]              EBP-4=用户名
00408AB5  |.  33DB          |XOR EBX,EBX                               EBX清零
00408AB7  |.  8A5C30 FF     |MOV BL,BYTE PTR DS:[EAX+ESI-1]            取用户名每一位进行计算
00408ABB  |.  43            |INC EBX                                   EBX+1  注意这里的+1
00408ABC  |.  8D45 D8       |LEA EAX,DWORD PTR SS:[EBP-28]
00408ABF  |.  8BD3          |MOV EDX,EBX
00408AC1  |.  E8 2EADFFFF   |CALL CodeFant.004037F4
00408AC6  |.  8B55 D8       |MOV EDX,DWORD PTR SS:[EBP-28]
00408AC9  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
00408ACC  |.  E8 D3ADFFFF   |CALL CodeFant.004038A4
00408AD1  |.  46            |INC ESI                                   ESI+1
00408AD2  |.  4F            |DEC EDI                                   EDI-1
00408AD3  |.^ 75 DD         \JNZ SHORT CodeFant.00408AB2             计算完了吗?没有则继续
00408AD5  |>  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]            
00408AD8  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]             EBP-C=第一步计算的结果设为A
00408ADB  |.  E8 E0ABFFFF   CALL CodeFant.004036C0
00408AE0  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
00408AE3  |.  E8 40ABFFFF   CALL CodeFant.00403628
00408AE8  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
00408AEB  |.  E8 ACADFFFF   CALL CodeFant.0040389C
00408AF0  |.  8BF8          MOV EDI,EAX
00408AF2  |.  85FF          TEST EDI,EDI
00408AF4  |.  7E 2A         JLE SHORT CodeFant.00408B20
00408AF6  |.  BE 01000000   MOV ESI,1
00408AFB  |>  8B45 F0       /MOV EAX,DWORD PTR SS:[EBP-10]            EBP-10=将注册名计算的结果,设为A
00408AFE  |.  33DB          |XOR EBX,EBX                              EBX清零
00408B00  |.  8A5C30 FF     |MOV BL,BYTE PTR DS:[EAX+ESI-1]           取A的每一位进行计算
00408B04  |.  83C3 02       |ADD EBX,2                                每计算一次EBX+2 注意这里的+2
00408B07  |.  8D45 D4       |LEA EAX,DWORD PTR SS:[EBP-2C]
00408B0A  |.  8BD3          |MOV EDX,EBX
00408B0C  |.  E8 E3ACFFFF   |CALL CodeFant.004037F4
00408B11  |.  8B55 D4       |MOV EDX,DWORD PTR SS:[EBP-2C]
00408B14  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
00408B17  |.  E8 88ADFFFF   |CALL CodeFant.004038A4
00408B1C  |.  46            |INC ESI                                 ESI+1
00408B1D  |.  4F            |DEC EDI                                 EDI-1
00408B1E  |.^ 75 DB         \JNZ SHORT CodeFant.00408AFB             计算完了吗?没有则继续
00408B20  |>  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
00408B23  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]             EBP-C=将A计算的结果,设为B
00408B26  |.  E8 95ABFFFF   CALL CodeFant.004036C0
00408B2B  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
00408B2E  |.  E8 F5AAFFFF   CALL CodeFant.00403628
00408B33  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
00408B36  |.  E8 61ADFFFF   CALL CodeFant.0040389C
00408B3B  |.  8BF8          MOV EDI,EAX
00408B3D  |.  85FF          TEST EDI,EDI
00408B3F  |.  7E 2A         JLE SHORT CodeFant.00408B6B
00408B41  |.  BE 01000000   MOV ESI,1
00408B46  |>  8B45 EC       /MOV EAX,DWORD PTR SS:[EBP-14]             EBP-14=B
00408B49  |.  33DB          |XOR EBX,EBX                               EBX清零
00408B4B  |.  8A5C30 FF     |MOV BL,BYTE PTR DS:[EAX+ESI-1]            取B的每一位进行计算
00408B4F  |.  83C3 03       |ADD EBX,3                                 每计算一次EBX+3 注意这里的+3
00408B52  |.  8D45 D0       |LEA EAX,DWORD PTR SS:[EBP-30]
00408B55  |.  8BD3          |MOV EDX,EBX
00408B57  |.  E8 98ACFFFF   |CALL CodeFant.004037F4
00408B5C  |.  8B55 D0       |MOV EDX,DWORD PTR SS:[EBP-30]
00408B5F  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
00408B62  |.  E8 3DADFFFF   |CALL CodeFant.004038A4
00408B67  |.  46            |INC ESI                                  ESI+1
00408B68  |.  4F            |DEC EDI                                  EDI-1
00408B69  |.^ 75 DB         \JNZ SHORT CodeFant.00408B46              计算完了吗?没有则继续
00408B6B  |>  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
00408B6E  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]              EBP-C=将B计算的结果,设为C
00408B71  |.  E8 4AABFFFF   CALL CodeFant.004036C0
00408B76  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
00408B79  |.  E8 AAAAFFFF   CALL CodeFant.00403628
00408B7E  |.  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
00408B81  |.  E8 16ADFFFF   CALL CodeFant.0040389C
00408B86  |.  8BF8          MOV EDI,EAX
00408B88  |.  85FF          TEST EDI,EDI
00408B8A  |.  7E 2A         JLE SHORT CodeFant.00408BB6
00408B8C  |.  BE 01000000   MOV ESI,1
00408B91  |>  8B45 E8       /MOV EAX,DWORD PTR SS:[EBP-18]            EBP-18=C
00408B94  |.  33DB          |XOR EBX,EBX                              EBX清零
00408B96  |.  8A5C30 FF     |MOV BL,BYTE PTR DS:[EAX+ESI-1]           取C的每一位进行计算
00408B9A  |.  83C3 04       |ADD EBX,4                                每计算一次EBX+4    注意这里的+4
00408B9D  |.  8D45 CC       |LEA EAX,DWORD PTR SS:[EBP-34]
00408BA0  |.  8BD3          |MOV EDX,EBX
00408BA2  |.  E8 4DACFFFF   |CALL CodeFant.004037F4
00408BA7  |.  8B55 CC       |MOV EDX,DWORD PTR SS:[EBP-34]
00408BAA  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
00408BAD  |.  E8 F2ACFFFF   |CALL CodeFant.004038A4
00408BB2  |.  46            |INC ESI                                  ESI+1
00408BB3  |.  4F            |DEC EDI                                  EDI-1
00408BB4  |.^ 75 DB         \JNZ SHORT CodeFant.0040 P-1C]            计算完了吗?没有则继续
00408BB9  |.  E8 6AAAFFFF   CALL CodeFant.00403628
00408BBE  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]              EBP-C=将C计算后的结果,设为D
00408BC1  |.  E8 D6ACFFFF   CALL CodeFant.0040389C
00408BC6  |.  8BF8          MOV EDI,EAX
00408BC8  |.  4F            DEC EDI
00408BC9  |.  85FF          TEST EDI,EDI
00408BCB  |.  7C 4E         JL SHORT CodeFant.00408C1B
00408BCD  |.  47            INC EDI
00408BCE  |.  33F6          XOR ESI,ESI
00408BD0  |>  8D45 DC       /LEA EAX,DWORD PTR SS:[EBP-24]
00408BD3  |.  50            |PUSH EAX                                
00408BD4  |.  8B45 F4       |MOV EAX,DWORD PTR SS:[EBP-C]           EBP-C=D
00408BD7  |.  0FB60430      |MOVZX EAX,BYTE PTR DS:[EAX+ESI]        将D的每一位转换成对应的16进制数
00408BDB  |.  8945 C4       |MOV DWORD PTR SS:[EBP-3C],EAX          EBP-3C=转换后的结果设为E
00408BDE  |.  C645 C8 00    |MOV BYTE PTR SS:[EBP-38],0              
00408BE2  |.  8D55 C4       |LEA EDX,DWORD PTR SS:[EBP-3C]           
00408BE5  |.  33C9          |XOR ECX,ECX                            ECX清零     
00408BE7  |.  B8 608C4000   |MOV EAX,CodeFant.00408C60               
00408BEC  |.  E8 1FD1FFFF   |CALL CodeFant.00405D10                  
00408BF1  |.  8B45 DC       |MOV EAX,DWORD PTR SS:[EBP-24]
00408BF4  |.  E8 A3ACFFFF   |CALL CodeFant.0040389C
00408BF9  |.  48            |DEC EAX
00408BFA  |.  75 10         |JNZ SHORT CodeFant.00408C0C
00408BFC  |.  8D45 DC       |LEA EAX,DWORD PTR SS:[EBP-24]
00408BFF  |.  8B4D DC       |MOV ECX,DWORD PTR SS:[EBP-24]
00408C02  |.  BA 6C8C4000   |MOV EDX,CodeFant.00408C6C              
00408C07  |.  E8 DCACFFFF   |CALL CodeFant.004038E8
00408C0C  |>  8D45 E0       |LEA EAX,DWORD PTR SS:[EBP-20]
00408C0F  |.  8B55 DC       |MOV EDX,DWORD PTR SS:[EBP-24]
00408C12  |.  E8 8DACFFFF   |CALL CodeFant.004038A4
00408C17  |.  46            |INC ESI                                ESI+1
00408C18  |.  4F            |DEC EDI                                EDI-1
00408C19  |.^ 75 B5         \JNZ SHORT CodeFant.00408BD0            计算完了吗?没有则继续
00408C1B  |>  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00408C1E  |.  8B55 E0       MOV EDX,DWORD PTR SS:[EBP-20]
00408C21  |.  E8 56AAFFFF   CALL CodeFant.0040367C
00408C26  |.  33C0          XOR EAX,EAX
00408C28  |.  5A            POP EDX
00408C29  |.  59            POP ECX
00408C2A  |.  59            POP ECX
00408C2B  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
00408C2E  |.  68 508C4000   PUSH CodeFant.00408C50
00408C33  |>  8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
00408C36  |.  BA 0B000000   MOV EDX,0B
00408C3B  |.  E8 0CAAFFFF   CALL CodeFant.0040364C
00408C40  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
00408C43  |.  E8 E0A9FFFF   CALL CodeFant.00403628
00408C48  \.  C3            RETN                                     将E出栈并返回

------------------------------------------------------------------------BY 逍遥风
算法很简单,
1)分别取注册名的每一位进行计算,将结果合并成一个字符串。
2)根据“常用字符ASCII值表”的顺序进行计算。(加密界密第2版)第2页就有这张表。
  从0123456789到xyz { | } ~ 为止。
具体过程是:
1)取注册名的每一位。假设注册名第一位为1
2)第一次计算:根据“常用字符ASCII值表”顺序,取注册名没一位的后一位字符。例:注册名为1,那么就得到2
3)第二次计算:取与2隔一位的字符,这里为4  与00408B04 那里的+2相对应
4)第三次计算:取与4隔两位的字符,这里为7  与00408B4F 那里的+3相对应
5)第四次计算:取与7隔三位的字符,这里为:  与00408B9A 那里的+4相对应
6)第五次计算:将:转换成相应的16进制数,这里为3B,
7)注册码的每一位都重复上面的计算。将每一位的结果合并就为注册码。
例:注册名:   1          2            3           4            5
   第一次计算  2          3            4           5            6
   第二次计算  4          5            6           7            8
   第三次计算  7          8            9           :            ;
   第四次计算  ;          <            =           >            ?
   第五次计算  3B         3C           3D          3E           3F        (根据常用字符ASCII值表)
所以。12345对应的注册码就是3B3C3D3E3F
注意:因为从字母v(小写)开始,按照以上的算法找不出相应的常用字符。所以经过处理
        v   w   x   y   z   {   |    }     △         对应的结果分别是
        80  81  82  83  84  85  86   87    88
------------------------------------------------------------------------
有疏漏或错误之处请大家指出。谢谢
CRACKME放在http://free.ys168.com/?tcxb中的CRACKME(2)

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (12)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AV仔 2006-2-6 14:03
2
0
哦!.......................
雪    币: 32401
活跃值: (18850)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2006-2-9 22:02
3
0
文章不错,逍遥风辛苦了。
顺便将CrackMe转到论坛,因为以后会制作一个CrackMe专辑的。
上传的附件:
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
逍遥风 55 2006-2-10 10:33
4
0
谢谢坛主鼓励。。。我会再接再厉的。呵呵
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jzwjk 2006-2-10 16:52
5
0
还不错的,我是新人!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
endofcool 2006-2-10 21:47
6
0
希望给每个crackme编号,不然下载多了,就搞不清楚了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
situzi 2006-2-11 08:30
7
0
一起学习!!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯孩子 2006-2-11 23:54
8
0
学习 中!~~~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
godhack 2006-4-24 01:22
9
0
god
71796e
嘻嘻...
雪    币: 107
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
linwenfigo 2006-4-26 23:53
10
0
多谢了!!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Joey 2006-5-17 15:36
11
0
小小菜鸟,学习中!
雪    币: 7443
活跃值: (2689)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
netwind 13 2006-5-17 20:58
12
0
//将字符串对应的每个字母加10,得到新串
//然后以%x(16进制)格式列出串的asc码值
//把其中小写字母换成大写。
//就得到key
#include <stdio.h>
void main()
{
        char  s[]="zwfnet",r[80];
        unsigned short s1[80];
        int i=0,k=0;
        while(s[i])
        {
                s1[i]=(unsigned short)s[i]+10;
                int temp=s1[i]/0x10;
                if(temp<10)
                        r[k]=temp+'0';
                else
                        r[k]=temp-10+'a'-32;//-32 使小写字母变为大写字母
                printf("%c",r[k]);
                k++;
        temp=s1[i]%0x10;
                if(temp<10)
                        r[k]=temp+'0';
                else
                        r[k]=temp-10+'a'-32;
                printf("%c",r[k]);
                i++;
                k++;
        }
        printf("\n");
}
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
请注册 2006-5-18 11:02
13
0
从什么地方下手啊
游客
登录 | 注册 方可回帖
返回