Code Splicing本质上是一种Anti-Dump机制。远离就是在加壳的时候抽取一部分代码,并在其中参杂些许垃圾指令。壳运行的时候申请一块内存,再把这些指令和原始的位置用jump连接起来。
大体流程如下:
1. VirtualAlloc申请足够大的内存空间。 2. 使用zlib解压被抽取的代码到该空间。 3. 解压一个表。该表的内存如下 +0 - 原始跳转jump offset的偏移。 +4 - 被抽代码相对于buffer的偏移。 +8 - 有效的Splicing Code的长度。 4. 解压完之后就可以利用这个信息把原始的代码和Splicing Code进行连接。 处理方法:
因为加壳的时候处理比较多了在壳流程中能做手脚的地方不多。大体的解决思路是:
- Arminline的方式,壳走完之后,通过对text段进行反编译、去花,完成修复。
- VirtualAlloc的时候把地址写为壳段中的一个地址,最后通过补区段的方式解决。