|
|
 |
|
 |
| Official CFF CrackMe #3 破解分析 |
|
|
|
字体:小 大 |
|
|
中华网络安全联盟 作者:佚名 来源:网络 时间:2006-3-19
Officia
作者:☆群侠☆… 文章来源:qxtianlong.77169.com
【破文作者】qxtianlong
【所属组织】无
【作者主页】http://qxtianlong.77169.com
【 E-mail 】kk5910@sina.com
【 作者QQ 】249935058
【文章题目】Crackme的详解
【软件名称】Official CFF CrackMe #3
【下载地址】笨冬瓜
【加密方式】用户名/序列号
【加壳方式】UPX
【破解工具】OD, W32
【软件限制】无
【破解平台】wxp
=======================================================================================================
【软件简介】
Crackme生存的唯一目的就是让我们练手之用!
=======================================================================================================
【文章简介】
我的破解很菜,写这篇东西是给对这个
crackme
有兴趣的兄弟们,分享一下破解心得
=======================================================================================================
【解密过程】
UPX的壳比较简单,自动或者手动都可以,再此就不说了!
运行输入试练码qxtianlong,78787878,确认后出现友好提示!
下面用W32静态分析一下,找到友好提示,双击来到
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440F56(C)
|
:00440F72
6A00
push 00000000
* Possible StringData Ref from Code Obj ->"Beggar
off!"
|
:00440F74
B980104400
mov ecx, 00441080
* Possible StringData Ref from Code Obj ->"Wrong Serial,try
again!"
|
:00440F79
BA8C104400
mov edx,
0044108C
************来到此处
*******************************************************************************************************
我们向上找找可以看到从00440F56处跳来,此时注意到下面有相同的提示
*******************************************************************************************************
:00440F7E
A1442C4400
mov eax, dword ptr [00442C44]
:00440F83
8B00
mov eax, dword ptr [eax]
:00440F85
E8DEC0FFFF
call 0043D068
:00440F8A
EB18
jmp 00440FA4
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440F39(C)
|
:00440F8C
6A00
push 00000000
* Possible StringData Ref from Code Obj ->"Beggar
off!"
************可以看到和上面是相同的
|
:00440F8E
B980104400
mov ecx, 00441080
* Possible StringData Ref from Code Obj ->"Wrong Serial,try
again!"
|
:00440F93
BA8C104400
mov edx, 0044108C
:00440F98
A1442C4400
mov eax, dword ptr [00442C44]
:00440F9D
8B00
mov eax, dword ptr [eax]
:00440F9F
E8C4C0FFFF
call
0043D068
*******************************************************************************************************
我们看看这个地方是从00440F39处跳来的,从两个不同的地址调到相同的提示,我们分析一下他们有什么关联呢!!
我们先找到00440F39这个地方!!!!!
*******************************************************************************************************
*
Possible StringData Ref from Code Obj ->"Registered
User"
|
:00440F2F
BA14104400
mov edx, 00441014
:00440F34
E8F32BFCFF
call 00403B2C
:00440F39
7551
jne 00440F8C
:00440F3B
8D55FC
lea edx, dword ptr [ebp-04]
:00440F3E
8B83C8020000
mov eax, dword ptr [ebx+000002C8]
:00440F44
E8D7FEFDFF
call 00420E20
:00440F49
8B45FC
mov eax, dword ptr
[ebp-04]
*******************************************************************************************************
可以看到00440F39处的jne跳向了00440F8C就是出错的地方,可以猜到此处应该是检查用户名的地方,不对就出错
那么我们再看看00440F56!!!!
*******************************************************************************************************
*
Possible StringData Ref from Code Obj
->"GFX-754-IER-954"
|
:00440F4C
BA2C104400
mov edx, 0044102C
:00440F51
E8D62BFCFF
call 00403B2C
:00440F56
751A
jne 00440F72
:00440F58
6A00
push
00000000
*******************************************************************************************************
可以看到00440F56处的jne跳向了00440F72也是出错的地方,我们也可以猜到这是检查序列号的地方了,简单的说
先检查用户名对了就继续,不对就死,然后检查序列号对了就成功,不对就死!!!!什么你不信!!那么接着看!!
我们试想一下如果我猜的对的话,在00440F56这个地址不跳,接下来会是什么呢!!!待我慢慢说来。。。。。。
*******************************************************************************************************
*
Possible StringData Ref from Code Obj ->"CrackMe cracked
successfully"
|
:00440F5A
B93C104400
mov ecx, 0044103C
* Possible StringData Ref from Code Obj ->"Congrats! You cracked this
CrackMe!"
|
:00440F5F
BA5C104400
mov edx, 0044105C
:00440F64
A1442C4400
mov eax, dword ptr [00442C44]
:00440F69
8B00
mov eax, dword ptr [eax]
:00440F6B
E8F8C0FFFF
call 0043D068
:00440F70
EB32
jmp
00440FA4
*******************************************************************************************************
看提示应该知道是成功的地方了,这说明我猜的是对的了,嘿嘿!!!!我们再想上分析一下!!!!
看看Possible
StringData Ref from Code Obj ->"Registered
User"的上面又是什么呢!!!
*******************************************************************************************************
*
Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440E99(C)
|
* Possible StringData Ref from Code Obj ->"No Serial
entered"
|
:00440F08
B9E80F4400
mov ecx, 00440FE8
* Possible StringData Ref from Code Obj ->"Enter a
Serial!"
|
:00440F0D
BAFC0F4400
mov edx, 00440FFC
:00440F12
A1442C4400
mov eax, dword ptr [00442C44]
:00440F17
8B00
mov eax, dword ptr [eax]
:00440F19
E84AC1FFFF
call 0043D068
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440F04(C)
|
:00440F1E
8D55FC
lea edx, dword ptr [ebp-04]
:00440F21
8B83C4020000
mov eax, dword ptr [ebx+000002C4]
:00440F27
E8F4FEFDFF
call 00420E20
:00440F2C
8B45FC
mov eax, dword ptr
[ebp-04]
*******************************************************************************************************
可以看到从00440F04跳来,他的上面可以看到提示你输入序列号的提示
*******************************************************************************************************
*
Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440ED8(C)
|
:00440EF2
8D55FC
lea edx, dword ptr [ebp-04]
:00440EF5
8B83C8020000
mov eax, dword ptr [ebx+000002C8]
:00440EFB
E820FFFDFF
call 00420E20
:00440F00
837DFC00
cmp dword ptr [ebp-04], 00000000
:00440F04
7518
jne 00440F1E
:00440F06
6A00
push
00000000
*******************************************************************************************************
简单分析一下这段的功能应该是看你有没有输入序列号,没有的话就会出现提示了,输入了序列号就跳到00440F1E了
而这里又是从00440ED8跳来,找到他,然后也分析一下!!!
*******************************************************************************************************
*
Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440E4C(C)
|
:00440EB3
6A00
push 00000000
:00440EB5
53
push ebx
:00440EB6
8BD8
mov ebx, eax
:00440EB8
33C0
xor eax, eax
:00440EBA
55
push ebp
:00440EBB
68BA0F4400
push 00440FBA
:00440EC0
64FF30
push dword ptr fs:[eax]
:00440EC3
648920
mov dword ptr fs:[eax], esp
:00440EC6
8D55FC
lea edx, dword ptr [ebp-04]
:00440EC9
8B83C4020000
mov eax, dword ptr [ebx+000002C4]
:00440ECF
E84CFFFDFF
call 00420E20
:00440ED4
837DFC00
cmp dword ptr [ebp-04], 00000000
:00440ED8
7518
jne
00440EF2
*************就是这里了
:00440EDA
6A00
push 00000000
* Referenced by a (U)nconditional or (C)onditional Jump at
Address:
|:00440E6B(C)
|
* Possible StringData Ref from Code Obj ->"No Name
entered"
|
:00440EDC
B9C80F4400
mov ecx, 00440FC8
* Possible StringData Ref from Code Obj ->"Enter a
Name!"
|
:00440EE1
BAD80F4400
mov edx, 00440FD8
:00440EE6
A1442C4400
mov eax, dword ptr [00442C44]
:00440EEB
8B00
mov eax, dword ptr [eax]
:00440EED
E876C1FFFF
call
0043D068
*******************************************************************************************************
注意我标的星号那里,功能应该是检查用户名的,没有输入的话会出现提示,让你输入一个用户名!输入了就会跳到
00440EF2接着继续其他的判断了,上面已经分析过了。差不多已经明白了!
静态分析到此结束了,我们下面用动态分析一下!我们在00440EB3处下断!!!!,我会简单再分析一下,不会再向上面
那样细细分析了!
*******************************************************************************************************
F9运行,马上断下来,F8跟,在00440ECF
E8 4CFFFDFFcall
CrackMe3.00420E20
可以看到是取用户名位数的,EAX寄存器内容为A(10),用户名位数和0比较,不为零继续
00440EFB
E8 20FFFDFFcall
CrackMe3.00420E20
,这个CALL是取序列号位数的
EAX寄存器内容为8,序列号位数和0比较,不为零继续
00440F2C
8B45 FCmov
eax,dword ptr ss:[ebp-4]
;qxtianlong
00440F2F BA
14104400mov
edx,CrackMe3.00441014
; ASCII "Registered User"
00440F34 E8
F32BFCFFcall
CrackMe3.00403B2C
F7跟进
00440F39/75
51
jnz short
CrackMe3.00440F8C
我们输入的用户名进EAX,真正的用户名进EDX,跟进后看到
00403B33
39D0
cmp
eax,edx
; CrackMe3.00441014
00403B35 0F84
8F000000je
CrackMe3.00403BCA
做比较,不等就死啦!00440F44 E8
D7FEFDFFcall CrackMe3.00420E20
这个CALL取序列号位数,EAX寄存器内容为8
00440F49 8B45
FCmov
eax,dword ptr ss:[ebp-4]
;78787878
00440F4C BA
2C104400mov
edx,CrackMe3.0044102C
; ASCII "GFX-754-IER-954"
00440F51 E8
D62BFCFFcall
CrackMe3.00403B2C
F7跟进
00440F56 75
1A
jnz short CrackMe3.00440F72
我们可以看到 call
00420E20这个子程序是取字符传位数用的,我们输入的序列号进EAX,真正的序列号进EDX
跟进后看到
00403B33
39D0
cmp
eax,edx
; CrackMe3.0044102C
00403B35 0F84
8F000000je
CrackMe3.00403BCA
做比较,不等就死啦!!!
用户名和序列号的比较方式为我们输入的和真正逐位做比较,好啦OK啦!!!!
收工!!!
=======================================================================================================
【解密心得】
明码方式比较简单,固定用户名和序列号!
name:Registered
User
serial:GFX-754-IER-954
爆破:
00440F39/75
51
jnz short CrackMe3.00440F8Cjnz-->jz 或者74
51
00440F56 75
1A
jnz short CrackMe3.00440F72jnz-->jz 或者74
1A
内存注册机:
取得用户名
中断地址:00440F34
中断次数:1
第一字节:E8
指令长度:5
保存信息为内存方式-->EDX寄存器
取得序列号
中断地址:00440F51
中断次数:1
第一字节:E8
指令长度:5
保存信息为内存方式-->EDX寄存器
=======================================================================================================
【破解声明】我是一个小小菜虫子,文章如有错误,请高手指正!
【版权声明】本文纯属技术交流,
转载请注明作者并保持文章的完整, 谢谢!
=======================================================================================================
l CFF CrackMe #3 破解分析
|
|
 |
|
 |
|