手动修改PE文件:删除Dos Stub

本文介绍了如何手动修改PE文件,详细步骤包括删除DosStub,合并DosHeader和NtHeader,修改节表Raw Address,以及后续的相关调整。通过实例演示,解释了每个步骤的必要性和操作方法,最终实现程序的正常运行。
摘要由CSDN通过智能技术生成

自己动手丰衣足食。前面说到Dos Stub是可以删除的,现在要说的不止删除Dos Stub,顺便把DosHeader跟NtHeader合并了。写这篇的时候我是编一个只用了一个MessageBoxA函数的程序。做了一些优化,把程序结构和代码都搞得非常简单,因为现在是手动修改,结构太复杂的话手工改不过来。下面开始。


1、删除DosStub并且合并DosHeader、NtHeader


别吐槽这个标题为什么那么长。预先要了解的是,Dos Stub在两个头之间,Dos头只有2个字段有用:MZ魔数和0x3C处的Nt头偏移。也就是说,Dos头和Nt头的某些部分可以重叠在一起,只要重叠后的0x3C处是Nt头的修改了也无所谓的字段就行了。下面开始找位置。Nt头的0x3C位置是节的对齐大小,这个是不能乱改的,只能往前找;BaseOfData在64位程序中会跟ImageBase合并在一起,所以为了通用性也不能在这里;BaseOfCode乱改貌似没什么事发生,只是OD载入时会提示有错误,反正程序能正常运行就先用这里吧。这里的位置为Nt头的0x2C处,而我们需要把这个字段放到0x3C处,所以在Dos头的0x10处为Nt头起始地址。
根据前面的结果,只要把从0x10到Nt头之间的数据全删掉就行了,这堆数据中就包括了DosStub。删除掉之后,需要在0x3C处填入现在的Nt头的偏移0x10(注意是DWORD),这样也就完成了两个头的合并。



2、修改节表Raw Address


如果光删除那段数据就能用的话,那就可以默默地呵呵了,不过没那么简单。因为后面的东西整体往前移了n字节(我在此次编写中使用的程序删掉了0xC8个字节,因为0x10处到Nt头之间有这么多字节,其它程序不一定是这个值,后面就先用它来说了),所以后面牵连到一堆东西都要做修改。节表的RawAddress指的是文件中的偏移,现在数据往前移动了,这个地址也要跟着减小。所以在这里要把节表中所有的RawAddress都减掉0xC8,修改完毕之后就可以发现导入表和资源等内容在CFF Explorer中可以看到了,但是此时程序还不可运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值