Code Splicing of Armadillo

Code Splicing本质上是一种Anti-Dump机制。远离就是在加壳的时候抽取一部分代码,并在其中参杂些许垃圾指令。壳运行的时候申请一块内存,再把这些指令和原始的位置用jump连接起来。

大体流程如下:

1. VirtualAlloc申请足够大的内存空间。
2. 使用zlib解压被抽取的代码到该空间。
3. 解压一个表。该表的内存如下
     +0 - 原始跳转jump offset的偏移。
     +4 - 被抽代码相对于buffer的偏移。
     +8 - 有效的Splicing Code的长度。
4. 解压完之后就可以利用这个信息把原始的代码和Splicing Code进行连接。 处理方法:

因为加壳的时候处理比较多了在壳流程中能做手脚的地方不多。大体的解决思路是:

  • Arminline的方式,壳走完之后,通过对text段进行反编译、去花,完成修复。
  • VirtualAlloc的时候把地址写为壳段中的一个地址,最后通过补区段的方式解决。

发表评论