|
1、认识Import表 著者: [yAtEs] [Jamesluton@hotmail.com] 译者:hying[CCG]
有很多介绍PE文件的文章,但是我打算写一篇关于输入表的文章,因为它对于破解很有用。 我想解释它的最好的方法是举一个例子,你可以跟着我逐步深入,一步一步的思考,最后你将完全明白,我选择了一个我刚下载下来的小程序,它是用TASM编译的,有一个比较小的输入表,所以我想它应该是个不错的范例。 好了,让我们开始吧。首先我们得找到输入表,它的地址放在PE文件头偏移80处,所以我们用16进制编辑器打开我们的EXE文件,我们先得找到PE文件头的起始点,这很简单,因为它总是以PE,0,0开始,我们可以在偏移100处找到它。在一般的WIN32程序中文件头偏移被放在文件0X3C处,在那我们通常可看到00 01 00 00,由于数据存储时是低位在前,高位在后的,所以翻转过来实际就是00000100,就象前面我们说的。接下来我们就可以在PE文件中找到我们的输入表,100+80=180在偏移180处我们看到0030 0000,翻转一下,它其实应该是00003000,这说明输入表在内存3000处,我们必须把它转换成文件偏移。 一般来说,输入表总是在某个段的起始处,我们可以用PE编辑器来查看虚拟偏移,寻找3000并由此发现原始偏移。很简单的。打开我们看到: -CODE 00001000 00001000 00000200 00000600 -DATA 00001000 00002000 00000200 00000800 .idata 00001000 00003000 00000200 00000A00 .reloc 00001000 00004000 00000200 00000C00 找一下,我们就发现.idata段的虚拟偏移是3000,原始偏移是A00,3000-A00=2600,我们要记住2600,以便以后转换其它的偏移。如果你没找到输入表的虚拟偏移,那么就找一下最接近的段。 来到偏移A00处,我们就看到被称为IMAGE_IMPORT_DESCRIPTORs(IID)的东东,它用5个字段表示每一个被调用DLL的信息,最后以Null结束。 ******************************************************** (IID) IMAGE_IMPORT_DESCRIPTOR的结构包含如下5个字段: OriginalFirstThunk, TimeDateStamp, ForwarderChain, Name, FirstThunk
OriginalFirstThunk 该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是不变的。
TimeDateStamp 一个32位的时间标志,有特殊的用处。
ForwarderChain 输入函数列表的32位索引。
Name DLL文件名(一个以00结束的ASCII字符串)的32位RVA地址。
FirstThunk 该字段是指向一32位以00结束的RVA偏移地址串,此地址串中每个地址描述一个输入函数,它在输入表中的顺序是可变的。 **************************************************************
好了,你有没有理解?让我们看看我们有多少IID,它们从偏移A00处开始 3C30 0000 / 0000 0000 / 0000 0000 / 8C30 0000 / 6430 0000 {OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk} 5C30 0000 / 0000 0000 / 0000 0000 / 9930 0000 / 8430 0000 {OrignalFirstThunk} {TimeDateStamp} {ForwardChain} {Name} {First Thunk} 0000 0000 / 0000 0000 / 0000 0000 / 0000 0000 / 0000 0000
上一篇:压缩与脱壳-手动脱壳 下
下一篇:论 彩票快车白金版v90 的脱壳+爆破(2)
|