吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11006|回复: 21
收起左侧

[原创] [反汇编练习] 160个CrackMe之010

[复制链接]
44018723 发表于 2014-6-18 21:30

[反汇编练习] 160个CrackMe之010.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境和工具

2、程序分析

3、思路分析和破解流程

4、注册机的探索

----------------------------------

提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

----------------------------------

1、工具和环境:

WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

160个CrackMe的打包文件。

下载地址: http://pan.baidu.com/s/1xUWOY  密码: jbnq

注:

1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第10个Andrénalin.3,保存下来。运行程序,程序界面如下:


4.png

3、思路分析和破解流程:

点击【OK】按钮之后,直接弹出了错误信息框(囧,虽然我看不明白说的啥),现象完全和之前的程序一样。使用PEID查看之后,Microsoft Visual Basic 5.0 / 6.0,没有加壳,可以直接放到OD中了!

1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。

2、在exe中输入Key:bbdxf。点击OK按钮,弹出错误信息框,不要关闭。

3、在OD中点击暂停按钮(Ctrl+F2),再点击堆栈K按钮(Ctrl+K),可以看到当前堆栈情况。


1.PNG

4、和之前的一样,我们跟踪信息框所在的代码段,选中rtcMsgBox,右键->Show call,返回到反汇编界面。

5、在返回到的位置向上查看代码,寻找类似cmp,je等跳转信息,同样和之前的程序一样,很容易找到了。


[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
00402050   .  66:85C0       test ax,ax
00402053      0F84 C0000000 je 00402119                                          ;  // 和上一个一样的关键跳
00402059   .  FF15 6C414000 call dword ptr ds:[<&MSVBVM50.#534>]                 ;  msvbvm50.rtcBeep
0040205F   .  8B1D 94414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>]       ;  msvbvm50.__vbaVarDup
00402065   .  B9 0A000000   mov ecx,0xA
0040206A   .  B8 04000280   mov eax,0x80020004
0040206F   .  898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
00402075   .  898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
0040207B   .  8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
00402081   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]
00402084   .  8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
0040208A   .  8985 7CFFFFFF mov dword ptr ss:[ebp-0x84],eax
00402090   .  C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401B28                 ;  UNICODE "RiCHTiG !"
0040209A   .  C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x8
004020A4   .  FFD3          call ebx                                             ;  <&MSVBVM50.__vbaVarDup>
004020A6   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
004020AC   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
004020AF   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401ABC
004020B9   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
004020C3   .  FFD3          call ebx
004020C5   .  8D95 64FFFFFF lea edx,dword ptr ss:[ebp-0x9C]
004020CB   .  8D85 74FFFFFF lea eax,dword ptr ss:[ebp-0x8C]
004020D1   .  52            push edx
004020D2   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]
004020D5   .  50            push eax
004020D6   .  51            push ecx
004020D7   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
004020DA   .  6A 30         push 0x30
004020DC   .  52            push edx
004020DD   .  FF15 24414000 call dword ptr ds:[<&MSVBVM50.#595>]                 ;  msvbvm50.rtcMsgBox
004020E3   .  8D95 14FFFFFF lea edx,dword ptr ss:[ebp-0xEC]
004020E9   .  8D4D AC       lea ecx,dword ptr ss:[ebp-0x54]
004020EC   .  8985 1CFFFFFF mov dword ptr ss:[ebp-0xE4],eax
004020F2   .  C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],0x3
004020FC   .  FFD6          call esi
004020FE   .  8D85 64FFFFFF lea eax,dword ptr ss:[ebp-0x9C]
00402104   .  8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]
0040210A   .  50            push eax
0040210B   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]
0040210E   .  51            push ecx
0040210F   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]
00402112   .  52            push edx
00402113   .  50            push eax
00402114   .  E9 B5000000   jmp 004021CE
00402119   >  8B1D 94414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>]       ;  msvbvm50.__vbaVarDup
0040211F   .  B9 0A000000   mov ecx,0xA
00402124   .  B8 04000280   mov eax,0x80020004
00402129   .  898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
0040212F   .  898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
00402135   .  8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
0040213B   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]
0040213E   .  8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
00402144   .  8985 7CFFFFFF mov dword ptr ss:[ebp-0x84],eax
0040214A   .  C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401C1C                 ;  UNICODE "LEiDER Falsch !  "
00402154   .  C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x8
0040215E   .  FFD3          call ebx                                             ;  <&MSVBVM50.__vbaVarDup>
00402160   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]
00402166   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
00402169   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401B40                 ;  UNICODE "Leider Falsch!   Nochmal veruschen ! Wenn Du es ni"
00402173   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8
0040217D   .  FFD3          call ebx
0040217F   .  8D8D 64FFFFFF lea ecx,dword ptr ss:[ebp-0x9C]
00402185   .  8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
0040218B   .  51            push ecx
0040218C   .  8D45 84       lea eax,dword ptr ss:[ebp-0x7C]
0040218F   .  52            push edx
00402190   .  50            push eax
00402191   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
00402194   .  6A 10         push 0x10
00402196   .  51            push ecx
00402197   .  FF15 24414000 call dword ptr ds:[<&MSVBVM50.#595>]                 ;  msvbvm50.rtcMsgBox


关键的跳转就是 je 00402119 ,在OD中选中这一行,很容易就可以发现JE是否跳转决定了提示的成功与失败!好吧,我们来爆破他!选中je 00402119这一行,右键->Binary->Fill with NOPs。回到exe程序,随意输入一个key,点击【OK】按钮,哈哈,是不是成功啦!
2.png

4、注册码探索
继续向上找,如果看过第9篇的就知道,他们还是基本一样的,请参考009。其中,VB代码反汇编需要参考http://www.cnblogs.com/bbdxf/p/3793545.html,分析之后代码如下:
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
00401F30   .  51            push ecx
00401F31   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]
00401F34   .  52            push edx
00401F35   .  50            push eax
00401F36   .  FF15 14414000 call dword ptr ds:[<&MSVBVM50.__vbaLenVar>]          ;  msvbvm50.__vbaLenVar
00401F3C   .  8D8D 44FFFFFF lea ecx,dword ptr ss:[ebp-0xBC]
00401F42   .  50            push eax
00401F43   .  8D95 ECFEFFFF lea edx,dword ptr ss:[ebp-0x114]
00401F49   .  51            push ecx
00401F4A   .  8D85 FCFEFFFF lea eax,dword ptr ss:[ebp-0x104]
00401F50   .  52            push edx
00401F51   .  8D4D DC       lea ecx,dword ptr ss:[ebp-0x24]
00401F54   .  50            push eax
00401F55   .  51            push ecx
00401F56   .  FF15 1C414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForInit>]      ;  msvbvm50.__vbaVarForInit
00401F5C   .  8B1D 68414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarCat>]       ;  msvbvm50.__vbaVarCat
00401F62   .  8B3D 00414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaFreeVarList>]  ;  msvbvm50.__vbaFreeVarList
00401F68   >  85C0          test eax,eax
00401F6A   .  0F84 BB000000 je 0040202B
00401F70   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
00401F73   .  8D45 DC       lea eax,dword ptr ss:[ebp-0x24]
00401F76   .  52            push edx
00401F77   .  50            push eax
00401F78   .  C745 9C 01000>mov dword ptr ss:[ebp-0x64],0x1
00401F7F   .  C745 94 02000>mov dword ptr ss:[ebp-0x6C],0x2
00401F86   .  FF15 90414000 call dword ptr ds:[<&MSVBVM50.__vbaI4Var>]           ;  msvbvm50.__vbaI4Var
00401F8C   .  8D4D BC       lea ecx,dword ptr ss:[ebp-0x44]
00401F8F   .  50            push eax                                             ;  // eax=0x01 2 3 4 5
00401F90   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]
00401F93   .  51            push ecx                                             ;  // bbdxf
00401F94   .  52            push edx
00401F95   .  FF15 34414000 call dword ptr ds:[<&MSVBVM50.#632>]                 ;  msvbvm50.rtcMidCharVar
00401F9B   .  8D45 84       lea eax,dword ptr ss:[ebp-0x7C]
00401F9E   .  8D4D A8       lea ecx,dword ptr ss:[ebp-0x58]
00401FA1   .  50            push eax
00401FA2   .  51            push ecx
00401FA3   .  FF15 64414000 call dword ptr ds:[<&MSVBVM50.__vbaStrVarVal>]       ;  msvbvm50.__vbaStrVarVal
00401FA9   .  50            push eax
00401FAA   .  FF15 08414000 call dword ptr ds:[<&MSVBVM50.#516>]                 ;  msvbvm50.rtcAnsiValueBstr
00401FB0   .  66:05 0A00    add ax,0xA                                           ;  // 每个字符+0xA
00401FB4   .  0F80 B0020000 jo 0040226A
00401FBA   .  0FBFD0        movsx edx,ax
00401FBD   .  52            push edx
00401FBE   .  FF15 70414000 call dword ptr ds:[<&MSVBVM50.#537>]                 ;  msvbvm50.rtcBstrFromAnsi
00401FC4   .  8985 7CFFFFFF mov dword ptr ss:[ebp-0x84],eax
00401FCA   .  8D45 CC       lea eax,dword ptr ss:[ebp-0x34]
00401FCD   .  8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]
00401FD3   .  50            push eax                                             ;  // 上次存的
00401FD4   .  8D95 64FFFFFF lea edx,dword ptr ss:[ebp-0x9C]
00401FDA   .  51            push ecx                                             ;  // +0xA之后的字符文本
00401FDB   .  52            push edx
00401FDC   .  C785 74FFFFFF>mov dword ptr ss:[ebp-0x8C],0x8
00401FE6   .  FFD3          call ebx                                             ;  __vbaStrCat // 连接字符串,结果放在eax
00401FE8   .  8BD0          mov edx,eax                                          ;  // bbdxf循环到x时,超出128,所以被截断了
00401FEA   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
00401FED   .  FFD6          call esi
00401FEF   .  8D4D A8       lea ecx,dword ptr ss:[ebp-0x58]
00401FF2   .  FF15 B0414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeStr>]         ;  msvbvm50.__vbaFreeStr
00401FF8   .  8D85 74FFFFFF lea eax,dword ptr ss:[ebp-0x8C]
00401FFE   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]
00402001   .  50            push eax
00402002   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
00402005   .  51            push ecx
00402006   .  52            push edx
00402007   .  6A 03         push 0x3
00402009   .  FFD7          call edi
0040200B   .  83C4 10       add esp,0x10
0040200E   .  8D85 ECFEFFFF lea eax,dword ptr ss:[ebp-0x114]
00402014   .  8D8D FCFEFFFF lea ecx,dword ptr ss:[ebp-0x104]
0040201A   .  8D55 DC       lea edx,dword ptr ss:[ebp-0x24]
0040201D   .  50            push eax
0040201E   .  51            push ecx
0040201F   .  52            push edx
00402020   .  FF15 A4414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForNext>]      ;  msvbvm50.__vbaVarForNext
00402026   .^ E9 3DFFFFFF   jmp 00401F68
0040202B   >  8D45 CC       lea eax,dword ptr ss:[ebp-0x34]                      ;  // 循环后的结果存到eax中
0040202E   .  8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC]
00402034   .  50            push eax                                             ;  // eax = 计算输入的文本后的值
00402035   .  51            push ecx
00402036   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401A8C                 ;  UNICODE "kXy^rO|*yXo*m\kMuOn*+"
00402040   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8008                   ;  // 修改ecx指针的值为上面的字符串
0040204A   .  FF15 40414000 call dword ptr ds:[<&MSVBVM50.__vbaVarTstEq>]        ;  msvbvm50.__vbaVarTstEq
00402050   .  66:85C0       test ax,ax
00402053      0F84 C0000000 je 00402119                                          ;  // 和上一个一样的关键跳

算法分析如下:
在VB中,使用了 __vbaVarForInit,__vbaFreeVarList,__vbaVarForNext 三个函数完成了一个For循环(参看上面的汇编代码),再循环中,每一次通过rtcMidCharVar取出一个字符,然后使用 rtcAnsiValueBstr 将字符转换为ANSII码值,将ANSII值加上0x0A之后再转换回字符,最后组成的字符串与"kXy^rO|*yXo*m\kMuOn*+"比较,比较的结果决定je跳转的成功和失败。

下面使用代码反计算Key值:
C/CPP代码:
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include "iostream"
  
int _tmain(int argc, _TCHAR* argv[])
{
    char keyCode[100] = "kXy^rO|*yXo*m\\kMuOn*+";
    char keyOld[100] = {0};
    int nLen = strlen(keyCode);
    printf("%d\r\n",nLen);
    for ( int i=0;i<nLen;i++ )
    {
        keyOld[i] = keyCode[i] - 0x0A;
    }
    printf("Key: %s\r\n",keyOld);
    system("pause");
    return 0;
}

3.png

BY  笨笨D幸福

免费评分

参与人数 4热心值 +4 收起 理由
fanmc92 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
loveliuhao323 + 1 我肯定一如既往支持
H2o + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
瓜子吧3 + 1 暑假一定学习~!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sndncel 发表于 2014-6-18 23:57
写的真详细呀。谢谢楼主分享呀。等下下来试试呀。哈哈。
qwesuqwe 发表于 2015-2-26 10:37
kXy^rO|*yXo*m\kMuOn*+,,,,想问一下这里怎么可以转换为key 值
瓜子吧3 发表于 2014-6-18 21:44
头像被屏蔽
开心happy 发表于 2014-6-18 22:01
提示: 作者被禁止或删除 内容自动屏蔽
仲夏 发表于 2014-6-19 01:56
给跪了、看了下win7 耶。为何我win7 一直跪
keyrratuff 发表于 2014-6-20 01:03
楼主加油啊,160胜利在望。
keyrratuff 发表于 2014-6-23 02:44
一如既往地支持
dych1688 发表于 2014-7-6 21:50
一样的,这三个,easy
shuguang 发表于 2014-7-6 22:43
只爆破,路过
头像被屏蔽
vk929495v 发表于 2014-7-22 06:23
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-28 10:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表