对Dotfuscator混淆加密项目的il层分析破解手记

Dotfuscator破解,Dotfuscator反混淆,il层破解

Dotfuscator是微软的VS开发工具自带的一款代码混淆加密工具,可以对.net程序实现混淆加密、模糊处理、代码压缩及篡改防御等功能,经过Dotfuscator混淆后会在加密的对象中添加一个DotfuscatorAttribute的类,可以作用判定是该工具混淆的特征。该软件小巧却很强大,能够阻止常见的反编译器形成有效的输出,在很多项目中都有使用该工具对程序进行保护的实例。本例中的项目即为采用Dotfuscator加密的动态链结库dll,由于项目采用了注册码机制,在没有授权的情况下本身无法正常运行或调试,也没有任何源代码可供参考。我们试图对项目流程和逻辑进行分析,尝试找到反编译破解Dotfuscator加密项目的方法。

通过Ref打开待分析的dll文件,可以看到不少的变量和方法名称都是无法显示的字符(如图),一些方法内部流程根本无法展开浏览,提示信息为:// This item is obfuscated and can not be translated。可见Dotfuscator不只对程序逻辑流程进行了混淆,还对字符串进行了特殊的加密替换,使得常规的反编译软件根本无法浏览其内容,更不可能导出或调试了。但是经过分析也发现,Dotfuscator所加密的字符串变量或方法名称都仅限于当前类的内部调用。也就是说,这些名称大都是私有变量或方法,涉及到外部调用的公共方法或变量并没有加密(当然,从理论上讲经过综合分析所有的调用也可以实现加密),因此这里至少给我们的反编译破解提供了些许便利。对于内部方法和变量,我们可以使用默认名称加编号的方式使用工具来还原,由于涉及到内部变量的使用和方法的调用,因此这必须在il层面进行替换。

Dotfuscator破解

我们首先尝试解决显示经Dotfuscator加密的字符,由于这些变量或方法仅内部调用,在名称被更改后原始信息将永久丢失,因此理论上不可能被解密。但是通过分析方法内部的逻辑,得到方法的功能后可以猜测到与名称相关联的信息,理论上可以手工重新自定义方法或变量名称。我们首先在十六进制编译器中打开dll文件,找到字符串定义部分,可以看到异常的十六进制特征码:00 E1 9C **,我们手工将其修改成可以显示的字符的数值范围内,这里只需要注意最后一个字节的数值需要根据原始数值的大小进行相应的变化。修改完毕后保存,再通过Ref加载后就可以显示出这些字符了。这一步的主要作用一是方便阅读,二是便于反编译器导出代码,否则导出的就全是空的名称了。

Dotfuscator破解

在名称可以显示之后我们首先使用自行开发的代码重构工具对il代码进行了分析和参数的自动命名,然后我们再通过分析代码调用和内部逻辑,对Dotfuscator加密字符串进行了还原,其还原过程对比图片如下(由于默认的字符排序顺序,这里的左右对比图片并无直接对应关系):

Dotfuscator破解

Dotfuscator破解

Dotfuscator对于流程的混淆强度非常高,直接用Ref无法显示其内容,我们使用自行设计的反编译器可以查看到混淆后的流程(这里我们暂不讨论反混淆Dotfuscator流程的方法)。通过对逻辑的分析后,我们确定了项目授权验证的机制。将dll反编译为il文件导出,找到授权验证函数,修改相应的il逻辑代码,由于该项目程序集采用了强命名策略,因此需要在il中删除掉强命名,再通过VS的强命名工具SN生成新的签名,再使用ilasm编译成新的dll文件。另外,由于项目中存在多个程序集,且相互之间存在引用,所以也必须在il文件中修改相应的publickeytoken,否则会出现引用程序集版本不一致的问题。

经过修改和编译后的新程序集经过调试,就能够正常运行了。

(注:本文为 [风影网络工作室] 原创文章,未经书面许可,严禁转载和复制本站的任何信息,违者必究)