目的:使用一个具体例子查询输入表的真实模样;notepad.exe加载到内存时,查询输入表的INT,用这个INT中的函数名对应的真实地址填充notepad.exe内存中IAT的过程;PE文件装在完后,通过IAT就可以找到函数在内存中真正的地址
文章目录
1.WinDbg查看输入表
前提:notepad的加载基址是
00f20000
,NT头的真实加载地址是00f20100,OptionalHeader的偏移(0x18),offset of DataDirectory偏移是(0x60)知识:输入表是DataDirectory数组中第二个元素
1.输入表起始地址
下面找到起始地址是00f20000 + 0x2647c
,基本上每次加载基址都会有偏差;以实际为准
#1.option header -> DataDirectory
0:000> dt ntdll!_IMAGE_OPTIONAL_HEADER -v -ny DataDirectory 00f20100+18
struct _IMAGE_OPTIONAL_HEADER, 31 elements, 0xe0 bytes
+0x060 DataDirectory : [16] struct _IMAGE_DATA_DIRECTORY, 2 elements, 0x8 bytes
#2.输入表相关的_IMAGE_DATA_DIRECTORY,下面可以看到0x2647c开始,长度为0x21c的一段连续内存都是给导入表的
0:000> dt ntdll!_IMAGE_DATA_DIRECTORY 00f20100+18+60+8
+0x000 VirtualAddress : 0x2647c
+0x004 Size : 0x21c
#3.00f4647c是DataDirectory[1],即输入表的虚拟地址(VA)
0:000> ? 00f20000 + 0x2647c
Evaluate expression: 16016508 = 00f4647c
2.IMAGE_IMPORT_DESCRIPTOR
解析前要了解输入表在内存中的大致结构、使用的结构体和信息
- 1.输入表常用的结构体
0:000> dt combase!_IMAGE_I*
combase!_IMAGE_IMPORT_BY_NAME
combase!_IMAGE_INDIR_CONTROL_TRANSFER_DYNAMIC_RELOCATION
combase!_IMAGE_IMPORT_BY_NAME
combase!_IMAGE_IMPORT_DESCRIPTOR
combase!_IMAGE_IMPORT_DESCRIPTOR
combase!_IMAGE_IMPORT_CONTROL_TRANSFER_DYNAMIC_RELOCATION
- 2.
IID
是_IMAGE_IMPORT_DESCRIPTOR
的简称,内存中排列如下
#输入表占用的一段连续内存
#是一个个IMAGE_IMPORT_DESCRIPTOR组成的,结尾是一个参数都为空的IMAGE_IMPORT_DESCRIPTOR结构
#类似结构:
IMAGE_IMPORT_DESCRIPTOR(IID) -> "KERNEL32.dll"相关信息
IMAGE_IMPORT_DESCRIPTOR(IID) -> "GDI32.dll"相关信息
...
IMAGE_IMPORT_DESCRIPTOR(IID) -> "COMCTL32.dll"相关信息
IMAGE_IMPORT_DESCRIPTOR(IID) -> 全NULL参数的IMAGE_IMPORT_DESCRIPTOR结构,标识结束
CFF查看类似下面的形式(不是notepad.exe的截图,但是不影响理解)
- 3.dump的内存信息
内存中IMAGE_IMPORT_DESCRIPTOR
的dump信息如下,可以查询有多少个dll?每个dll的IMAGE_IMPORT_DESCRIPTOR的结构具体是什么