前言

最近想尝试写个代码混淆器,所以尝试先看看市面上的壳有哪些操作可以学一下,防止走歪路

快速认识 VMP 3.x 第一部分 壳代码篇 - 吾爱破解 - 52pojie.cn

快速认识VMP 3.x 第二部分 代码变异篇 - 吾爱破解 - 52pojie.cn

🔥 Quick look around VMP 3.x - Part 3 : Virtualization | r0da’s Blog

看的主要是这三篇博客

基本操作

加壳

这个部分是一般的壳都会做的操作,对可执行文件的节区进行压缩和加密防止被静态分析

原始节区的内容被放入.vmp1节区,含有被加密的节区内容,壳代码,节区信息

VMP使用ZwProtectVirtualMemory函数来修改节区权限从而执行解密代码

IAT混淆

原始IAT还存在,但是不会被使用,所有调用API的操作,都会被转换为运算时动态执行

具体是

1
call dword ptr ds:[<&targetFunction>]

变为等长的

1
2
push reg
call api解析器

api解析器中通过一些计算得到地址然后用ret跳转到api函数中

代码变异

VMP会向代码中加入垃圾代码,等效替换,控制流保护

关于插入垃圾代码和代码替换这部分不是很清楚它是怎么做的。

控制流中,VMP添加了更多无条件跳转,同时拆分了代码块,让函数和函数交错在一起,代码块不一定是对齐的,这导致了顺序的反汇编器很可能失效