微软的.NET以及MSIL语言出来好多年了,以前有从逆向的角度去分析过一些代码,但是逆向修改代码并且编译回去还是第一次做,下面是具体的逆向步骤(下面以DLL为例,.exe类同):
1. 使用ildasm.exe 工具来加载.NET开发的.DLL文件,加载后该工具将整个Meta信息分析得很清楚(譬如Namespace、类名、常量定义、函数定义等),在文件->转储,在接下来的框根据自己的需要勾选相关选项,建议选上“转储IL下面的所有选项”,这样在逆向后的代码阅读时很方便对号入座,转储后的文件分为2个:xx.res, xx.il文件。
附录:ildasm.exe在诸如如下的位置上: C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools.
2. 使用Red Gate Software公司生产的Reflector来反编译对应的.DLL文件,然后找到对应的代码去分析,一般没经过搅乱的代码是非常容易看懂的,几乎不用费多大的力气就可以找到你自己需要改动的地方,这一点比旧的汇编容易很多了,看来以前的专业cracker都要“失业”了,呵呵。
附录:http://shop.reflector.net/download 下载Reflector即可。
3. 修改:这点跟查看一下MSIL的specification就可以完成了,或者简易方法是直接代码对比看看就了解了,修改完了xx.il别忘了保存一下。
4.编译回去:
强命名方式:
回到文件头,把publickey删掉,因为我们已经修改过il了,所以原来的签名肯定是无效了,我们要重新签名.
特别注意:publickey去掉是应该去掉对应的DLL部分,其结构看起来形如:
而不是形如:(这个是mscorlib的调用的publickey)
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
在cmd下输入
sn -q –k MySign.sgn //产生自己的公钥和私钥
ilasm /dll /resource:dump.res /key:MySign.sgn dump.il /quiet (不带路径编译)
ilasm /dll /resource:C://Temp//xx.res C://Temp//xx.il /quiet (带路径编译)
弱命名方式:
直接编译:
ilasm /dll /resource:C://Temp//xx.res C://Temp//xx.il /quiet
具体的例子由于牵涉到软件的版权问题,在此不做发布,大家可以对照这个方法自己写个小的测试软件试试看。
附录:ilasm文件在诸如如下的地址当中:C:\Windows\Microsoft.NET\Framework\v4.0.30319。