本帖最后由 jackyxinli 于 2016-4-21 11:57 编辑
多年以前用delphi和bass音频库开发了一个简单的MP3播放器,为bass音频库的强大功能所吸引,前几年知道 IDA Pro可以逆向分析二进制代码,也想试试。从bass网站(http://www.un4seen.com)上下载的dll在IDA Pro中打开却是一样也看不懂的二进制代码,更别提逆向分析了。无独有偶,在bing里搜索时发现已经有人在做同样的事情(http://bbs.pediy.com/showthread.php?p=1259424),好不容易联系上作者,作者说帮 脱壳可以,要收费。一向喜好帮助人的我被强烈地刺激了,于是我决定自己做这件事情。 万事开头难,对脱壳、反编译汇编代码阅读一窍不通的我真的知道做这件事情的不易。于是我从亚马逊上买了5本关于软件加密解密、黑客编程、IDA Pro手册的书,认真研读了半个月时间,逐步有了一些理论知识的积累。同时,我在看雪安全论坛(http://bbs.pediy.com)和吾爱 破解论坛( http://www.52pojie.cn)上注册了会员,发现这个论坛上有很多的脱壳教程,通过学习了解了脱壳需要的一些知识,包括ESP定律。此定律也将在bass.dll(2.4.12)脱壳时使用。 废话少说,先从bass网站上下载最新版本(2.4.12)的库,用PEiD 0.95无法识别。我随即在Petite(http://www.un4seen.com/petite)上发现Petite加壳软件的版本是2.4。而PEiD 0.95从2011年停止更新了,怪不得无法识别。 本文脱壳使用的软件有: 本文脱壳环境:VirtualBox 5.0.18,WindowsXP SP3。
一、寻找OEP 有过脱壳经历的朋友都知道加壳后的程序入口点(EP:EntryPoint)并不是最初的入口点了,而脱壳的第一步就是要找到真实的入口点(OEP:Original Entry Point)。启动Ollydbg,打开解压出来的bass.dll,调试器会停留在1004F004的地址上,观察寄存器EAX的值(10000000)并记下,对于有朋友在Windows 7下进行脱壳的,地址会随着每次在ollydbg里打开bass.dll发生变化,这也是我选择在Windows XP里脱壳的原因。如下图所示:
很快我们就能在反汇编代码窗口里发现1004F009的指令是pushad。根据ESP定律,在这里就要注意了,按两次F8执行到1004F010,这时需要在Ollydbg里跟踪ESP的值(0012F868),如下图所示:
在寄存器ESP上点击右键,选择在数据窗口中跟随,如下图所示:
在左下角的数据窗口中选中0012F868内存对应的值,如下图:
设置完硬件断点后,按Shift+F9执行直到ollydbg停住,如下图:
至此,我们发现了与pushad指令配对的popad,也在下方发现了jmp指令,脱壳老手看到这个都会会心的笑了。按F8执行到00B202BF,观察寄存器EDX的值(10026916),如下图所示:
到这里,每个指令的执行都要注意,我是随时用笔和纸将寄存器的值记下来(毕竟是第一次嘛),执行到00B202C8时是一个跳转(jmp)指令,这时按F7跟进,如下图所示:
执行到7C809B94时,接连按F8一直到执行完7C809B9A,就会跳转到一个地址10026916,也就是之前我们记下来的EDX的值,如下图所示:
这个地址就是我们要找的真实入口点OEP。
二、修复IAT
首先用ImportREConstructor打开Ollydbg的loaddll.exe进程,如下图:
点击Pick DLL按钮,在列表中选择bass.dll,再点OK,如下图:
这时你会发现左下角的OEP显示的是0004F004,这个是不对的,上面我们找到的OEP是10026916,减去最初打开bass.dll时EAX的值(10000000),可以得到OEP的偏移量为00026916,将这个值填入OEP文本框中,点击IAT AutoSearch按钮,会有提示,如下图所示:
点击确定,ImportREConstructor就帮我们找到IAT在内存中的偏移地址及IAT的大小了,如下图所示:
点击Get Imports按钮获取bass.dll引用的系统API函数,再点击Show Invalid按钮显示无效的IAT引用函数地址,如下图所示:
这时,我们将看到并不是所有在IAT里引用的API函数都被识别出来了,在被选中的引用项上点右键选择Trace Level1/2/3,都不能找出引用的API函数。这时,我想未能被识别出来的函数应该是被某种方法加密了。遇到这种情况,只能手动修复IAT了。
根据ImportREConstructor帮我们找到IAT偏移量计算出IAT在内存中的地址为10026FFC,转到Ollydbg的反汇编窗口,按Ctrl+G,在出现的对话框中输入10026FFC,然后确定,在地址10026FFC上点击右键选择菜单“数据窗口中跟随”->“选择”,如下图所示:
仔细观察数据窗口,可以看到很多1004开头的地址,初步判断这些地址通过什么方法计算出引用的API函数地址,如下图所示:
为了验证我的判断,在反汇编窗口中按Ctrl+G,在弹出窗口中输入1004F058,跳转到汇编代码,如下图所示:
可以看到先将值0x4BE400B1压栈,然后用rol指令对这个值执行左移操作,于是我在VS2008里新建一个工程,将代码复制到源代码里,如下图所示:
按F10开始单步执行,执行完rol指令,在监视窗口里按下图输入:
貌似计算出来的这个地址是API函数,于是按照x86小端存储的顺序,倒置为2916807c,在Ollydbg的数据窗口中双击修改,修改前值为1004F058,修改后如下图所示:
再回到ImportREConstructor窗口,点击Get Imports按钮,可以看到原来未能识别的引用API函数被认出来了,为DeviceIoControl。哇!!成功了,看来我的判断是正确的,剩下的未能识别的引用的系统API函数都按照此方法进行修改。修复好的IAT如下图所示:
再回到ImportREConstructor窗口,点击Get Imports按钮,可以看到原来未被认出的API函数全部都认出来了。如下图所示:
三、转储内存到磁盘文件在Ollydbg的反汇编窗口,按Ctrl+G,输入10026916来到OEP,然后点击鼠标右键,选择OllyDump脱壳调试进程,按照下图设置:
点击脱壳,将文件保存为bass.dump.dll到磁盘上。接着使用ImportREConstructor修复转储的dll文件,点击Options按钮,按照下图设置:
确定后点击Fix Dump按钮,修改刚才转储的bass.dump.dll文件,会在磁盘上生成bass.dump_.dll文件,使用eXescope可以正常查看导入的系统API函数。如下图所示:
四、压缩脱壳文件启动程序LordPE,如下图所示:
点击重建PE按钮,选择文件bass.dump_.dll,压缩后文件大小从324K变为192K。
五、验证脱壳有效性解压bass音频库中C\bin下的spectrum.exe文件到脱壳dll文件所在目录,重命名bass.dump_.dll为bass.dll,双击运行spectrum.exe,程序没有崩溃,出现选择播放文件窗口,如下图所示:
|