由浅至深 谈谈.NET混淆原理 (四) — 反混淆(原理 + 工具篇)
由浅至深,谈谈.NET混淆原理 — 五(MaxtoCode原理),六(其它保护方法)
原地址:http://aplo.cnblogs.com/archive/2006/07/18/453600.html
看到了关于MaxToCode的破解文章我也来谈谈我的破解过程。
我也研究过,并且自己写出了一个类似的程序,MaxToCode起到一定保护作用,因为任何给予CRT的托管代码都逃不过Profile的检查,如果编写一个Profile程序(可以参考MSDN),在CRT编译开始的时候动态读取内存内容,就可以得到Assembly的实际编码内容。
先讲一下MaxToCode的原理,
被MaxToCode加密过的程序运行过程如下:
1.CRT加载加密Assembly。
2.程序调用加密Assembly中的类。
3.执行被调用加密Assembly中类的静态构造函数(这就是MaxToCode进行IL转换时候添加的,如果该类存在静态构造函数,则把该函数改名,然后添加自己的函数,再在函数末尾调用原来的函数。MaxToCode添加静态函数的原因就是,在执行加密的类代码之前,动态解密加密Assembly原来的IL代码,再将代码根据IL表恢复原有代码存放的内存地址,这时候CRT编译加密类的某个被调用的方法时,程序代码时已经是原有代码了,并不是加密过的代码。其主要应用的Win32API是MemoryWrite,MemoryRead)
经过第3步以后,内存中的代码已经是没有加密的代码了,这时候可以动态读取内存,得到源代码,OK!破解了。
4.程序按照原有的执行顺序执行。
………………
MaxToCode大体的执行过程就是这个样子的。可能会略有出入。不过思路应该是一致的,
根据上面的执行过程我们也不难猜出其的加密过程(不一定完全一致,思路差不多)
1.利用ildasm.exe反编译程序,得到IL代码。(调用Win32API:CreateProcess或者WinExec,并加上程序运行参数)
2.去掉签名和注释。
3.分析IL代码(应该是利用正则表达式)
4.判断Assmebly中每个Class是否含有静态构造函数,如果没有加上自己的函数作为该类的静态构造函数,否则将原有的方法改名,添加自己的函数并在函数末尾调用被改名的函数。该函数就是动态解密的函数,这个函数在它附带的DLL中。
5.保存更改好的IL代码。并利用 ILAsm.exe 编译更改的代码。(这时候并没有加密原有函数)
注:MaxToCode中间处理的IL代码被保存在“C:\Documents and Settings\[用户名]\Local Settings\Temp”临时目录里,好像是这个,因为破解太久了记不清了,你可以搜索一下“C:\Documents and Settings\[用户名]”而且在其编译IL完后,好像没有删除更改和没有更改的IL代码。你可以利用windows的搜索上面这个目录后缀为il的文件。应该就是了。
6.打开编译好的文件(DLL或EXE)根据文件的原数据,找到每个类方法的文件偏移量以及大小,读取其内容进行加密,写入文件的其它位置(具体我没有分析,你可以新建一个Section,也可以修改原有的Section,然后更改偏移量。具体做法很多,你可以参考PE文件结构),最后修改原有每个类方法的数据(不知道是不是糊填的,没有研究)并保存该DLL或EXE,并将MaxToCode附带的解密DLL拷贝到程序目录下。
7.加密过程完成。
基本思路是如此,此外还会涉及到别的比如资源等等。
差不多也就说到这里了。MaxToCode完全可以对它进行解密。而且无论其算法在安全,利用CRT自动检测文件的特性(比如说不能修改其入口地址等等,如果出错就报错。),绕过它的算法。进行破解。
总而言之,对于大型程序来讲。模糊处理还是一种最安全有效的方法。因为没有人能够看懂几百万行,没有注释,变量名随机的代码。
除非那个人是“天才”。
这里有我做的一个类似的加密程序(没有做签名处理,所以不要用带签名的程序)