印记城

夕阳,枯草,蝶双飞

PE输入表

巫妖【苏】 posted @ 2010年5月08日 23:33 in 未分类 , 1716 阅读

 输入表是个很有意思的东西,直接拆一个EXE分析下

随便找个EXE,打开后,先找到PE头,在找到偏移+80H处,这里就是输入表在内存中的偏移地址,如下图


可以看到偏移地址为0X2028 ,所以我们找到此处
 
 

输入表是一个这样的结构

00h        union

                        characteristics                DWORD        ?

                        originalFirstThunk         DWORD        ?                                                ;存放是一个偏移,指向输入名称表

04h        TimeDateStamp                     DWORD        ?                                                ;一个32位时间标志

08H        Forwarderchain                      DWORD        ?                                               ;指向第一个被转向的API地址

0CH        Name                                       DWORD        ?                                               ;指向DLL名字 

10H        FirstTHUNK                             DWORD        ?                                                ;指向输入地址表

 

对应上面我们可以找到对应的值为

originalFirstThunk                0x00002070                               ;查看此处内存为:AE 20 00 00 D4 20 00 00 9E 20 00 00 C8 20 00 00                       ?..?..?..?..
                                                                                                                                           00402080  BA 20 00 00 8C 20 00 00 00 00 00 00                          ?..?......?D

 

TimeDateStamp                   0x00000000

Forwarderchain                    0x00000000

Name                                     0x000020e4                                ;查看此处内存为:004020E0              75 73 65 72 33 32 2E 64 6C 6C            user32.dll

FirstTHUNK                          0x0000200c                                ;查看此处内存为:C9 59 D2 83 F3 D2 77 71 BE D1 77 CE 08 D2 77

                                                                                                                                          CE 3D D2 77 0C B1 D3 77 00 00 00 00                                                 ....p

originalFirstThunk 其实指向的是一个数组,里面放的指向函数名的指针,而FirstTHUNK存放的是对应这个函数名的实际地址(DLL里面的),关系如下图

 

很简单,不过有些要注意的地方

1.originalFirstThunk 指向的INT数组并不直接指向函数名,而是指向函数名的前2个字节,这前2个字节是函数的HINT,如我们选取它指向的第一个数据:

AE 20 00 00 ,查看此处内容:

 
0000 便是EndDialog的HINT标识,后面是函数名,而我们找到对应的Firstthunk可以找到 :C9 59 D2 83
这个地址也便是EndDialog在DLL里面的实际地址,而这个HINT值有何用?在dll链接处理中,系统先根据hint值
来获得需导入函数的地址,如果失败了,会按函数名来搜索比对获
 
2.程序在硬盘上和在内存中是不一样的,因为程序在硬盘上是按照簇来对称的,而在内存里面是按照页面大小来对称的,而且FirstTHUNK的内容也不一样
,在硬盘上FirstTHUNK   里面的内容其实和originalFirstThunk 一样,而当系统初始化这个程序的时候,通过originalFirstThunk 指向的函数名,在通过getProcAdress来获取DLL里面的地址,在把此地址赋值到FirstTHUNK  里,才有我们看到那些实际地址,如下图(硬盘上的内容)
 

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta
Butterfly Theme | Design: HRS Hersteller of mobile Hundeschule.