首页
社区
课程
招聘
[求助]Import Table RVA怎么根据.rdata section 找
发表于: 2007-8-27 20:58 10642

[求助]Import Table RVA怎么根据.rdata section 找

2007-8-27 20:58
10642
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
稍等,这个小菜我来回答,大家不要给我抢啊
闲着没事,混个人品
2007-8-27 21:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我每次都是找到DLL的名字(比如USER32.DLL),然后倒着往回算,不知道有简单方法没!
2007-8-27 21:32
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
找到DLL名字 怎么倒着往回算呢
上传的附件:
2007-8-27 21:48
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
5
首先在rdata文件里面找到下面的内容,api的名字一堆,就根据这个来找输入表。可以确定的是,必定会有一个指针指向这个名称,事实上这个指针就是IMAGE_THUNK_DATA结构。
下面来找这个指针的位置。lstrcpyA在rdata文件中的位置是794H(注意名称前面有一个dw).text文件大小是6000H,无论在内存和磁盘中都是对齐好了的,而文件头也应该是相对于磁盘对齐好的,200H的倍数。
于是可以确定lstrcpyA函数的名称在内存中的位置后两位必定是94H。搜索94H,可以找到好多还不能确定哪个是,没关系,因为同一个dll中的IMAGE_THUNK_DATA总是排列在一起的,再搜索lstrlenA位置的后两位a0h,这样就可以确定Kernel32.dll所对应的一堆TMAGE_THUNK_DATA的大概位置了,你还可以再找几个确认一下。(请注意根据这个还可以确定文件头的大小,可以看出lstrlenA名称的rva是A0 77 00 00 ,77A0-(该名称在rdata文件中的偏移量)7a0就是rdata段的rva,根据题意,rdata段的rva=文件头大小+text段的大小,于是乎文件头大小就是1000H)
然后找Kernel32.dll所对应的FirstThunk位置,其实就是这一堆IMAGE_THUNK_DATA结构的开头,刚才找到的位置往上找扒拉扒拉找到连续四个字节都是00的地方就是了.位置是04CH,rva=7000+4c=7068,搜索4c 70 就可以确定输入表的大概位置了,7068就是输入表中kernel对应的IMAGE_IMPORT_DESCRIPTOR结构的FirstThunk
       
输入表的开始比较好找,从刚才位置往上,找到不像输入表的就是开始了,结束是14H个0字节结束的.于是乎可以确定输入表的开头和大小。
注意:在搜索lstcpyA等位置的时候,会碰到两个内容一摸一样的地方,于是会找到两个“FisrtThunk”,他们分别代表kernel32.dll所对应的IMAGE_IMORT_DESCRIPTOR结构中的OriginalFirstThunk和FirstThunk,
你用哪一个都能找到输入表。
也可以直接搜索dll名称的位置,来定位IMAGE_IMPORT_DESCIPTOR结构的位置,都一样,后者更简单些
2007-8-27 22:11
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
EP和import基本靠蒙
2007-8-27 22:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
输入表是以IMAGE_IMPORT_DESCRIPTOR结构数组开始的,而这个数组的第四个变量为Name,就是指向被输入的DLL的ASCII字符串的RVA,所以你能倒推回去!
2007-8-27 22:15
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
8
搜索dll位置的后两位来确定那个结构位置。
不过在刚开始的时候我不知道文件头大小,搜索到一堆不能确定哪个是。
所以是通过搜索api名称位置来推的,麻烦但定位快点。

通过搜索AC就可以找到kernel32对应的那个结构位置了。
2007-8-27 22:20
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
9
根据VC6的编译器性质还是很好猜得
2007-8-27 22:21
0
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
10
这问题看看这文章,7年前写的,也有些参考作用:http://www.pediy.com/tutorial/chap8/Chap8-5-5-1.htm
;)
2007-8-27 22:23
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢大家帮助。。我得仔细研究下了
2007-8-27 22:41
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
        老大能否解释得详细一点,恕再下愚昧.
2007-8-28 01:06
0
雪    币: 177
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
ep开头的几个字节基本上是固定的,像vc6是55 8b EC 6A FF
2007-8-28 02:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
如果是在一个完整的程序中应该好找,首先查找dll,找到一个dll名称(如果就一个最后再另找),记下dll的文件偏移C,根据C在节表中找其所在节,记下所在节的虚拟偏移A,文件偏移B,在文件中查找数值A-B+C,就能找到引入表。
2007-8-28 10:15
0
雪    币: 10914
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
15
我来发表下自己的认识,有错请指正.

其实我们把它 分三个步骤:
1.import table  就是pe 头的 data directory 里的那项:它的值应该是 iid表开始的rva.
2.iid table :所给的 数据里好象没有iid表 可以自己建 它有五个成员组成,前三个可以留空,接着填.dll的rva,接着填该dll 对应iat表的起始rva.每个dll对应一个iid表.
3.iat table:这里存放的是 每个函数的rva,每个dll对应一个iat表,依次列出该dll每个函数对应的rva  以0 代表结束,接着列下一个dll的iat,(那么下一个dll iat表的起始位置当然也是从这开始);

这样填完后对应关系都对了 那么导入函数就就成功列进去了,引入表做好了.

那么rva怎么来的呢?
根据节表的rva,节表的rva 我们可以自己定义,比如我们把文件偏移1000h处 rva定为1000
且节大小为6000,那么文件偏移 1000h-6000h内rva也就是1000h-6000h
那么 这样文件偏移也就是对应的rva了.

然后第二节开始 文件偏移7000h rva为7000h 后面的rva 跟 文件偏移也一样了.

rva就这样确定了,(某位置rva-节rva=某位置文件偏移-节文件偏移,当然似乎也可以不相等).

rva确定了,我们发现数据里给好了iat表 如果不想用这个iat表,我们就可以根据 实际情况把他们修改了.

如果想用他的iat表,那么 lstrcpy那个是第一个函数整个iat表里 它的rva应该最小 ,看iat表最小的 是 7794,那么lstrcpy 的 rva就是7794,我们只需要 在iat表以上的位置 增加 或删减0改变文件偏移以使 lstrcpy的 rva为7794 那么 我们就可以不用改动他的iat表了,可以直接用了.

最后呢,节以1000h对齐 那么 文件结尾必须是1000h倍数,通过在结尾 增加 删除0
让文件大小符合

这时后 整个文件就串起来了.

初学,有认识不足的请包含!
2007-8-28 11:49
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
16
1. 找"kernel32.dll" , 记 rva = ab cd ef gh
2. 找 gh ef cd ab, 记 rva = x
3. import rva = x - 0C
2007-8-28 11:55
0
游客
登录 | 注册 方可回帖
返回
//