能力值:
(RANK:210 )
|
-
-
2 楼
稍等,这个小菜我来回答,大家不要给我抢啊
闲着没事,混个人品
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我每次都是找到DLL的名字(比如USER32.DLL),然后倒着往回算,不知道有简单方法没!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
|
能力值:
(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结构的位置,都一样,后者更简单些
|
能力值:
( LV8,RANK:130 )
|
-
-
6 楼
EP和import基本靠蒙
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
输入表是以IMAGE_IMPORT_DESCRIPTOR结构数组开始的,而这个数组的第四个变量为Name,就是指向被输入的DLL的ASCII字符串的RVA,所以你能倒推回去!
|
能力值:
(RANK:210 )
|
-
-
8 楼
搜索dll位置的后两位来确定那个结构位置。
不过在刚开始的时候我不知道文件头大小,搜索到一堆不能确定哪个是。
所以是通过搜索api名称位置来推的,麻烦但定位快点。
通过搜索AC就可以找到kernel32对应的那个结构位置了。
|
能力值:
( LV13,RANK:530 )
|
-
-
9 楼
根据VC6的编译器性质还是很好猜得
|
能力值:
(RANK:350 )
|
-
-
10 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
谢谢大家帮助。。我得仔细研究下了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
老大能否解释得详细一点,恕再下愚昧.
|
能力值:
( LV4,RANK:50 )
|
-
-
13 楼
ep开头的几个字节基本上是固定的,像vc6是55 8b EC 6A FF
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
如果是在一个完整的程序中应该好找,首先查找dll,找到一个dll名称(如果就一个最后再另找),记下dll的文件偏移C,根据C在节表中找其所在节,记下所在节的虚拟偏移A,文件偏移B,在文件中查找数值A-B+C,就能找到引入表。
|
能力值:
(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
让文件大小符合
这时后 整个文件就串起来了.
初学,有认识不足的请包含!
|
能力值:
(RANK:1060 )
|
-
-
16 楼
1. 找"kernel32.dll" , 记 rva = ab cd ef gh
2. 找 gh ef cd ab, 记 rva = x
3. import rva = x - 0C
|