https://bbs.pediy.com/thread-223629.htm
asmjit参考https://www.cnblogs.com/lanrenxinxin/p/5021641.html
1.代码对push/mov/add/sub/cmp指令进行膨胀
2.对push/mov的立即数进行加密
3.跳转call指令转为如下指令进行变形
/* <---esp3 |__| -16 |__| -16 |_reg2_esp0_| -16 |__| -16 |__| -12 |__| -12 |_reg1_| -12 |__| -12 |__| -8 <---esp1 |__| -8 <---esp2 |_reg2_| -8 |__| -8 <---esp4 |_reg2_| -4<--esp0 |_Jmp_addr_| -4 |_Jmp_addr_| -4 |_Jmp_addr_| -4 |_reg1_| 0 |_reg1_| 0 |_reg1_| 0 |_ret_addr_| 0 push reg1 push reg2 ;---->esp1 mov reg2, jmp_offset add reg2, addr_table_base ;根据地址表索引找到正确偏移值 mov reg1, dword ptr ds:[reg2] add reg1, base ;加上基地址, 得到目标地址 pop reg2 sub esp, 0x4 mov reg1, dword ptr ds:[reg1] mov dword ptr ss:[esp], reg1 ;写入jmp地址, 类似于push指令 ;---->esp2 push reg2 ;保存原始的reg2值 mov reg2, esp add reg2, 0x8 mov reg1, dword ptr ds:[reg2] ; push reg1 ;保存原始的reg1值 push reg2 ;保存0处的esp值 ;---->esp3 mov reg2, no_jmp_offset mov reg2, addr_table_base mov reg1, dword ptr ds:[reg2] pop reg2 ;获取0出的esp值 mov dword ptr ds:[reg2], reg1 ;写入返回地址 pop reg1 ;恢复reg1, reg2原始值 pop reg2 ;---->esp4 retn ;retn 跳转到jmp_addr地址 */
原文:https://www.cnblogs.com/aliflycoris/p/9240035.html