• PE格式第五讲,手工添加节表


             PE格式第五讲,手工添加节表

    作者:IBinary
    出处:http://www.cnblogs.com/iBinary/
    版权所有,欢迎保留原文链接进行转载:)

    首先我们要用汇编编写一段汇编代码,用来生成标准PE

    一丶标准PE生成的汇编代码

    .386
    .model flat, stdcall
    option casemap:none
    
    include windows.inc
    include user32.inc
    include kernel32.inc
    
    includelib user32.lib
    includelib kernel32.lib
    
    .data
        g_szMsg db "Hello PE!", 0dh, 0ah, 00
    
    .code
    START:
      invoke MessageBoxA, NULL, offset g_szMsg, NULL, MB_OK
      invoke ExitProcess, 0
    
    end START

    然后可以生成一个标准PE

    当然为了讲解这里使用标准PE,你也可以自己随便找个PE尝试.

    二丶手工添加节表

    手工添加节表,我们首先有几个步骤

    /*
    
    1.复制一个节到最后一个节下面
    2.在NT头中的文件头中,修改节区数量的个数
    3.修改节表中新节的虚拟地址大小 
    4.修改节表中文件的对齐值
    5.修改节表中新节的虚拟地址
    6.修改可选头(选线头或者叫做扩展头)中的镜像大小
    */
    写完才发现好像比这里面多一项,自己看下吧.有图有教程.不难.

    首先我们先做第一步,找到最后一个节,拷贝一份,复制到下面

    1.寻找最后一个节,复制到下面

    当然也可以不是最后一个,不过最后一个比较方便

    使用010 Edit打开我们的Hello.exe,找到最后一个节

    010有强大的模版功能,使用模版,可以直接找到最后一个节,我们可以看到,现在有3个节存在

    复制最后一个节,拷贝到0220h的地方

    现在已经完成了第一步了,复制节到下边

    2.修改NT头中的文件头中的节区数量

    修改为4,使用模版功能可以快速找到

    3.修改表中虚拟地址大小

    使用010的模版重新解析以下,会发现我们的节已经添加了,现在要做的就是修正偏移了.

    点击我们的节,开始修正偏移即可

    修改我们新添加节的虚拟地址大小

    4.修改新节中的虚拟地址

     

    上一个节的虚拟地址是从3000开始的,所以我们修改为4000h,相差一个分页即可.但是注意上图可以看出,我正要修改,还没有修改,这里我是修改了,只不过为了方便大家观看为什么修改,所以我在开始编辑的时候就截图了

    5.修改文件对齐值

     

    文件对齐值默认是512,也就是200h,所以这里不用修改,但是注意,文件对齐值在可选头中可以设置的.不过最好不要动了.

    6.设置文件偏移

    上一个节的文件偏移是800开始,代表了节区的地址在800的位置,那么我们新添加的就改为A00h

    %200(文件对齐值)对齐,这个地方使我们的节区

    7.添加文件大小

    上面我们设置了文件对齐值是200h了,那么我们就要添加200h(512)个字节,在对应的文件偏移处

    我们设置的文件偏移处是A00,所以拷贝512个对齐值复制到A00位置即可.

    8.设置文件映射大小

    我们新添加了一个节,那么映射到内存中就要多出一个分页大小,我们要设置一下

    设置位置 NT头->可选头->sizeofImage(文件映射大小)

    保存PE文件,我们运行,然后OD调试查看.

     

    OD查看一下是否成功添加节

    跳转到虚拟地址处查看

    是我们设置的90,所以已经成功添加了一个节

     

    作者:IBinary
    出处:http://www.cnblogs.com/iBinary/
    版权所有,欢迎保留原文链接进行转载:)

  • 相关阅读:
    HttpServletRequest request 获取form参数的两种方式
    mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法
    Better exception message for missing @RequestBody method parameter
    下载Xcode历史版本方法
    CGLib与JDK的动态代理
    LeetCode: Longest Consecutive Sequence [128]
    POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
    JBoss AS 7性能调优(三)
    java的Future使用方法
    Redis学习资源
  • 原文地址:https://www.cnblogs.com/iBinary/p/7679712.html
Copyright © 2020-2023  润新知