1625-5 王子昂 总结《2017年12月15日》 【连续第441天总结】
A. .Net的保护和对抗(1)
B.
强名称
这是一种框架提供的验证机制,主要功能是标识版本和原作者
在编译生成可执行文件后可以通过密钥对程序签署强名称,签署后如果直接修改源程序则会报校验错误
对抗方法:
- 直接移除
- CLR头的flag位
- CLR头的StrongNameSignature偏移
- Assembly表中的flags项
- Assembly表中的PublicKey项
- 重新签署强名称
- 给系统打补丁
名称混淆
从最早的DotFuscator免费版,到更多强大的混淆软件都是用来混淆名称的
最简单的名称混淆原理是改变PE文件中#Strings流的数据,使得类、方法、属性等名称被替换
但是有一个很关键的问题,对应Dll及其中的方法名称也需要被改变
这就引入了一个破绽:系统Dll的方法名是无法被改变的,因此调用的库函数无法被混淆
流程混淆
方法级的流程混淆
一般为建立新类和方法,包装系统库函数或是其他的内部函数来隐藏IL代码级别的流程混淆
将原方法的IL代码次序打乱,比较类似asm汇编的花指令。但由于本身特点,所以效果相对而言要次很多。不过能干扰Reflector一类的反汇编器直接得到高级语言代码
压缩壳
基于.Net平台编写
原理为将源程序压缩,运行的时候动态解压到内存中进行运行
不过为了防止dump,有的壳会做一些手脚,例如分方法解密,执行完后清除等等
基于Win32平台编写
与传统壳相同,加密以外壳程序来调用。特点为外壳程序为Win32
对抗方法还是多种多样的Dump,对于动态地、部分地解密需要进行多次Dump