【发布时间】:2013-12-28 17:02:03
【问题描述】:
我正在分析 32 位和 64 位 DLL。我想知道导出函数的地址是什么。我已经处理了 32 位 DLL,但相同的代码不适用于 64 位模块。
DWORD address = (*module)->getImageBaseAddress();
DWORD headerAddress = address + ((PIMAGE_DOS_HEADER)address)->e_lfanew;
PIMAGE_NT_HEADERS header = (PIMAGE_NT_HEADERS)headerAddress;
PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)(address + header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
PVOID names = (BYTE *)address + exports->AddressOfNames;
PVOID moduleFunctions = (BYTE *)address + exports->AddressOfFunctions;
std::cout << "Characteristics: " << exports->Characteristics << endl;
std::cout << "TimeDateStamp: " << exports->TimeDateStamp << endl;
std::cout << "Major version: " << exports->MajorVersion << endl;
std::cout << "Minor version: " << exports->MinorVersion << endl;
std::cout << "Name: " << exports->Name << endl;
std::cout << "Base: " << exports->Base << endl;
std::cout << "Number of fun: " << exports->NumberOfFunctions << endl;
std::cout << "Number of names: " << exports->NumberOfNames << endl;
for (int i = 0; i < exports->NumberOfFunctions; i++) {
std::cout << std::string((char*)((BYTE *)address + ((DWORD *)names)[i])) << " @ " << ((DWORD *)moduleFunctions)[i] << endl;
}
第一个输出行看起来不错(TimeDateStamp 具有正确的值,函数名称已正确解析等)。不幸的是,当我在 DLL 文件分析后将我的函数的图像基偏移量与 IDA 给出的偏移量进行比较时,结果会有所不同。例如。对于第一个模块,我得到的偏移量等于11d0b,由于 IDA,没有有效指令从该地址开始(imageBase + 0x11d0b)。
我在 64 位 DLL 中获取函数地址的方法是否正确?为什么我会得到不同的结果?为什么 32 位模块一切正常?
【问题讨论】:
-
64 位代码中的指针将不是 32 位。我的意思是 DWORD 不应该工作。
-
IMAGE_NT_HEADERS 不再准确。今天还有 IMAGE_NT_HEADERS64。使用 IMAGE_FILE_HEADER.Machine 知道你得到了哪一个。等等。
-
你能告诉我带有 IMAGE_NT_HEADERS64 的代码应该是什么样子吗?如果我只是用 64 位结构替换 32 位结构,我不会得到想要的结果。
标签: c++ windows dll 32bit-64bit reverse-engineering