手动构建PE文件

来源:互联网 发布:淘宝网信用卡支付 编辑:程序博客网 时间:2024/05/22 09:03

手工用16进制编辑器编一个PE,做到弹出一个MessageBox并且尽量缩小大小。


1. 可以缩减的地方


PE头可以缩减,因为是重新构建的关系,所以可以把3C处偏移到Nt头的节对齐大小位置,然后后面内容就按照这个节大小值去设置就行了,偏移位置有0x02、0x04,0x02的0x3C处在值的中间,导致对齐大小太大,所以选择0x04,这是节对齐正好就是4。设置可选头大小和数据目录大小,这样也可以缩减,但是缩减后OD调试会有问题,所以还是保留原来大小。去掉重定位,如果有间隙就在间隙里写导入表的一些东西,代码也写在间隙里。对于需要的字符串,看看有什么不用的或者保留字段,放进去就行了。


2. 开始编辑


对齐大小写的是4,不用重定位,先写到节表,导入表没写,代码没写,入口点写了0x04用来调试,先用0xEE填充可以乱填的部分(那几个地方太短了基本上什么都不能存),一会往里面塞东西。对话框显示的标题和内容和导入的dll名称我已经先放进去了(都是可以乱改的字段)。节大小不要超过文件大小,不然会出错。

因为VirtualAddress和RawAddress一样,所以不需要调整什么地址了。下面添加导入表。

改了一些bug,现在就剩代码了,写在文件末尾。测试时发现直接跟着写不行,Loader读导入表似乎是判断导入表之后的某个字段是不是为0的(不是应该用结构总大小除以结构大小得到数组长度吗?),所以要多16字节才能跟代码,所以变成这样(改了一些BUG):


搜了一下网上的其它tinype,最小可以到97字节,不过它们把数据目录和可选头精简了,运行时就变成Dos程序了(具体不了解为什么会变成那样),运行了也没什么反应,那个应该是能运行的最小PE吧,倒是弹个窗口啊。
改了一些节表的BUG,最终结果349字节:

下面是运行效果,WinXp 32位通过,Win7 32位通过,Win8 64位不通过。

贴一下16进制:
4D5AEEEE504500004C0101005573657233322E646C6C0000E00002010B01000000000000000000000000000048010000B20000000000000000004000040000000400000004000000000000000400000000000000A803000020010000000000000200008100001000001000000000100000100000000000001000000000000000000000002401000014000000000000006C6C000000000000000000000000000000000000000000000000000000000000000000004D657373616765426F784100B2000000000000000000000000000000000000000000000000000000C00000000800000000000000000000000000000000000000000000000000000054657374000000004B010000040000004B0100000400000048656C6C6F576F726C642100680000E03000000000000000000000000C000000C0000000000000000000000000000000000000006A0068FC00400068140140006A00FF15C0004000C3


0 0
原创粉丝点击