起因

由于某些特殊的原因,有了这次逆向工程。恰逢元旦放假,还是放一天半,这对于我们来说还真是多啊。于是就有了这次逆向工程。

由于原来完全不懂逆向工程,就开始满网络找找教程。看了一圈后思路渐渐就清晰了。

工具

  • ILSpy查看代码,反编译,注入进程调试。
  • DE4DOT反混淆器。
  • GrayWolf查看代码,反编译,修改IL代码,再编译。
  • ildasm/ilasm微软自带的.net反编译、再编译器,装了vs后在安装目录可以找到

过程

首先我并没有看出有进行混淆,就直接看代码理解逻辑,使用ILSpy进程注入进行调试,代码大部分是操作数据库,看了几个小时候找到了程序的入口和登陆界面的代码。认真看了一下,发现只需要在条件判断前添加一个修改变量值的代码即可,于是尝试用ildasm和ilasm进行反编译和再编译。结果开始就不行了ildasm在反编译前会查看程序的SuppressIldasmAttribute属性,如果程序声明了这个属性便提示无法反编译。网上的普遍解决办法是通过用文本编辑器打开ildasm,找到SuppressIldasmAttribute这个字符串并修改成其他的就行了。修改之后成功反编译成IL代码,定位登陆界面代码,修改,使用ilasm再编译一气呵成。但是ilasm的报错十分的扎眼,查看目录下,并没有想要的程序编译出来,看了下报错,好像是什么资源文件的问题。baidu、goole一圈后发现ilasm这东西限制非常多,而且经常无法编译,于是放弃转向其他反编译器。在这之间知道了混淆这种东西,用DE4DOT反混淆后代码逻辑更清晰了。尝试了多种反编译IL,再编译的软件,再编译的软件都无法正常的打开,正常打开没有任何报错,就是没有反应,使用ILSpy调试发现各种报错。查找资料发现他们都是使用开源.net项目mono中的代码进行对源程序的修改,很多都是用的reflexil插件,我不知道是什么原因,不管是DE4DOT反混淆的程序,还是各种修改IL代码再编译的程序编译出来好像都破坏的源程序。而另外一种方法反编译出的c#代码并没有什么用,不管用什么反编译,导入vs后都是成百上千个错误,很难修改。于是我就在这卡住了。最后发现了GrayWolf,也有反编译再编译的能力,抱着试一试的想法试了一下,最后就成功了。不知道为什么GrayWolf就能够修改IL不破坏已经混淆过的程序。

坑点

  • ildasm的SuppressIldasmAttribute检测
  • ilasm的各种限制各种编译不了
  • DE4DOT反混淆后的程序可能会被破坏,无法正常运行,但是可以用来理解程序逻辑
  • 各种修改IL的程序都可能会破坏程序本身,mono本身的代码可能有问题
  • 混淆后的代码反编译出来基本不能用

总结

  • 一般.net程序防止反编译的方法有

    • 加壳 使用脱壳程序脱壳,这次没有碰到
    • 混淆 使用DE4DOT反混淆
    • 强名「防止程序被修改」 据说重新签名有用
  • 修改.net程序的一般步骤

    • 查看是否是.net程序
    • 查看是否加壳,进行脱壳
    • 查看代码是否混淆,使用DE4DOT反混淆理解逻辑
    • 使用ILSpy进行进程注入调试,进一步了解程序逻辑
    • 使用GrayWolf对源程序IL代码修改,再编译。
    • 如果有强名,进行重新签名。