PE文件代碼膨脹
阿新 • • 發佈:2018-06-28
tex push指令 ret 恢復 代碼 pan 根據地 ML p值
原文鏈接 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地址*/
PE文件代碼膨脹