PE文件代码膨胀

Posted aliflycoris

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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地址
    */

 

以上是关于PE文件代码膨胀的主要内容,如果未能解决你的问题,请参考以下文章

Android片段布局完成膨胀

创建片段的新实例时菜单未膨胀

片段上的 Mapbox 膨胀视图

Android TabLayout ViewPager 不会在 backstack 上膨胀标签片段

第二次在对话框中膨胀片段时出错

Android:在drawerlayout中使用地图膨胀片段时出错