首页
社区
课程
招聘
[原创]PE格式学习笔记(IAT)
发表于: 2009-2-16 05:15 7667

[原创]PE格式学习笔记(IAT)

2009-2-16 05:15
7667
by:Lucifer(偶马甲很多....)
 
2009-2-16 凌晨
 
转载请注明版权!
 
PE_Headers
 
typedef struct _IMAGE_NT_HEADERS { 
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
 
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

 
IMAGE_OPTIONAL_HEADER32
 
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
 
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
 
//
// NT additional fields.
//
 
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
 


IMAGE_DATA_DIRECTORY 导入表的位置和尺寸
 
IMAGE_IMPORT_DESCRIPTOR 导入表是由一系列的“IMAGE_IMPORT_DESCRIPTOR ”结构组成的,结构的数量取决于程序要使用的DLL的文件的数量,每个结构对应一个文件,在每个IMAGE_INPORT_DESCRIPTOR结构后面都有一个全为0的“IMAGE_INPORT_DESCRIPTOR”结构,标志这个结构的结束...

 
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress; //相对虚拟地址
DWORD Size; //VirtualAddress指向的数据结构的字节数
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
 
 
_IMAGE_IMPORT_DESCRIPTOR
 
"Name"字段包含一个RVA(相对虚拟地址),指向了DLL文件的名称,"OriginalFirstThunk"指向了一个“_IMAGE_THUNK_DATA32” 结构数组,每个“_IMAGE_THUNK_DATA32”结构都包含了一个导入函数的信息,数组的最后一个成员是一个全为0的IMAGE_THUNK_DATA32结构, 
 
"FirstThunk"字段在文件没加载到内存中时,他给"OriginalFirstThunk"字段一样指向的都是相同的thunk_D...32结构数组,载入后则会被替换为实际的函数入口地址(IAT)

 
 
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics; // 0 for terminating null import descriptor
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
DWORD Name;
DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;[/CODE]
 
 
 
_IMAGE_THUNK_DATA32
 
ForwarderString没有任何意义,无视。
 
可以看到这个结构里只有一个是共用体成员,说明u1仅表示四个DWORD成员之一。
 
在文件中,它要么表示函数的序号(Ordinal),且一般从8开始,要么表示“IMAGE_IMPORT_BY_NAME”结构的指针(AddressOfData)。当被载入到内存中后,它会被替换成输入函数的实际地址(Function),就是说由FirstThunk指向的IMAGE_THUNK_DATA32数组实际上就变成了输入地址表(IAT)。
 
当着这个集合最高位为1的时候,函数是以序号的方式导入的.这时双字的低位就是,就是序列号,反之则函数是以函数名的方式导入的此时就会指向“IMAGE_IMPORT_BY_NAME”结构..

 
typedef struct _IMAGE_THUNK_DATA32 {
union {
PBYTE ForwarderString;
PDWORD Function;
DWORD Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA32;

 
IMAGE_IMPORT_BY_NAME
 
Hint字段表示导入函数的序号
 
Name[1]字段指向了具有该引入函数名字的一个以NULL结尾的ASC字符串....(有点奇怪)

 
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
欢迎指导批评~
2009-2-16 05:16
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
就几个结构
还怎么指导批评啊
:-)
2009-2-16 16:48
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
IAT表的..................

等偶看完 PE结构

总结一下~
2009-2-16 18:31
0
游客
登录 | 注册 方可回帖
返回
//