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 = 函数调用地址