1. 程式人生 > >PE文件代碼膨脹

PE文件代碼膨脹

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文件代碼膨脹