首页
社区
课程
招聘
[原创]ty123 Crackme 5 (适合新手练习)
2007-2-4 00:05 8274

[原创]ty123 Crackme 5 (适合新手练习)

2007-2-4 00:05
8274
======== ty123 Crackme 5 ========

作者:ty123[DFCG]

邮件:soy_ty123@163.com

语言:Win32汇编语言

难度:1/10

适用的操作平台:WinXP/Win2K

文件:
        - SRC.zip - 源代码
        - ty123 Crackme5.exe
        - Readme.txt

破解规则:
        - 编制破解教程
        - 不建议修改程序 (patching is not recommended)       
        - 破解后程序应能正确显示成功信息

说明:
        - 破解成功后程序会自动解密goodboy信息
        - Crackme 5适合初学者练习
        - 源代码已加密,待比较好的教程贴出后放出密码 ;-)

致谢:
        - DFCG的老大“我要”及全体成员
        - Kanxue及论坛的道友们

ty123

2007年2月4日

crackme暂时放在:
http://crackmes.ys168.com

烦请那位大侠传在这里,谢谢!

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

收藏
免费 7
打赏
分享
最新回复 (21)
雪    币: 309
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
mingren 1 2007-2-4 00:17
2
0
今天先下载了,睡觉起来在看看
雪    币: 377
活跃值: (427)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
yinX 2 2007-2-4 01:05
3
0
我解不了......
我菜鸟都不如啊....
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老神树 2007-2-4 09:32
4
0
昨天晚上ys168不能传文件,现在补上。crackme5下载地址:
http://crackmes.ys168.com
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
紫色缘 7 2007-2-4 11:38
5
0
最初由 老神树 发布
昨天晚上ys168不能传文件,现在补上。crackme5下载地址:
http://crackmes.ys168.com


本地下载
上传的附件:
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老神树 2007-2-4 11:42
6
0
Originally posted by 紫色缘
本地下载


感谢 紫色缘 大侠!

欢迎讨论
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
紫色缘 7 2007-2-4 12:19
7
0
004011E1  |.  8B75 08       mov     esi, [ebp+8]
004011E4  |>  8A07          /mov     al, [edi]
004011E6  |.  47            |inc     edi
004011E7  |.  0AC0          |or      al, al
004011E9  |.^ 75 F9         \jnz     short 004011E4
004011EB  |.  2BF7          sub     esi, edi
004011ED  |.  33DB          xor     ebx, ebx
004011EF  |.  03FE          add     edi, esi
004011F1  |.  33D2          xor     edx, edx
004011F3  |.  F7D6          not     esi
004011F5  |.  EB 23         jmp     short 0040121A
004011F7  |>  8A07          /mov     al, [edi]
004011F9  |.  3C 41         |cmp     al, 41
004011FB  |.  72 0C         |jb      short 00401209
004011FD  |.  2C 57         |sub     al, 57
004011FF  |.  80D2 00       |adc     dl, 0
00401202  |.  C0E2 05       |shl     dl, 5
00401205  |.  02C2          |add     al, dl
00401207  |.  EB 02         |jmp     short 0040120B
00401209  |>  2C 30         |sub     al, 30
0040120B  |>  8D4E FF       |lea     ecx, [esi-1]
0040120E  |.  83E0 0F       |and     eax, 0F
00401211  |.  C1E1 02       |shl     ecx, 2
00401214  |.  D3E0          |shl     eax, cl
00401216  |.  03D8          |add     ebx, eax
00401218  |.  47            |inc     edi                       ;  ty123_Cr.0040314F
00401219  |.  4E            |dec     esi
0040121A  |>  0BF6           or      esi, esi
0040121C  |.^ 75 D9         \jnz     short 004011F7
0040121E  |.  8BC3          mov     eax, ebx

乱搞的,呵呵,没仔细看
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flyin 2007-2-4 12:21
8
0
004010D2   .  85C0          test  eax,eax       判断有无输入数据
004010D4   .  0F84 92000000 je      0040116C
004010DA   .  C1E0 08       shl     eax, 8
004010DD   .  66:3D 0020    cmp     ax, 2000
004010E1   .  0F8F 85000000 jg      0040116C                         ;  输入长度小于13
004010E7   .  8D35 F9304000 lea     esi, dword ptr [4030F9]
004010ED   .  C1E8 08       shr     eax, 8
004010F0   .  91            xchg    eax, ecx
004010F1   .  33C0          xor     eax, eax
004010F3   .  33D2          xor     edx, edx
004010F5   >  AC            lods    byte ptr [esi]
004010F6   .  03D0          add     edx, eax
004010F8   .^ E2 FB         loopd   short 004010F5                   ;  A=输入字符串所有ASCII相加
004010FA   .  3315 B4314000 xor     edx, dword ptr [4031B4]          ;  A与4C1BD645异或
00401100   .  52            push    edx
00401101   .  8D3D A6114000 lea     edi, dword ptr [4011A6]
00401107   .  68 2B314000   push    0040312B
0040110C   .  68 80000000   push    80
00401111   .  EB 05         jmp     short 00401118
00401113   .  44 46 43 47 0>ascii   "DFCG",0
00401118   >  83EF 04       sub     edi, 4
0040111B   .  FFD7          call    edi
0040111D   .  83E8 08       sub     eax, 8
00401120   .  8D90 2B314000 lea     edx, dword ptr [eax+40312B]
00401126   .  52            push    edx
00401127   .  E8 AC000000   call    004011D8
0040112C   .  5A            pop     edx
0040112D   .  33C2          xor     eax, edx                         ;  这里必须 eax=edx,否则结束
0040112F   .  75 3B         jnz     short 0040116C

接下来就搞不明白了
00401127   .  E8 AC000000   call    004011D8
这个CALL的作用哪位高手分析一下。。。偶实在太菜
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
KAN 6 2007-2-4 13:14
9
0
004010F5        > /AC            LODS BYTE PTR DS:[ESI]           
004010F6        . |03D0          ADD EDX,EAX
004010F8        .^\E2 FB         LOOPD SHORT ty123_Cr.004010F5

上面这个循环,我就算输入了很大的数值,也不可能跟下面这个数值一样啊

004010FA        .  3315 B4314000 XOR EDX,DWORD PTR DS:[4031B4]

这个数值我试了几次,它的内存数值都是 40DF1B77
――――――――――――――――――――――――――――――――――――――――
00401100        .  52            PUSH EDX                        

0040112C        .  5A            POP EDX
0040112D        .  33C2          XOR EAX,EDX                        ;  这里要 EAX 和 EDX 相等
0040112F           75 3B         JNZ SHORT ty123_Cr.0040116C

但 EAX 的数值,我试了从各方面的输入的数值都不达标,可以来一个合格的注册码来试练一下吗

还有7楼的 MM 发的只是生成 EAX 数值的代码段
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
紫色缘 7 2007-2-4 13:22
10
0
最初由 KAN 发布
还有7楼的 MM 发的只是生成 EAX 数值的代码段



啥时候成MM了
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
KAN 6 2007-2-4 13:34
11
0
啊,搞错了
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
紫色缘 7 2007-2-4 13:39
12
0
不过我挺喜欢MM的
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
KAN 6 2007-2-4 14:12
13
0
哦,我也有这个爱好啊,同行了
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
fonge 5 2007-2-4 15:32
14
0
我也是
不过我没你们老
机会一大把
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老神树 2007-2-4 18:18
15
0
Originally posted by KAN
004010F5 > /AC LODS BYTE PTR DS:[ESI]
004010F6 . |03D0 ADD EDX,EAX
004010F8 .^\E2 FB LOOPD SHORT ty123_Cr.004010F5

上面这个循环,我就算输入了很大的数值,也不可能跟下面这个数值一样啊
........


紧接着不是有一个xor么?那就很容易达到“那个”数值。

用了一点常见的花指令,没几行代码,仔细看看就明白啦,呵呵。

提示:看看crackme5用了哪些API... good luck!
雪    币: 226
活跃值: (30)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
流动的情感 4 2007-2-4 19:49
16
0
 这个算法可能有问题。

偶的磁盘序号为
14901EF6H

我是解压在ty123 crackme5文件夹下
经计算 crackme5字符后 
得出 6575BB3DH
6575BB3DH xor 14901EF6H = DF3C5813H

要得出这个数的字符 那得多少个注册码呀.....
不知道是不是我弄错了..

分析如下

  004010CD   > \83EF 08       sub     edi, 8
  004010D0   .  FFD7          call    edi                              ;  
  004010D2   .  85C0          test    eax, eax
  004010D4   .  0F84 92000000 je      0040116C
  004010DA   .  C1E0 08       shl     eax, 8                           ;  Count shl 8
  004010DD   .  66:3D 0020    cmp     ax, 2000
  004010E1   .  0F8F 85000000 jg      0040116C                         ;  ax > 2000 跳走 注册码最大32位
  004010E7   .  8D35 F9304000 lea     esi, [4030F9]                    ;  输入序列号
  004010ED   .  C1E8 08       shr     eax, 8                           ;  EAX = 序列号个数
  004010F0   .  91            xchg    eax, ecx                         ;  放入 ECX 循环次数
  004010F1   .  33C0          xor     eax, eax
  004010F3   .  33D2          xor     edx, edx
  004010F5   >  AC            lods    byte ptr [esi]
  004010F6   .  03D0          add     edx, eax                         ;  edx += eax  将序列号的 ascii 码相加
  004010F8   .^ E2 FB         loopd   short 004010F5
  004010FA   .  3315 B4314000 xor     edx, [4031B4]                    ;  xor C:\序号 GetVolumeInformation
  
  [4031B4] 哪里来的呢? 先在这个内存处下个硬件写断点 
  重新启动程序 发现 该内存 原来是用 GetVolumeInformation 获取 C:\ 的序号
  
  00401100   .  52            push    edx                              ;  保存 edx s
  00401101   .  8D3D A6114000 lea     edi, [4011A6]
  00401107   .  68 2B314000   push    0040312B
  0040110C   .  68 80000000   push    80
  00401111   .  EB 05         jmp     short 00401118
  00401113   .  44 46 43 47 0>ascii   "DFCG",0
  00401118   >  83EF 04       sub     edi, 4
  0040111B   .  FFD7          call    edi                              ;  获取当前目录
  0040111D   .  83E8 08       sub     eax, 8                           ;  目录值 - 8
  00401120   .  8D90 2B314000 lea     edx, [eax+40312B]                ;  取当前目录的最后面8个字符
  00401126   .  52            push    edx
  00401127   .  E8 AC000000   call    004011D8                         ;  将字符计算得到一个数字
  0040112C   .  5A            pop     edx
  0040112D   .  33C2          xor     eax, edx                         ;  将值 xor s
  0040112F      75 3B         jnz     short 0040116C                   ;  爆破点 s != 算出值 出错
  
  
  再看看 00401127   .  E8 AC000000   call    004011D8 是如何计算的
  
  004011DE  |.  8B7D 08       mov     edi, [ebp+8]                     ;  后面八个字符
  004011E1  |.  8B75 08       mov     esi, [ebp+8]
  004011E4  |>  8A07          /mov     al, [edi]
  004011E6  |.  47            |inc     edi
  004011E7  |.  0AC0          |or      al, al
  004011E9  |.^ 75 F9         \jnz     short 004011E4                  ;  有可能少于八个字符
  004011EB  |.  2BF7          sub     esi, edi                         ;  esi -= edi 取长度
  004011ED  |.  33DB          xor     ebx, ebx
  004011EF  |.  03FE          add     edi, esi                         ;  edi += esi 还原edi重新指向字符串头
  004011F1  |.  33D2          xor     edx, edx
  004011F3  |.  F7D6          not     esi                              ;  not esi (esi 实际长度)
  004011F5  |.  EB 23         jmp     short 0040121A
  004011F7  |>  8A07          /mov     al, [edi]
  004011F9  |.  3C 41         |cmp     al, 41                          ;  al < 41(A)
  004011FB  |.  72 0C         |jb      short 00401209
  004011FD  |.  2C 57         |sub     al, 57                          ;  al - 57(W)
  004011FF  |.  80D2 00       |adc     dl, 0
  00401202  |.  C0E2 05       |shl     dl, 5
  00401205  |.  02C2          |add     al, dl                          ;  al += dl(dl=0)
  00401207  |.  EB 02         |jmp     short 0040120B
  00401209  |>  2C 30         |sub     al, 30
  0040120B  |>  8D4E FF       |lea     ecx, [esi-1]
  0040120E  |.  83E0 0F       |and     eax, 0F                         ;  and 0F 取字节
  00401211  |.  C1E1 02       |shl     ecx, 2
  00401214  |.  D3E0          |shl     eax, cl
  00401216  |.  03D8          |add     ebx, eax
  00401218  |.  47            |inc     edi
  00401219  |.  4E            |dec     esi
  0040121A  |>  0BF6           or      esi, esi
  0040121C  |.^ 75 D9         \jnz     short 004011F7
  0040121E  |.  8BC3          mov     eax, ebx  
  
---------------------------------------------------------------
  1.将输入序列号的ascii码相加 再xor磁盘序号 得到 D1
  2.获取软件目录的后八位字符 s 算出一个数 D2
  D1 != D2 序列号无效
  
  计算方法 
  先计算出 D2
 function Calc(Value: string) : DWORD;
 var
   i,k : Integer;
   p : DWORD;
 begin
  Result := 0;   
   for i := 1 to Length(Value) do
  begin
     if Value[i] < 'A' then
     begin
        p := Ord(Value[i]) - Ord('0');
     end
     else
     begin
       p := Ord(Value[i]) - Ord('W');
     end;
     k := Length(Value) - (i-1) - 1;
     k := k shl 2;      
     p := p and $0F;
     p := p shl k;

     Result := Result + p;
  end;  
 end;
  然后 D2 xor 磁盘序号 得到 数字 D3
  
  只要使生成的注册码ascii码的和 = D3 就可以了
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老神树 2007-2-5 08:55
17
0
Originally posted by 流动的情感
我是解压在ty123 crackme5文件夹下
经计算 crackme5字符后 
得出 6575BB3DH
6575BB3DH xor 14901EF6H = DF3C5813H........


分析很详细,不错!

BIG hint: 现在的问题是这个“0DF3C5813h”(注意:不是说你逆推的这个0DF3C5813h就是正确的,再仔细看看 ;))写在什么地方才能让程序自己找到。

要得出这个数的字符 那得多少个注册码呀.....
不知道是不是我弄错了..


再仔细看看,对一个用户名(User Name)只可能有一个对应的注册码。

0040112D . 33C2 xor eax, edx ; 将值 xor s
0040112F 75 3B jnz short 0040116C ; 爆破点 s != 算出值 出错..


你试着爆破了吗?是不是可以正常显示Goodboy信息? ;-)

[QUOTE]获取软件目录的后八位字符 s 算出一个数 D2
  D1 != D2 序列号无效[QUOTE]

这个很关键,你找到了,祝贺!

离成功只有一步之遥了,期待你完整的solution。
雪    币: 209
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
小糊涂神 1 2007-2-5 09:37
18
0
都是高手啊~!・~!~
雪    币: 220
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yugung 1 2007-2-5 10:22
19
0
发个注册机代码吧,比较简陋,将就看吧.
#include <stdio.h>
#include <string.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    char Name[33],SN[9]={0};
    int NameLen;
    long sum=0;
    unsigned long CdiskVolSN;
    printf("Input your Name:");
    scanf("%s",Name);
    NameLen=strlen(Name);
    if(NameLen>32)
    {
        printf("\nName Tooooooo Long\n" );
        return 1;
    }
    for(int i=0;i<NameLen;i++)
    {
        sum+=Name[i];
    }
    GetVolumeInformationA(
    "c:\\",
    0,0,
    &CdiskVolSN,
    0,0,0,0);
    sum^=CdiskVolSN;
    sprintf(SN,"%X",sum);
    printf("\nIn order to Pass the check,\nChange your Dir Name to: 00000000%s",SN);

    return 0;
}
本代码由xTiNt自动着色 http://kbadboy.yeah.net

btw:可能没有时间写tut了,寒假去了
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老神树 2007-2-5 10:56
20
0
Originally posted by yugung
发个注册机代码吧,比较简陋,将就看吧
sprintf(SN,"%X",sum);
printf("\nIn order to Pass the check,\nChange your Dir Name to: 0%s",SN);
........


正解!

建议流动的情感跟yugung另开贴整理一下,完成后将发源代码的解压密码。;-)
雪    币: 226
活跃值: (30)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
流动的情感 4 2007-2-5 14:16
21
0
....原来是在文件夹上做文章......
哈。 偶的脑子转不过来,以为什么文件夹都可以 现在终于明白了......
非常感谢~~~
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
windtrace 2007-2-5 14:40
22
0
有没有搞错,你们破的和我下载的是同一个文件吗,我是从ys168上下的,跟你们说的根本不一样,晕
游客
登录 | 注册 方可回帖
返回