通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络编程 >> 文章正文
IAT表和导入表之间的关联
责任编辑:水土不服   更新日期:2007-10-28
 

标题:[笨笨之菜鸟应该明白之一]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\time 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  E  F

000283A0   00 00 00 00 C2 01 4C 6F  61 64 4C 69 62 72 61 72   ....?LoadLibrar
000283B0   79 41 00 00 4B 45 52 4E  45 4C 33 32 2E 64 6C 6C   yA..KERNEL32.dll
//------------------------------------------------------------------------------------------------

到这里算是追踪完成了一大半了,既然到了,我必须说明一个格式:

//--------------------------------------------------------------------------
WORD   String 
HINT号 函数名
……
……
模块名
HINT号 函数名
……
……
模块名
……
//---------------------------------------------------------------------------

     也就是说2个字节代表HINT号,后面紧跟的就是函数名,函数名以0x00结尾。在所有函数都罗列完毕后,紧跟的就是这些函数所在的模块名。然后又是函数名,又是模块名……应该够清楚了吧!

二、联系实现

     前面说了怎么获得导入表的方法,但是程序怎么实现了?这个是大家最熟悉的了。:)上面是看了OriginalFirstThunk,我们再来看Name,计算为0002A3B4=000283B4,从上面可以看到它就是函数的模块名KERNEL32.DLL地址。因此我们可以用这样的C语言代码来完成抓导入模块名:

//--------------------------------------------------------------------------------------------
for(;_importDesc->Name!=NULL;i++)
{
  char *szName=(PSTR)ImageRvaToVa(_ntHeader, _dosHeader, (DWORD)_importDesc->Name, 0);
  name[i]=szName;
  _importDesc++;
}

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

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题