【文章标题】: 一款小软件爆破过程
【文章作者】: chys
【软件名称】: MyLanView
【下载地址】: http://www.mylanviewer.com/MyLanViewer.zip
【保护方式】: ASPack 2.12 -> Alexey Solodovnikov
【编写语言】: Borland C++
【使用工具】: OllyDBG v1.10,LordPE,Import REC,DeDe.
【操作平台】: Windows XP
【软件介绍】:一个能搜索局域网资源的小软件,很好用。
【作者声明】: 第一次写这种文章,失误之处敬请诸位大侠赐教!
(文章格式参考自论坛各位大侠的作品,谢谢)
一,脱壳
1,查壳。
PEid扫描,发现是ASPack 2.12 -> Alexey Solodovnikov于是决定手动脱之。
2,寻找OEP(此处用内存镜像法)。
OD载入,按ALT+M打开内存镜像,在程序的资源段(.rsrc)下断点。然后按F9运行,断下后按ALT+M打开内存镜像,在代码段(.text)下断点,
按F9运行,程序就直接停在OEP了。
004017A0 > $ /EB 10 jmp short 004017B2
3,DUMP。
这个不用多说,打开LordPE,找到程序进程,右击-》Dump full保存即可。
4,修复IAT。
打开Import REC。选择程序进程,然后在OEP里写上刚才找到的地址(写偏移量)17A0,然后按IAT AutoSearch,
之后再按Get Import,就找到输入表了。但是有很多无效的,用等级1修复一下,发现一个都修不了,于是直接cut掉。
然后再按Fix Dump,选中第3步dump的文件,IAT修复完毕。
然后双击运行,oh XX,出错了,连着3个错,然后程序也没运行,
这说明至少有3个很重要的函数没找到,修复失败。。。。。
没办法继续修复,打开Import REC,选中程序进程,写OEP为17A0,按IAT AutoSearch,弹出提示(刚才没说直接按确定了),
这回得好好看看,原来上面写着If it is not correct,try RVA:002F5000 Szie:00004000好。那我就按提示填写。然后Get Import,
把无效的直接cut掉,Fix Dump。运行程序,成功了,哈哈哈。。。
二,爆破。
1,看到软件能试用14天,就首先想到能不能修改系统时间方式一直试用呢。结果发现我太天真了。。。。。。
调了系统时间之后,。。。试用期已过了。倒也不是不能用,只是你得等999秒,疯了。那么把时间改回来吧想别的招吧。
2,那就假注册,找找提示吧。结果,。。我还是太天真了,输入假码按OK,没有反应啊。
在OD里查找字符串也没有找到什么有用的信息。oh....
3,用PEid查一下脱完壳的文件,发现在BC++写的,那就用DeDe把。
用DeDe打开文件,DeDe会提示“DConsole 发现此应用程序加过壳”,(不知道为什么会这么提示,难道是我没脱好?请大家指点。)
先不管它,点OK,等分析完成之后就到过程中打事件地址,点过程之后,在左面的列表中我们会找到UnitEnterCode这个单元,顾名思义这个就是输入注册码的窗体单元。
单击,在右面就会列出事件,有Button1Click,和Button2Click两个事件,安顺序排Button1应该就是注册窗口中的OK按钮,右击复制相对虚址,
然后在OD中按Ctrl+G粘上复制的地址按确定就来到00464C7C这一行,按F2下断。运行程序,按Enter Code按钮打开注册窗口,输入用户名和假注册码,
按确定,果然停在00464C7C这里。好,那么现在开始单步归跟踪,看看能不能找到正真的注册码或爆破点。
F7,F7,F7.... ....
结果,没有发现有明码比较,并且算法很复杂,好像是RSA算法。。。 。。
但是也有发现如果把
00464CE9 . /0F84 12020000 je 00464F01
00464E15 . /0F86 E6000000 jbe 00464F01
这两个跳转nop掉,会弹出“thank you for registration!!!“,哈哈。。。,但是一重启我又发现我太天真了。。。。。
好像有重启验证!,那,好吧。。。。我们想别的办法吧。。。
4,我们在第1步发现试用期过后还是能试用软件,只不过是每次要等999秒,才能点OK按钮,然后进入主界面。
那么,我们跳过这999秒不就能正常的一直免费试用了吗? 那么开始吧。。
我们用DoDo找开软件文件,然后在过程中查找,我们会找到UnitStart单元,并且在事件中会发现FormCreate,FormShow,Button1Click等事件和地址,分别复制在OD中下断。
按F9用行,软件就会断在004669F0这行,这行就创建启动窗口FormCreate函数头。
004669F0 . 55 push ebp ; 创建启动窗口
004669F1 . 8BEC mov ebp, esp
004669F3 . 83C4 94 add esp, -6C
004669F6 . 53 push ebx
004669F7 . 56 push esi
004669F8 . 57 push edi
004669F9 . 8BF0 mov esi, eax
004669FB . B8 64F75B00 mov eax, 005BF764
单步往下跟,我们会发现“evaluation period is over.”,等信息,继续向下跟,看看是在什么地方设置了999。
00466C38 . E8 EB260E00 call 00549328
00466C3D . 84DB test bl, bl
00466C3F 74 6C je short 00466CAD
00466C41 . 8B86 70030000 mov eax, dword ptr [esi+370]
00466C47 . 33D2 xor edx, edx
00466C49 . 8B08 mov ecx, dword ptr [eax]
00466C4B . FF51 68 call dword ptr [ecx+68]
00466C4E . 66:C745 D4 60>mov word ptr [ebp-2C], 60
00466C54 . BA 84F55B00 mov edx, 005BF584 ; ok(999)
00466C59 . 8D45 E8 lea eax, dword ptr [ebp-18]
00466C5C . E8 8F601300 call 0059CCF0
00466C61 . FF45 E0 inc dword ptr [ebp-20]
很明显00466C54这一行是把按钮设置为ok(999),而上面的
00466C3F 74 6C je short 00466CAD
这行代码决定是否跳过设置,在试用期没完之前会跳过,试用期用完之后就不会跳,所以把je改成jmp就可以了。
00466C3F /EB 6C jmp short 00466CAD
单击右健--》复制到可执行文件--》所有修改。保存文件,打开发现按钮不会被设置成ok(999),可以直接点击进入。
5,这样就可以用了。但是如果去掉那个启运窗口用起来会爽一些。
于是经过反复跟踪发现了下面这些代码,我已经加了注释。
00423D86 . A1 04FD5B00 mov eax, dword ptr [5BFD04]
00423D8B E8 C8250400 call 00466358 ; 调用 创建启动窗口
00423D90 . 8945 C8 mov dword ptr [ebp-38], eax
00423D93 . 66:C745 E0 18>mov word ptr [ebp-20], 18
00423D99 . 8B45 C8 mov eax, dword ptr [ebp-38]
00423D9C . 8B10 mov edx, dword ptr [eax]
00423D9E FF92 FC000000 call dword ptr [edx+FC] ; 调用 显示启动窗口
00423DA4 . 8B4D C8 mov ecx, dword ptr [ebp-38]
00423DA7 . 80B9 B6030000>cmp byte ptr [ecx+3B6], 0
00423DAE . 75 28 jnz short 00423DD8
我们把“显示启动窗口”的代码NOP了,会弹出“unregistered version”的对话框,点OK程序就退出了。
通过字符串查找,我们找到了下面的代码,很显然,这是就是弹出“unregistered version”对话框的地方。
00425CF6 /0F84 D2000000 je 00425DCE
00425CFC |A1 D4B45F00 mov eax, dword ptr [5FB4D4]
00425D01 |8B08 mov ecx, dword ptr [eax]
00425D03 . |B2 01 mov dl, 1
00425D05 . |A1 2C285C00 mov eax, dword ptr [5C282C]
00425D0A . |E8 CD300400 call 00468DDC
00425D0F . |8945 A4 mov dword ptr [ebp-5C], eax
00425D12 . |8D45 E8 lea eax, dword ptr [ebp-18]
00425D15 . |66:C745 CC 60>mov word ptr [ebp-34], 60
00425D1B . |8B4D B8 mov ecx, dword ptr [ebp-48]
00425D1E . |BA E07C5A00 mov edx, 005A7CE0 ; unregistered version
于是我们把je改成jmp,让它跳过去。
00425CF6 /E9 D3000000 jmp 00425DCE
F9继续运行,有异常,忽略之后程序正常运行,弹出主窗口。于是我们把修改保存成文件。但是我们运行刚保存的文件却打不开,郁闷啊!!
再试别的办法吧。。
这次我们不要把
00423D9E FF92 FC000000 call dword ptr [edx+FC] ; 调用 显示启动窗口
这行nop掉,把它改成调用点击“启动界面的OK按钮”事件函数。
改成 call 00466E70(00466E70是用DeDe找到的OK按钮事件)
还是会弹出“unregistered version”窗口,
我们再来一次,把je改成jmp跳过这个窗口。程序正常运行。 保存修改过的代码到文件。
运行,可以正常运行,没弹出启运窗口,也没有其他窗口,哈哈哈,终于成功了。。
第一次写这种文章,不知道有没有把问题说清楚。
按惯例声明一下:本文章只是为了技术交流,请任何人不要用于商业目的,本人和看雪论坛不承担任何责任。
但是看在我这么辛苦写这么多的份上,就请给我一个邀请码吧,谢谢!
[课程]Linux pwn 探索篇!
上传的附件: