PE文件代码膨胀

原文链接 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地址
    */

猜你喜欢

转载自www.cnblogs.com/aliflycoris/p/9240035.html