【PE文件】导出表

1、数据目录表第一个成员指向导出表 IMAGE_DATA_DIRECTORY[1] -> IMAGE_DIRECTORY_ENTRY_EXPORT。

 1 struct _IMAGE_EXPORT_DIRECTORY 
 2 {
 3     0x00 DWORD Characteristics;
 4     0x04 DWORD TimeDateStamp;
 5     0x08 WORD MajorVersion;
 6     0x0a WORD MinorVersion;
 7     0x0c DWORD Name;                   //DLL名称字符串Rva
 8     0x10 DWORD Base;                   //序号基数
 9     0x14 DWORD NumberOfFunctions;      //导出函数地址个数
10     0x18 DWORD NumberOfNames;          //导出函数名称个数
11     0x1c DWORD AddressOfFunctions;   //地址表数组Rva 元素=4字节
12     0x20 DWORD AddressOfNames;         //名称表数组Rva 元素=4字节
13     0x24 DWORD AddressOfNameOrdinals;  //序号表数组Rva 元素=2字节
14 };

2、示例:获取导出表中MessageBox函数地址

2.1 名称导出

1 "MessageBox" = AddressOfNames[i];          //获取函数名称在名称表中下标
2 nIndex = AddressOfNameOrdinals[i];         //通过名称下标获取序号索引
3 pMessageBox = AddressOfFunctions[nIndex];  //通过索引获取函数地址Rva,当使用ImageBase+Rva = 函数调用地址

2.2 序号导出

1 如果函数以序号导出:
2 获取导出函数地址时直接用序号减去Base得到nIndex  //通过序号-Base获取序号索引
3 函数地址 = AddressOfFunctions[nIndex]      //通过索引获取函数地址Rva,当使用ImageBase+Rva = 函数调用地址

猜你喜欢

转载自www.cnblogs.com/SunsetR/p/11234093.html