首页
社区
课程
招聘
关于PE BoundImport如何确定其物理地址
发表于: 2012-11-21 11:22 4558

关于PE BoundImport如何确定其物理地址

2012-11-21 11:22
4558
我自己用VC写的程序,BoundImport一般都是0,但是notepad.exe会有Bound Import。gg了一翻,都只说了这个东东的做用,然后在增加节的时候可以利用它。可是如何确定他在文件中的物理地址呢?IMAGE_DATA_DIRECTORY中只有一个RVA和一个Size。其他字典的数据一般都是在数据节中的,所以可以通过查找RVA在哪个节的区间来确定它的物理地址,但是BoundImport没有在数据节中,难道它的位置是确定的,接在节表的后面的吗?

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我顶顶....
2012-11-21 13:28
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
help
2012-11-21 13:28
0
雪    币: 1501
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我来给你指一下找到BoundImport的方法
DOS header->PE header->optional header->optional header里最后一个成员就是data directory(数据目录表)
data directory由NumberOfRvaAndSize个(也就是说data directory包含很多个IMAGE_DATA_DIRECTORY结构体,数量由NumberOfRvaAndSize决定)IMAGE_DATA_DIRECTORY结构体组成
NumberOfRvaAndSize在data directory之前,也就是optional header的倒数第二个成员
data directory一共有16个IMAGE_DATA_DIRECTORY 结构数组
------------------
再补充个为什么是16
这个16是因为在PSDK中有一个宏定义,定义如下
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
--------------------
以序号0开头
序号11就是你要找的Bound Import
↑你就可以根据上述描述的情况找到Bound Import的地址了呀
------------------------------------------------------
再给你补充个PE结构总览图
DOS头
   MZ头部
   DOS存根
PE头
   PE标识
   文件头
   可选头optional header上文说的就是这个
节表
   节表一
   节表二
节表数据
   节表数据一
   节表数据二
-------------------------------------------------
下面介绍IMAGE_DATA_DIRECTORY 结构数组
IMAGE_DATA_DIRECTORY STRUCT
  VirtualAddress dd ?
  isize dd ?
IMAGE_DATA_DIRECTORY ENDS
----------------------------------

不知道你是否听懂了?
希望能帮到你。
另外看雪早就有帖子讲述相关的知识点的。你可以搜索一下 应该是讲PE结构的第六章的一个帖子
地址我帮你找到了 501K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6u0r3K9%4y4K6k6q4)9J5c8Y4c8#2N6r3!0J5K9h3q4D9i4K6u0r3j5$3S2S2M7o6S2Q4x3X3b7I4i4K6u0V1y4W2)9J5k6h3S2@1L8b7`.`.
希望以后多看看看雪的安全文库,多多发挥自学的能力。
2012-11-22 16:29
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
  大哥你完全没理解我的意思啊。。。。
不过还是谢谢你吧,总算有人回贴了,唉....
2012-11-23 10:18
0
雪    币: 1501
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你在上述文章中一共问了两个问题
        1.可是如何确定他在文件中的物理地址呢?
        2.难道它的位置是确定的,接在节表的后面的吗?你是指BoundImport的位置还是指BoundImport的值所对应的位置
我在回帖中的前半部分刚好回答了你的这两个问题。
如果我理解正确,我又改了改上面的帖子。你再看看。
如果我还是没理解对,那请问您要问的是什么?恕我愚笨没能理解。能详细描述下嘛?
2012-11-23 13:33
0
雪    币: 3312
活跃值: (3189)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
LZ,楼上已经回答你的问题了,通过data directory就能确定Bound Import
的RVA ,然后通过RVA确定Bound Import到底是在PE头,还是在某个区段里。
2012-11-23 13:53
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
其实我只是想知道BoundImport数据的位置,我自己实现了PE增加节的功能,所以对于你所提及的PE基本结构我都是知道的。我唯一的疑问是BoundImport数据的位置是如何确定的。因为在IMAGE_DATA_DIRECTORY中,只是指定了它的RVA,而没有指定它在文件中的物理位置。现在我想我已经理解了,7楼说的对,根据RVA的大小可以判断它是在PE头里还是在区段中,如果是在区段中就很好确定它最终的物理位置,如果是在PE头里,就肯定是接在节表的后面。
之所以有这样一个疑问是因为看到网上别人写的增加节程序,如果PE文件中有BoundImport的话,就认定了它一定是接在PE头的后面。其实这只是编译器的行为,如果开发时故意将BoundImport放到区段中的话,直接这样修改就会导致软件无法运行。
2012-11-23 16:10
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢回复,现在我已经知道了
2012-11-23 16:11
0
游客
登录 | 注册 方可回帖
返回