2007新年,写此文和大家共同学习,并希望更多朋友一同研究.net软件安全课题。这次研究的对象是MuvAudio,这是一个.net软件,应该用得是CodeVeil加密,本文里涉及的内容包括脱壳,手动修复,后续工作留给读者了(定位关键代码,爆破+Keygen,因为有网络验证)。
    软件的下载地址是:http://www.muvaudio.com/。废话不多说,下面开始。
    拿到手先运行,看一下注册验证的方式,是输入用户名和激活码。用户输入错误时,会有提示。用Reflector载入,显示没有CLR头,是个本地软件。

http://bbs.pediy.com/upload/2006/8/image/1.jpg_434.jpg 

    用Peid查壳是UPolyX,记得以前看CodeVeil加密的软件也是显示这个壳,这个软件也是。我在《加密与解密》第3版中的.net章节里详细描述了CodeVeil的特点(当然,目前还没出版),这里简单说一下。CodeVeil用本地代码对.net的启动和JIT进行了包装,不过它最大的弱点是整体加密,整体解密,也就是说,在某一时刻内存中存在全部解密完成的IL代码,这便是我们dump的时机。因此第一步,便是dump。
    运行MuvAudio,随后用OllyDbg进行Attach,下断点在7906E7F4,这是.net framework 2.0中JIT函数的地址。随后点击任一个尚未运行过的方法,这里我们点击注册码输入窗口的Activate按钮。中断后,就可以进行dump了。

http://bbs.pediy.com/upload/2006/8/image/2.jpg_515.jpg 

    不了解为什么下中断在7906E7F4的请参考我以前的文章,也可以进行验证,验证的方法如下:注意中断时椎栈中的第四个参数:0013E648,显示该处数据如下,其中黄色高亮的值代表该方法的IL代码和大小。

http://bbs.pediy.com/upload/2006/8/image/3.jpg_528.jpg

    11010FFC指向原文件的.text节,将此时的数据与原文章处的数据对比,发现数据已经改变,这便是解密过的IL代码。扯远了,这些问题都在以前的文章中讲过,大家自己看吧。下面准备dump。
    运行NTCore小组的Explorer Suite软件中的Task Explorer,选择MuvAudio后dump PE,保存为MuvAudio2_Dumped.exe。再试一下用ildasm(或者Reflector)载入这个PE文件,仍然显示没有CLR头。当然,dump的PE仍然用的原被加壳PE的头,那个头是本地的,因此需要修复。在《加密与解密》第3版中我介绍了两种半自动的方法,不过有时不成功,这里介绍全手动修复过程,在工具修复失败时,手动是最保险的。这里要求对.net的PE结构有一定了解。(OllyDbg的任务也告一段落,可以关闭了。)

 http://bbs.pediy.com/upload/2006/8/image/4.jpg_537.jpg

    首先修复的是数据目录中的项,CLR头的具体结构就不再赘述,改为偏移为0x2008,大小为48即可。

http://bbs.pediy.com/upload/2006/8/image/5.jpg_552.jpg

    下面是输入表的修正。大家知道.net可执行exe中本地引入表只引入了mscoree.dll中的_CorExeMain,修复此项时可以参考别的.net Exe文件的数据值,主要是数据目录中的Import Table和IAT项。
    此时的IAT为0x2000,大小为8,这是正确的数值,指向了.text的最初始8个字节,不过该处的数据是错误的。

http://bbs.pediy.com/upload/2006/8/image/6.jpg_563.jpg

    应该修改为如下所示:

 http://bbs.pediy.com/upload/2006/8/image/7.jpg 

    0019EBC0指向哪儿呢?应该指向_CorExeMain的前两个字节处,在MuvAudio2_Dumped.exe中来到0019EBC0处,正好指向了_CorExeMain字符串。
    下面是数据目录中的Import Table项,0019EB90,大小大一点无所谓,就60吧。这里的引入表结构与win32下完全相同,不清楚的请查阅相关资料。

http://bbs.pediy.com/upload/2006/8/image/8.jpg_580.jpg

http://bbs.pediy.com/upload/2006/8/image/9.jpg_588.jpg 

    到这里,修正完毕。再用Reflector或者ildasm载入一下,OK,可以正常反编译了。下面的工作大家都知道,搜索关键代码,写出keygen或者进行patch。

http://bbs.pediy.com/upload/2006/8/image/10.jpg 

    不过这时的程序不能正常运行,要运行很简单,用ildasm编译一下,再用ilasm编译一下既可。附件中提供刚刚dump和文件,修正过的文件,以及最终用ilasm重新编译后的可执行文件,大家可自行对比。
    在进行任何代码修改时,不要忘了将强名称的代码删除掉。

http://bbs.pediy.com/upload/2006/8/image/11.jpg_610.jpg