- UID
- 64991
注册时间2010-1-1
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
最近闲着没事,就试着在天空软件站随便下了个软件练一下手,本人也是新手。希望和大家一起交流,一起学习。软件地址 :http://shareware.skycn.com/soft/27680.htm
好进入正题。首先用PEID查壳,无壳是用VC写的东西,心中窃喜,少了好多麻烦,
OD载入,记得一定要隐藏OD,我看了一下,里面有反调试代码。
F9直接运行一次,点软件注册,会提示注册码和订单号,输入后确定,提示重启验证,说明是重启验证类的,无非就是写文件或注册表了。
Ctrl+F2重新载入,右键查找当前模块中的名称,会显示出所有调用API,发现有- 名称位于 QQ2009密, 条目 159
- 地址=0043829C
- 区段=.rdata
- 类型=输入 (已知)
- 名称=KERNEL32.GetProfileStringA
复制代码 GetProfileStringA这个函数,是关键了,用BP GetProfileStringA下断,然后按F9两次查看堆栈处- 0012F1CC 0040D02C /CALL 到 GetProfileStringA 来自 QQ2009密.0040D02A
- 0012F1D0 02236E98 |Section = "DDLook"
- 0012F1D4 00447464 |Key = "notetext"
- 0012F1D8 00449834 |Default = ""
- 0012F1DC 0012F1F0 |ReturnBuffer = 0012F1F0
- 0012F1E0 00000100 \BufSize = 100 (256.)
复制代码 没有文件名说明是读写的win.ini文件位于c:\windows中,打开这个文件查看尾部- [fileopr]
- C:\WINDOWS\system32\ddinfo.db=1
- [DDLook]
- version=1021
- auto=0
- notetext=manbug
- noteid=123123
- update=0
复制代码 取消断点,F9直接运行后,点击设置登陆密码会提示“只有注册用户才能设置密码”,这就是关键了点确定后,用OD查找字符串。- Ultra String Reference, 条目 214
- Address=00409852
- Disassembly=push offset <aVSZSI>
- Text String=只有注册用户才能设置登录密码!
复制代码 双击此行会来到代码处- 00409827 . /0F84 AF000000 je <loc_4098DC>
- 0040982D . |8D4C24 6C lea ecx, dword ptr [esp+6C]
- 00409831 . |E8 3A350000 call <sub_40CD70>
- 00409836 . |68 E06E4400 push offset <aVSS> ; 未注册提示
- 0040983B . |8D8C24 040100>lea ecx, dword ptr [esp+104]
- 00409842 . |C78424 140100>mov dword ptr [esp+114], 0
- 0040984D . |E8 F6DD0100 call <CString::operator=(char const *>
- 00409852 . |68 D0704400 push offset <aVSZSI> ; 只有注册用户才能设置登录密码!
- 00409857 . |8D8C24 080100>lea ecx, dword ptr [esp+108]
- 0040985E . |E8 E5DD0100 call <CString::operator=(char const *>
- 00409863 . |8D4C24 68 lea ecx, dword ptr [esp+68]
- 00409867 . |E8 A82F0200 call <CDialog::DoModal(void)>
- 0040986C . |8D8C24 040100>lea ecx, dword ptr [esp+104]
复制代码 看到代码上面的je没有,这就是关键点,当然改此处是没有作用的,我们继续向上看。- 00409800 . 64:A1 0000000>mov eax, dword ptr fs:[0] 大家可以在这里下断分析
- 00409806 . 6A FF push -1
- 00409808 . 68 B7604300 push <unknown_libname_159>
- 0040980D . 50 push eax
- 0040980E . A1 E4974400 mov eax, dword ptr [<dword_4497E4>] 将4497E4的值送eax,那么4497e4就是关键点了,估计是个全局变量或静态变量了
- 00409813 . 64:8925 00000>mov dword ptr fs:[0], esp
- 0040981A . 81EC 04010000 sub esp, 104
- 00409820 . 85C0 test eax, eax 这是比较eax是否为0,如果为0就已经注册了否则未注册
- 00409822 . 56 push esi
- 00409823 . 8BF1 mov esi, ecx
- 00409825 . 6A 00 push 0
- 00409827 . 0F84 AF000000 je <loc_4098DC>
- 0040982D . 8D4C24 6C lea ecx, dword ptr [esp+6C]
- 00409831 . E8 3A350000 call <sub_40CD70>
- 00409836 . 68 E06E4400 push offset <aVSS> ; 未注册提示
- 0040983B . 8D8C24 040100>lea ecx, dword ptr [esp+104]
- 00409842 . C78424 140100>mov dword ptr [esp+114], 0
- 0040984D . E8 F6DD0100 call <CString::operator=(char const *>
- 00409852 . 68 D0704400 push offset <aVSZSI> ; 只有注册用户才能设置登录密码!
复制代码 我们直接用命令 d 4497E4 会看到值为02,在此处下硬件访问断点,删除以前所有断点。Ctrl+F2重新载入程序,F9运行程序,发生硬件中断- 0040CEE6 |. C746 14 02000>mov dword ptr [esi+14], 2 此处为给 4497e4赋值2 只要将2直接改为0就算爆破了
- 0040CEED |. E8 56A70100 call <CString::operator=(char const *>
复制代码 我也跟了他的注册算法,很简单的,大家可以跟进去看一下。注册码是本地验证然后网络验证的。- 00407B27 |. B9 D0974400 mov ecx, offset <unk_4497D0>
- 00407B2C |. E8 DF560000 call <算法部分。。。> ; 这里面就是算法了,跟进
- 00407B31 |. A1 28984400 mov eax, dword ptr [<dword_449828>]
复制代码 其实还有一种不用爆破的方法更为简单,当然就要用到算法了,我已经算出来了一组:- 注册码:man5Rx3hG3aG
- 订单号:123'or'='or'
复制代码 注册码是可以算出来的,单是订单号是服务器上的。其实如果知道注入的朋友一定会对'or'='or'不陌生吧。呵呵,因为我找到了他的网站有注入漏洞,所以。。。嘿嘿
上面的注册码和订单号应该哪里都可以用吧,没有机器限制的。
归纳一下这次破解过程:
1.这个程序有一定的反调试能力,所以没有加壳,但是现在一些反调试对于OD N多牛人写的插件来说的话约等于无了。
2.软件作者就用一个全局变量来判断软件是否注册,实在是有点失策,写了那多反调试代码和算法。为什么能一字节破解呢?唉。
3.作为一个共享软件,服务器的判断地址居然还有注入漏洞,实在不该。
好了,就写到这了!本文目的在于交流,请不要用这个软件用于非法用途! |
评分
-
查看全部评分
|