【破文作者】 小弟[爆破王]
【文章题目】 菜鸟必看的破解文章(3)-没有信息框提示的软件的破解
【软件名称】 crackme
【加密方式】 加壳upx LCC(什么东东?没有听说过)
【破解工具】 还是Ollydbg 1.10b和peid,upx-ripper,Unpacker for UPX
【破解难度】 +++初级+++ 中级 高级 超难
【破解平台】 XP SP2
----------------------------------------------------------------------------------------------
【文章简介】
这里主要讲没有提示的软件的破解,比如输入注册码后没有提示,而是在输入注册码的地方显示提示.
----------------------------------------------------------------------------------------------
【破解过程】
破解前的思路:
在输入注册码后,点击cheak,在Serial里提示"Maybe ask Joe?",估计程序里应该有这个提示字符串,所以用常规方法尝试
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
用Ollydbg 1.10b载入sd-cm_.exe,提示此软件已加壳,退出Ollydbg 1.10b,用peid查看,发现是用upx加壳,用upx-ripper(
一般是先用他脱,他脱的比较好,能编辑资源文件)脱壳在最后校验的时候提示错误,看来是加了多层壳了(这是经验哦^_^),
用Unpacker for UPX(他脱壳没有效验,可以脱多层壳,缺点是资源在脱壳后无法编辑)脱壳,然后再用peid查看发现第2层壳是
LCC(什么东东?)加的壳,没有这种壳的脱壳器,只好直接调试.载入后运行,随便输入注册码和用户名,点击check,在注册码处
看到提示字符串Maybe ask Joe?,在汇编的代码上右击搜索->字符参考,显示不出字符串,用老罗的插件来显示(用Find ASCII,这里加一下上篇帖子里 <<Lanneret 兄说得VB 的问题也可一用老罗的插件,用另一个显示即可)
,发现了字符串Maybe ask Joe?.双击来到这里----------------------------------------------------------------------
0040300B /E9 E8010000 jmp 34567890.004031F8 |
00403010 |68 2C794000 push 34567890.0040792C ; ASCII "Joe"<-这个是真正的用户名 |
00403015 |68 58764000 push 34567890.00407658 ; ASCII "xd"<-这个是你输入的姓名 |
0040301A |E8 5D090000 call <jmp.&KERNEL32.lstrcmpA> |
0040301F |83F8 00 cmp eax,0 |
00403022 |75 14 |--跳转- jnz short 34567890.00403038<-------这个是关键跳转,可以看到他把正确的地方 |
00403024 |6A 30 | ---| push 30 略过了,并且跳转到了错误的信息的地方,可 |
00403026 |68 B1784000 |正 | push 34567890.004078B1 以知道它是关键跳转,改为jz,点击 |
0040302B |68 BB784000 |确 容 | push 34567890.004078BB 继续执行,软件注册成功^_^ |
00403030 |FF75 08 |的 | push dword ptr ss:[ebp+8] |
00403033 |E8 98090000 |内 ---| call <jmp.&USER32.MessageBoxA> |
00403038 |6A 23 |--到--- push 23 |
0040303A |68 BC764000 push 34567890.004076BC ; ASCII "Maybe ask Joe?"<----------------
0040303F |68 C9000000 push 0C9
00403044 |FF75 08 push dword ptr ss:[ebp+8]
00403047 |E8 60090000 call <jmp.&USER32.GetDlgItemTextA>
0040304C |A3 00404000 mov dword ptr ds:[404000],eax
00403051 |833D 00404000 20 cmp dword ptr ds:[404000],20
00403058 |73 17 jnb short 34567890.00403071
0040305A |68 A2784000 push 34567890.004078A2 ; ASCII "Maybe ask Joe?"
0040305F |68 C9000000 push 0C9
00403064 |FF75 08 push dword ptr ss:[ebp+8]
00403067 |E8 34090000 call <jmp.&USER32.SetDlgItemTextA>
0040306C |E9 87010000 jmp 34567890.004031F8
00403071 |C705 0C404000 000000>mov dword ptr ds:[40400C],0
是不是很简单,只要找到关键的地方就很容易破解. ----------------------------------------------------------------------------------------------
【破解心得】
其实这个crackme有很多破解方法这里一一举出,扩展更多的知识给广大破解初学者:
方法1:
可以在这里下断"0040301F |83F8 00 cmp eax,0"
断下后在寄存器窗口的eax那行的16进制数据上单击(那个数据的底色变成黄色),然后右击(在我的机器上不这样操作选项出不来),选择
修改,然后改为0,注册即可成功.
这里之所以改为0,是因为"cmp eax,0 和jnz short 34567890.00403038"这个代码的意思是用0来删除eax的值,如果为0就不跳转,(
注册正确)而不为0就跳转(跳就提示注册失败),我们把值改为0,这样0-0=0,不跳转,注册成功
不过一般不这样改,因为每次都要修改寄存器.比较麻烦
方法2:
修改注册错误后的跳转把"jnz short 34567890.00403038(前面是文件名,大家不要被误导)"改为
"jnz short 34567890.00403024(这个是提示注册正确的地方的开头代码)"这样注册成功,继续执行注册正确的提示代码,
注册错误,还是执行注册正确的代码
这样的破解是比较完美的.
方法3:
这个就不能说是方法了
看到我在上面的注释; ASCII "Joe"<-这个是真正的用户名
; ASCII "xd"<-这个是你输入的姓名 .
了么,这了可以看出Joe是真正的注册名,因为在对比注册名的时候压入了这个字符串,所以可以猜到Joe(对比注册名,
他区分大小写)为注册名.
最后写出程序的格式
if 注册名=Joe then
注册成功
else
在注册码的文本框里显示注册错误
end if
方法1格式:
if 注册名=Joe then<--这里如果不等于,eax的值就为1,等于就为0
注册成功 (接上)我们在这里把eax的值改为0就可相等
else
在注册码的文本框里显示注册错误
end if
方法2格式:
if 注册名=Joe then
注册成功:
注册成功
else
goto 注册成功
end if
方法3的程序格式实在是不知到怎么写,所以就不写了.
这次写的罗索了一点,因为是给菜鸟看的,把我的经验写出来.不要仍鸡蛋哦^_^
----------------------------------------------------------------------------------------------
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
----------------------------------------------------------------------------------------------
文章写于2005-1-18 18:39:17附件:34567890.rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!