输入表是个很有意思的东西,直接拆一个EXE分析下
随便找个EXE,打开后,先找到PE头,在找到偏移+80H处,这里就是输入表在内存中的偏移地址,如下图
输入表是一个这样的结构
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 ,查看此处内容: