基于.Net软件的反编译初探

苦于买不到火车票,尝试了一些口碑比较好的抢票软件,顺手做了一些反编译的尝试。

成果如图,也可以看到这篇要使用的样本:

稍微了解之后,总体感觉.Net平台下的安全相对于其他显得偏弱,常见的壳就是.Net ReactorSmartAssembly等,而且祭出神器de4dot基本可以秒所有了,如果de4dot还不能解决问题,那就用dnSpy,而且这两个出于同一个作者之手。
去了壳之后,可用的反编译软件就很多了,常用的就是ILSpyReflector,前者开源免费,后者付费,两者都可以搭配一个强力插件Reflexil使用。

壳的检测与定性

简单的,如果直接在Reactor中打开看不到任何反编译出来的代码,伴随提示:

1
索引超出了数组界限。


基本可以认定做了加壳处理。
具体壳的判定可以使用ScanId或者PEiD查看:

如果无法判别具体壳的类型就比较棘手了,可能需要做手动脱壳处理,大致过程也是找偏移量dump内存。

砸壳

识别出壳的类型之后就可以对症下药了。这里就直接用业界最强的de4dot来处理。
在找一个合适的de4dot的时候绕了很多弯路,github上的最新代码需要自己手动编译,找了很多的版本都不尽如人意(不支持样本使用的Reactor 5代壳)。最终找到一个提供在线编译服务的站点AppVeyor,总算用上了最新的de4dotde4dot,CI果然是造福人类啊~
砸壳其实简单,难的是,砸壳不砸坏了里面的肉。就是说,砸壳拿到可以反编译的二进制文件容易,难的是不破坏软件的可执行性,de4dot的作者特地开了一个wiki页讲这件事How to deobfuscate but make sure metadata tokens stay the same?,主要介绍的就是如果通过选项控制来权衡反编译后代码的可读性和二进制文件的完整性。
正确的姿势是:

  • 如果保留可执行性,一定要使用--dont-rename选项,当然如果要提高代码的可读性可以去掉
  • 总是使用-p选项来指定软件使用的壳的类型
  • 可以分别尝试32位和64位的版本

执行结果可能会有一些warning,无伤大雅:

反编译

砸壳之后可以导入可执行文件到反编译软件中了。这里主要使用IL Spy + Reflexil


套路还是一样的,通过检索关键字定位方法,反编译后的代码可读性极强,Reflexil又极强极易用,基本几个Edit,一个Save就完成了。


希望明天能用这个抢到票2333333