首页
社区
课程
招聘
[旧帖] [原创]PE学习.动手写PE.见缝插针 0.00雪花
2011-8-6 18:25 5631

[旧帖] [原创]PE学习.动手写PE.见缝插针 0.00雪花

2011-8-6 18:25
5631
注册了这么久,到现在还是菜鸟,以后要抓紧学习了。
最近一直在看PE文件的相关资料,故想以此篇来做个引,希望能获得个邀请码,内容较菜,请高手木笑!

以下是我整理的PE文件结构图,希望对各位能有所帮助:(排版神马的,真痛苦啊,画好这图后才懂得如何贴图,哎-。-)
(菜鸟啊,连个图都搞不定,只好传个截图了,抱歉!)


接下来,让我们动手吧!
首先,让我们来明确下目的:
        1.构建自己的pe程序,知道了pe文件的结构后,我们就可以按照pe文件的格式手工“填写”属于我们自己的程序了。
        2.见缝插针,利用空白数据插入额外代码。
        3.通过增加节来插入额外代码(2的扩展)。(写晕掉了,有兴趣的同学自己实践下吧!)
其次,明确下程序情况:
        1.正如刚学任何语言一样,均从“Hello World!”开始,因此,我们也实现一个最简单的功能,我们的目标是弹出一个提示框。
        2.程序至少包含三个节(.text、.rdata和.data),从上图可知本例PE头大小应为544B,又Windows系统规定文件的对齐粒度应为512B,所以本程序的最终大小应为1024+3*512=2560B。三个节的起始地址分别为00000400h、00000600h、00000800h。
       
       
进入正题:
                                                                    一、构建PE文件
1.新建一空白文件,以任意16进制编辑器(如WinHex)打开此文件,接下来,如果使用WinHex的话,可以通过Edit->Paste Zero Bytes 以2560B(此程序的大小)填充本文件。
2.针对各个部分进行数据填充,结构的详细信息请自行参考其他资料(如老罗的Win32汇编、坛里的各位大大的文章等),此处仅将必要的字段进行赋值,并在图中将相应的信息进行标注,以便学习。
     2.1 DOS文件头和块:(偷懒下)我们可直接copy常见pe文件的前B0h字节。如图一。

     2.2 PE文件头:
        来到B0h偏移处就是PE文件头的开始处(如图),其重要字段设置的对应关系如下:
        50450000 -> PE文件头标志
        4C01         -> CPU类型 i386
        0300         -> 区块数目
        E000         -> 可选头大小
        0F01         -> 文件属性,设置为exe文件
        0B01          -> 普通可执行文件标志
        00100000 -> 程序执行入口
        00100000 -> 代码节起始RVA
        00200000 -> 数据节起始RVA
        00004000 -> 建议装载地址
        00100000 -> 文件对齐值
        00020000 -> 内存对齐值
        0400         -> 最低子系统版本号
        00400000 -> 内存中整个PE映像尺寸
        00040000 -> 所有头加节表大小
        02000000 -> 文件子系统,图形界面
        10000000 -> 数据目录项数,默认16
        102000003C000000 -> 输入表,此处仅输入表有数据

     2.3 节表:
        节表从偏移1A8h开始,直至400h,填充数据如下图所示:
        其中,数据对应关系为:
        .text节
        2E74657874000000 -> 8字节的块名
        26000000 ->        实际使用的数据大小
        00100000 ->        起始位置
        00020000 -> 节大小
        00040000 -> 文件中偏移
        20000060 -> 节属性
        其余两节对应关系同.text节。

     2.4 .text节
        跳转到400h处,将所需代码的机器码填入相应位置,如下图所示,为了对齐,应填充至600h

     2.5 .rdata节
        此处含导入表,相对难一点。
        跳转到600h处后,填充数据如下图所示,

        此图的代表结构可以展示为以下四层:
        |        (n)IMAGE_THUNK_DATA(original)
        |        (n)IMAGE_IMPORT_DESCRIPTOR
        |        (n)IMAGE_THUNK_DATA
        |        IMAGE_IMPORT_BY_NAME
        其中,(n)IMAGE_THUNK_DATA(original)和 (n)IMAGE_THUNK_DATA 结构均需在每个结构后面添加全0结构以示结束;      (n)IMAGE_IMPORT_DESCRIPTOR 需在所有结构后面添加全0结构以示结束。
        未装入内存前,(n)IMAGE_THUNK_DATA(original)和 (n)IMAGE_THUNK_DATA 数组通过RVA指向IMAGE_IMPORT_BY_NAME数组;装入内存后(n)IMAGE_THUNK_DATA 指向IAT。
               
        (n)IMAGE_IMPORT_DESCRIPTOR结构的前后分别指向(n)IMAGE_THUNK_DATA(original)和 (n)IMAGE_THUNK_DATA。
        四者构成一环,指来指去。
               
     2.6 .data节
        跳转到800h处,将所需数据填充进去,如下图所示,由于对齐原因,应填充至1000h


                                                                         二、见缝插针
        从那么多0字节中,聪明的你肯定发现了什么,是我们动手脚的时候了!
        1.说明:此处只是简单的实现了篡改程序的功能,并没有在篡改后返回原来的程序,有兴趣的童鞋可以自己动手添加下增加返回原函数入口点的功能。另外,此处只是实现了在节的空隙中插入额外代码的功能。童鞋们也可以尝试下通过添加一个新的节来增加代码的功能。
        PS:高手莫笑!!
       
        2.首先,添加数据,如下图,转到800h处添加所需数据:
       
        然后,添加执行代码,如下图,转到400h处添加弹出另外一个窗口的代码:
       
        最后,跳转到D8h(程序的执行入口)处修改入口点数据,只需加上添加代码与代码段的偏移大小即可:
       
       
        最后的最后,来张全家图,菜鸟之作,忘各位大大多多指教!!!


PS:本程序所用笔记,截图以及程序如下:
PE学习.动手写PE.见缝插针(申请邀请码).rar

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞5
打赏
分享
最新回复 (29)
雪    币: 86
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gnnizhw 2011-8-6 19:08
2
0
我是菜鸟啊 ,PE用什么写呢?有教程没呢?
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-6 19:20
3
0
PE是文件格式,常见的如exe,dll等可执行文件都是PE格式的,建议你先找本书看看。

我这里是通过普通的文本+十六进制编辑器,一步步按那结构的格式填充起来的!
雪    币: 519
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsghphc 2011-8-6 20:08
4
0
感谢感谢感谢
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小P孩儿 2011-8-6 20:28
5
0
我觉得申请应该没问题
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-6 20:57
6
0
谢谢捧场!
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-6 20:58
7
0
承蒙吉言!
雪    币: 174
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
龙组 1 2011-8-6 23:45
8
0
这个不错,我觉得可以申请邀请码
雪    币: 1905
活跃值: (1422)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
z许 2011-8-7 00:57
9
0
楼主好厉害。。。希望申请成功。
雪    币: 577
活跃值: (168)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
金罡 1 2011-8-7 02:26
10
0
恭喜楼主对PE文件结构有了初步的了解,不过后面的路还很长很长很长。。。
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
RagingOX 2011-8-7 07:35
11
0
菜鸟学习了,昨天刚看了点关于PE的东西
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
loongzyd 10 2011-8-7 08:41
12
0
顶楼主一个
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-7 08:49
13
0
谢谢支持!
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-7 08:50
14
0
不厉害啊,只是刚起步,只好耐心点做下去了!
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-7 08:51
15
0
恩恩,确实还很长啊,以后多多指教!
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-7 08:52
16
0
共同努力,共同努力!
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-7 08:53
17
0
版主啊,顶的话,用力点嘛,多给几个邀请码!
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FreeBoyljj 2011-8-7 09:57
18
0
不错不错……
雪    币: 24
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
waitingcz 2011-8-7 10:15
19
0
支持楼主!
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孓冉 2011-8-7 10:19
20
0
不错。值得学习一下~~
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liysys 2011-8-7 11:25
21
0
学习了,多谢楼主分享
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zengde 2011-8-7 17:25
22
0
不鸣则已,一鸣惊人啊
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kklllw 2011-8-7 18:43
23
0
我觉得新手找这个入门很好。。我也不会PE。没空学啊。收藏着先。。有空看。。
雪    币: 212
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kisbuddy 2011-8-7 20:11
24
0
感谢ls各位的支持!
以后共同努力啊!
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
buerzhozhu 2011-8-7 21:56
25
0
不错,学习了
游客
登录 | 注册 方可回帖
返回