今天选择的待破解软件只是一个简单的CrackMe.exe文件,务求让大家都能看懂,最重要的一个目的就是让大家明白破解一个软件的基本流程。
( c0 L! g) K- v! m! f$ u
老鸟们就飘过得了,千万别砸鸡蛋,哈哈!如果在下有什么错误的地方,请不要取笑,欢迎指正,大家共同学习,共同努力!
) D" v$ F9 T+ B0 h
/ }8 E* n0 [ @+ N, l( D6 x0 `
废话少说,现在开始
* x% S6 G; }+ _2 F/ z- Q1 v7 f8 N p
1,首先我们要做的是,执行一遍这个Crackme.exe,随便输人一个用户名和序列号,看注册错误时会有什么样的提示。
- u# b* M' r3 W' s, w; ]( r( E0 K6 @! p* L) k! Y* a
4 I+ ?% m- d' Y. J; i+ {4 a' \
此次的错误提示信息就是"Bad Name Or Serial Number !!!!!",把它记下来,稍后有用。
; J- z( b6 _! [$ M0 B( |! v
2, 第二步一般是查壳,因为如果软件加了壳的话,是无法正确的看到反汇编后的代码的。所谓的壳,其实就是把原软件用一种
7 f- r" @, t. P& O" B$ H. {7 B9 u
特殊的压缩工具进行压缩,使原程序失去本来的面目,达到防止原程序被修改或反汇编目的。一般的查壳工具是PEID等,见图
! j9 R1 C" y- x+ k; e+ q; {
4 P( r4 X: l. e/ v5 W; N图中画红线的区域就是用PEID检查后的结果显示区,可显示壳的类型和原程序的编译工具。因为此次用的CrackMe.exe是个简单的例子,所以是没加壳的,用的是Borland Delphi 3.0编写。至于具体如何查壳脱壳,是很难的,在此不再赘述。(因为手动脱壳,嘿嘿,我自己水平也就那样,马马虎虎)
& _" E4 v1 d# M/ f+ K3, 检查出无壳(或已经脱掉了壳)我们就可以开始用调试软件反汇编原程序啦。今天,我们用的工具是动态调试工具Ollydbg。
- C2 F% }9 O# P打开OD,在“文件”下拉菜单中选择“打开”,然后选中我们欲调试的CRKME4.EXE文件。打开后,在OD中是这个样子
+ p6 G% F7 t# U7 ]- X* d
(OD分5个基本区,分别是反汇编区、寄存器区、信息区、数据区和堆栈区)
( ?, @7 s7 ~7 C) a ^$ M1 Z4, 准备工作都做好了,我们开始正式使用OD调试CRKME4.EXE程序了。右键“查找”选择“所有参考文本字串”,在弹出的窗口中继续点右键选择“查找文本”,输入之前的那个"Bad Name Or Serial Number !!!!!"字串(当然,选择性的输入一部分字串也是可以的)点查找。
4 y1 O% C Y; Z' t! z9 B( j+ r2 s3 w8 k
图中画红线部分就是我们找到的结果,在此处双击左键来到反汇编区。
; B! y x7 h2 E. v0 S
5,往程序的上头点看,取下这么一段代码分析:
0 `' O+ b% d7 l
Z, K9 v* D/ c ]4 n0042DCAD |. E8 F688FDFF CALL CRKME4.004065A8
* {; t+ F- ?7 Q& K k1 U& F8 c0042DCB2 |. A3 60F74200 MOV DWORD PTR DS:[42F760],EAX
2 v( B5 w. T/ C9 [* ]7 K0042DCB7 |. A1 58F74200 MOV EAX,DWORD PTR DS:[42F758]
0 T+ f! j& B7 G5 J) m: r$ l0042DCBC |. 3B05 60F74200 CMP EAX,DWORD PTR DS:[42F760] ;
比较输入的注册码是否正确
$ ~% n) r- C% c3 a! t0 H5 u3 E7 v0042DCC2 |. 75 17 JNZ SHORT CRKME4.0042DCDB ;
如果不相同就跳转至提示注册信息错误的指令处。一定注意,这里是关键跳转,让它跳下去就完了,所以千万要在此跳转之前设断
9 U/ @) G7 r$ i( _" S0042DCC4 |. 6A 00 PUSH 0 ; /Arg1 = 00000000
, ~ h: {# o- B& s6 x9 i/ W. t
0042DCC6 |. 66:8B0D 1CDD4> MOV CX,WORD PTR DS:[42DD1C] ; |
' O' \! U- W( D, e- j
0042DCCD |. B2 02 MOV DL,2 ; |
8 m H; z! r4 r6 Q$ D% ^9 S0 h
0042DCCF |. B8 A0DD4200 MOV EAX,CRKME4.0042DDA0 ; |
ASCII "Good Serial, Thanks For tryingthis Crackme bY nIabI !" # T; F7 R" `7 N& H* j3 b! G. n7 v
0042DCD4 |. E8 67F1FFFF CALL CRKME4.0042CE40 ; \CRKME4.0042CE40
5 f/ u2 p/ ^8 z/ [8 r! i
0042DCD9 |. EB 15 JMP SHORT CRKME4.0042DCF0
- k) E8 n! k# o; P6 \9 e) e! J% {
0042DCDB |> 6A 00 PUSH 0 ; /Arg1 = 00000000
# W1 i9 p, o: p; D6 I
0042DCDD |. 66:8B0D 1CDD4> MOV CX,WORD PTR DS:[42DD1C] ; |
A$ a, U/ f: `3 M! D# L0042DCE4 |. B2 02 MOV DL,2 ; |
5 E2 C! L9 \" u& d* f- C: l9 E
0042DCE6 |. B8 E0DD4200 MOV EAX,CRKME4.0042DDE0 ; |
ASCII "Bad Name Or Serial Number !!!!!"
1 ~, c3 \4 U6 F1 c+ r6 u0042DCEB |. E8 50F1FFFF CALL CRKME4.0042CE40 ; \CRKME4.0042CE40
: t" M% j4 `1 S* n+ ^. h0042DCF0 |> 33C0 XOR EAX,EAX
2 |. N6 G" {. V% t# f, P: |( w" H0042DCF2 |. 5A POP EDX
. s3 {; X _4 Z1 r3 z
0042DCF3 |. 59 POP ECX
9 j; w4 I9 E1 l6 v9 i0042DCF4 |. 59 POP ECX
4 F3 `: e2 A9 G. @+ @" n; ^5 {0 L
0042DCF5 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
7 g' U; y9 f" E2 s$ O. ?
蓝字部分是我加上去的比较关键的提示,大家请注意。
7 y- I2 _2 h% ]: x4 A/ v) `3 Q2 [) u至此程序的大概流程已经确定,我们在0042DCB7处设断(把光标移到此处,按F2键设置为断点)按F9键运行程序,停止在我们设断的地址处,CRKME4.EXE程序会弹出让我们输入注册信息的窗口,如图。
4 E F2 w7 m3 F5 ` j/ r0 V) f
我这里分别输入的是“lschenxi”(蓝色晨曦,嘿嘿)和“787878”,点“Check”后OD自动又被激活。
0 C9 |2 K# L0 F/ \# j: b6, 按F7单步执行程序一步(JNZ前一定要停下,不然就跳没戏了,呵呵) ,看OD中的信息区。
! z# w" y; S; ^5 x' k( J
DS:[0042F760]=000C05A6
8 o- B- V3 E. H) E7 ]3 z$ x0 s
EAX=04CF9CE0
5 c# j9 h) U5 j& D5 Q
用XP自带的计算器算出十进制的“787878”就是十六进制的“C05A6”,然而根据CMP EAX,DWORD PTR DS:[42F760]这条语句可以清楚的知道,就是拿“C05A6”和EAX寄存器中的十六进制数字“04CF9CE0”比较,不相同就跳到执行报错信息的语句上去了,所以这个“04CF9CE0”就是正确的注册码了。我们仍然用XP自带的计算器换算十六进制的“04CF9CE0”为十进制的“80714976”。我们试试看吧,呵呵。(当然注册名就是“lschenxi”哦)
, |7 n# R ^- U' U1 U7 [0 j1 C7, 就不多说了,大家看图

搞定!
8 D7 e' u1 A! D# c/ T- Y$ W! u
3 G5 M4 [" M' D q0 x
写了这么多,累死了,希望对新人能有所帮助,我就心满意足啦
2 n9 u0 X! Q% N3 ^3 Y4 _
% @' K2 ]/ L' }) c5 m( {[
本帖最后由 tangcx_xixi 于 2007-4-6 13:02 编辑 ]