频道栏目
首页 > 资讯 > 加密解密 > 正文

IAT表和导入表之间的关联

07-10-28        来源:[db:作者]  
收藏   我要投稿

标题:[笨笨之菜鸟应该明白之一]IAT表和导入表之间的关联
作者:笨笨学破解
洋名:EasyStudy
日期:NOP掉
工具:什么都有!:)
注意:截图就能省就省了吧!太累人撒!就生硬的文字吧!


一、前言

            大家好!我又来了,一直想写个XXX之二的。但是,现在觉得写不大好!明年吧!呵呵~~
  最近,想发点东西给大家,但是苦于没什么好发的,因为本人菜的可以,所以,发出来又怕怕大家笑话!思量期间还是不发为妙,前几天,我的大大(也就是教我学这行的老大之一)训话了:“做事别招摇!低调!”。不过,从来我觉得他说的到是没什么错的,最近,尤其是前段时间,写了点感慨!被网上的朋友们骂的骂赞的赞。确实,这影响大了到不好,真没想到那么大的反应!前几天研究PE结构也随心发了点心得,给大家分享,真没想到能被精华对待!所以,一直以来都想再发点经典的,支持一下看雪,可是就是找不到蓝本!今天,刚研究到的发出来和大家分享一下!喜欢的收藏,顺便给点意见!不喜欢的就当乐和看看吧!真不知道能不能精华:)

一、导入表:
  哎!别说了,我知道现在很多文章都说过这个玩意了。就花几分钟看看我写的,或许,还真和别人说的不一样了。先不说别的拿工具看一下什么样的是导入表,我们主要用PNHookApi1.00.05新版本的已经支持很多PE类的信息了,没有的,可以去下载区下,或者拿LoadPE就好了,随便拿VC做了个WIN32的程序来研究。如图:
01.jpg

          我们看到上面是导入模块,下面是导入函数信息,实际猛一看,大家都清楚,可是我想问大家那些东西都是怎么来的吗?没几个人知道了吧!我就来解释一下。我先整体了解导入表,能证明导入表特征的那就算是它的结构了。
//-------------------------------------------------------------------------------------------------
在winnt.h中我找到了它的结构:

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            // 0 for terminating null import descriptor导入描述符始终为NULL
        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)这里后面专门解释
    };
    DWORD   TimeDateStamp;                  // 0 if not bound, 时间日期戳
                                            // -1 if bound, and real date ime stamp
                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                            // O.W. date/time stamp of DLL bound to (Old BIND)

    DWORD   ForwarderChain;                 // -1 if no forwarders多为0
    DWORD   Name;                           //后面说明
    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)后面说明
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;

从结构来看我们声明的类型为:
_IMAGE_IMPORT_DESCRIPTOR  
IMAGE_IMPORT_DESCRIPTOR
*PIMAGE_IMPORT_DESCRIPTOR  //这个和前面不一样它表示的是这个结构的指针,前面两个都是结构类型
//------------------------------------------------------------------------------------------------

我们顺着往下看,第一个当然是:OriginalFirstThunk,我特意没把英文翻译过来是希望大家先有个概念!导入表和IAT表是有很大关系的。

     先把前面的内容PUSH保存,等会用着了再POP吧!我先研究一下导入表的16进制
     先最简单的,我们拿WINHEX来打开前面做的程序看吧!我们先可以让LoadPE或PNHookApi查看一下导入表的地址,我这里是0002A000,长度是0000003C,我们看到的这个地址是RVA,需要转换后才能到真正的导入表虚拟地址或物理地址,我们如图(不加图说不清楚了:()
02.jpg

      图中表示了我们对应的地址为00028000,我们要找的正好是整数,也是区段开头不用换算的,如果不是的话那就可怜点需要换算了。至于换算我以前的贴里已经说了一下,并放出了转换函数大家也不用发愁,拿去用就是了:)。00028000正好就是我们要找的物理偏移地址,拿WINHEX打开看一下,如下:

//--------------------------------------------------------------------------------------------------
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00028000   3C A0 02 00 00 00 00 00  00 00 00 00 B4 A3 02 00   <?.........矗..
00028010   F0 A1 02 00 5C A1 02 00  00 00 00 00 00 00 00 00   稹..?.........
00028020   26 A5 02 00 10 A3 02 00  00 00 00 00 00 00 00 00   &?..?.........
00028030   00 00 00 00 00 00 00 00  00 00 00 00 A4 A3 02 00   ............ぃ..

把我们PUSH进去的知识,POP出来,看看!
我们以DWORD方式整理一下可以看到对应:
3CA00200  //OriginalFirstThunk;
00000000  //TimeDateStamp
00000000  //ForwarderChain
B4A30200  //Name
F0A10200  //FirstThunk
//--------------------------------------------------------------------------------------------------


      每5个DWORD就代表一个结构,我们先来看第一个地址,0002A03C这个也是个相对虚拟地址,所以嘛!也要转换的,实际一个最简单的办法口算就可以出来了,有朋友就说了,口算……,十六进制呀!方法一学就会!我们不是知道0002A000=00028000吗?我们拿0002A03C-002A000=000003C算出偏移地址,再用00028000+0000003C=0002803C就是物理偏移地址,简单吧!:)是个智商没问题的都会算了吧!我们再看看0002803C是什么样子!

//-----------------------------------------------------------------------------------------------------
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00028030   00 00 00 00 00 00 00 00  00 00 00 00 A4 A3 02 00   ............ぃ..
00028040   8A A8 02 00 7A A8 02 00  68 A8 02 00 56 A8 02 00   姩..z?.h?.V?.
00028050   44 A8 02 00 34 A8 02 00  24 A8 02 00 0E A8 02 00   D?.4?.$?..?.
00028060   00 A8 02 00 F0 A7 02 00  E4 A7 02 00 D8 A7 02 00   .?.皈..洄..丕..
00028070   CE A7 02 00 C2 A7 02 00  B2 A7 02 00 A2 A7 02 00   围..搂..钵..ⅶ..

//------------------------------------------------------------------------------------------------------

     可以很清楚的看到0002803C处为0002A3A4,再用上面的方法算出物理偏移地址为000283A4,WINHEX显示如下:

//-----------------------------------------------------------------------------------------------

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D

相关TAG标签
上一篇:找出IIS中隐藏的网站
下一篇:加密解密:小议ring 3虚拟机调试器
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站