PE格式第五讲,手工添加节表
作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)
首先我们要用汇编编写一段汇编代码,用来生成标准PE
一丶标准PE生成的汇编代码
.
.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, .code
START:
invoke MessageBoxA, NULL, offset g_szMsg, NULL, MB_OK
invoke ExitProcess, 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/
版权所有,欢迎保留原文链接进行转载:)