gpt4 book ai didi

c++ - Windows DLL 中的字符串表在哪里?

转载 作者:太空狗 更新时间:2023-10-29 21:23:05 25 4
gpt4 key购买 nike

我已经编写了一个例程来从使用 LoadLibrary 加载的 DLL 中转储符号和部分,但不确定如何解码部分名称长于 IMAGE_SIZEOF_SHORT_NAME 的 MinGW DLL >

例如,如果我将它们打印为字符串,则 MinGW DLL 将输出以下部分:

[".text", ".data", ".rdata", ".pdata", ".xdata", ".bss", ".edata", ".idata",
".CRT", ".tls", ".reloc", "/4", "/19", "/31", "/45", "/57", "/70", "/81",
"/92"]

objdump.exe 获取的其他部分:

.debug_aranges
.debug_info
.debug_abbrev
.debug_line
.debug_frame
.debug_str
.debug_loc
.debug_ranges

它们都比 IMAGE_SIZEOF_SHORT_NAME 长。 MSDN解释说:

对于较长的名称,此成员包含一个正斜杠 (/),后跟十进制数的 ASCII 表示形式,该十进制数是字符串表中的偏移量。

所以我有以下代码:

  Char buffer[IMAGE_SIZEOF_SHORT_NAME + 1];
std::strncpy(buffer, reinterpret_cast<const Char * const>(section_header_ptr[i].Name), IMAGE_SIZEOF_SHORT_NAME);
buffer[IMAGE_SIZEOF_SHORT_NAME] = '\0';
const Char * name = buffer;
if (name[0] == '/') {
const Long rva = std::strtol(name + 1, NULL, 10);
if ((LONG_MAX == rva) || (LONG_MIN == rva) || ((0 == rva) && (name[0] != '0'))) {
static const Char * const failure = "failed to convert offset";
name = failure;
}
// -- How do I get the string table here? and use the offset? --
}

阅读 COFF 规范我看到字符串表在符号条目之后,所以它应该是

HMODULE handle = LoadLibrary("some_mingw_library.dll");
PIMAGE_DOS_HEADER idh = (PIMAGE_DOS_HEADER)(handle);
PIMAGE_NT_HEADERS inh = (PIMAGE_NT_HEADERS)(((const uint8_t*)(idh)) + idh->e_lfanew)
PIMAGE_FILE_HEADER ifh = &inh->FileHeader;
PIMAGE_SYMBOL is = (PIMAGE_SYMBOL)(((const uint8_t*)(idh)) + ifh->PointerToSymbolTable)
const char * const string_table = &is[ifh->NumberOfSymbols];

但我得到的东西绝对不是字符串表。我可以在十六进制编辑器中看到字符串表。可移植可执行文件中的字符串表在哪里?

最佳答案

当一个可执行文件被映射到内存中时,它不会作为一个连续的 block 加载。各部分分散在各部分标题中。

符号根本不一定映射到内存中。

PointerToSymbolTable 是(我认为)文件偏移量,而不是内存偏移量(而且,如上所述,它们不是一回事)。

EXE 和 DLL 根本不应该有 COFF 符号,尽管这个文件显然有。

大多数此类问题的答案都可以在 PEDUMP 中找到.

关于c++ - Windows DLL 中的字符串表在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com