[原创]对.net程序进行手术的一点小小心得:)
1. 用ilspy、dotPeek、JustDecompile、Reflector等工具,反汇编源代码成C#,用ilspy动态调试,找到关键点
2.1 用SimpleAssemblyExplorer打开,对比ilspy中找到的关键点,直接修改il,保存修改文件,大部分没有强名称的程序立刻能运行,检查找到的关键点是否正确。用这类直接修改il的工具,补丁后的文件与原文件对比,改变的地方比较多,文件差异比较大,一部分程序可以直接运行,另外一部分有强名称的,程序运行提示错误。对dll做过任何修改,过不了强名称,不能用gacutil /i的方式安装dll到GAC,解决方法有:1.直接复制到GAC中替换同名文件(有朋友说会导致莫名其妙的问题,可能是修改过度,可考虑下面只补丁几个字节的方法),2.重新签名,可对付某些SDK的dll。3.将dll从中卸载或删除,将补丁后的dll复制到exe目录。
2.2 用ildasm反汇编成il,对比ilspy,找到关键点,设置ildasm,让其显示字节码,参考字节码,手工用二进制编辑软件对文件进行搜索、替换。这种方法补丁后的文件,与源文件对比,改动较小,可能只用几个字节,但也不能用gacutil /i安装dll到GAC。再好点的方法就采用2.3的方法
2.3 将文件直接用ildasm或DotNetHelper反汇编成il,直接修改il文件,再编译生成exe或dll,重新签名即可。(遇到混淆过的,先用de4dot反混淆,再修改),遇到il无法编译的,只能采用2.2的方法,直接手工修改exe的二进制文件。
3. 关于重新签名,试过Strong.Name.Helper.v1.7-whoknows、StrongNameRemover、admiraldebilitate_v0.2等,都不理想,(可能是我的问题,不会用),自己觉得最有效的方法是采用批处理+snr,先替换签名,再重新生成key用sn签名。对dll重新签过名了,调用他的exe文件也需要替换签名或重新签名。
4. 当直接修改il时,拿不定il命令是否对的,可以用1中提到的工具将程序反编译成项目文件,提取相关部分的c#代码,先修改成想要的内容,在VS中编译,生成exe或dll,(也可以用Reflector的Snippy)再用ildasm去把il代码抠出来,对比着来对原来的程序进行补丁。
自己常用2.2方法,大部分不用重新签名,最小修改后替换到GAC中。
以上是个人总结的,如果有不对的地方希望大家能指点一下,有用的,请致谢哦:)
