从 RVA 中查找文件的函数偏移量
Finding function offset from file from RVA
我想在我的 .exe 中找到一个函数,然后将其 memcpy 到其他地方。
我已经使用 IDIA SDK 为我的 .exe 解析了 .pdb 文件,其中包含一个名为“myFunction”的简单函数,它只是执行一个程序集“ret”,仅用于演示目的。
if (pTable->QueryInterface(__uuidof(IDiaEnumSymbols), (void**) &pUnknown) == S_OK) {
printf("Supports Symbol module\n");
CComPtr<IDiaSymbol> pSymbol;
for (LONG i = 0; i < blongTableCount; i++)
{
if (pUnknown->Item(i, &pSymbol) != S_OK) {
fprintf(stderr, "Error: pUnknown->Item");
}
BOOL isFunction;
if (pSymbol->get_function(&isFunction) == S_OK) {
if (isFunction == TRUE) {
BSTR symName;
if (pSymbol->get_name(&symName) == S_OK) {
printf("Symbol name: %S\n", symName);
ULONGLONG length;
if (pSymbol->get_length(&length) == S_OK) {
printf("Length of symbol: %I64u\n", length);
}
DWORD ret;
if (pSymbol->get_locationType(&ret) == S_OK) {
switch (ret) {
case LocIsStatic:
printf("LocIsStatic\n");
break;
case LocIsThisRel:
printf("LocIsThisRel\n");
break;
}
}
if (pSymbol->get_relativeVirtualAddress(&ret) == S_OK) {
printf("RVA: 0x%0.5x\n", ret);
}
ULONGLONG va;
if (pSymbol->get_virtualAddress(&va) == S_OK) {
printf("VA: %I64u\n", va);
}
}
}
}
pSymbol = NULL;
}
}
除其他外,这会产生以下相关输出:
Symbol name: ?myFunction@@YAXXZ
Length of Symbol: 44
LocIsStatic
RVA: 0x119e0
VA: 72160
出于某种原因,VA 和 RVA 值始终相同。
然后我在 IDA 反汇编器上加载了我的 .exe 文件,我在地址 0x4119e0 找到了 44 个字节的序列,以及 4 个“white-space " 值为“CC CC CC CC”的字节。
因此,我想做的是使用 RVA (0x119e0) 从我的文件在磁盘上找到偏移量。
本题(getting offset in file from RVA),用到的公式如下:
off = section_off + (rva - section_rva).
但是,就我而言,我对在此公式中使用什么值感到困惑。 0x119e0对应72160,而我的整个.exe文件只有40448字节长
您提供的公式不是您所链接问题的答案中描述的内容。然而,这个问题的答案是正确的;您需要找到哪个部分包含感兴趣的 RVA,然后将该 RVA 与对应于该部分的开始(即第一个字节)的 RVA 之间的差异添加到对应于该部分开始的文件偏移量。
也就是说
off = section_off + (rva - section_rva).
我想在我的 .exe 中找到一个函数,然后将其 memcpy 到其他地方。
我已经使用 IDIA SDK 为我的 .exe 解析了 .pdb 文件,其中包含一个名为“myFunction”的简单函数,它只是执行一个程序集“ret”,仅用于演示目的。
if (pTable->QueryInterface(__uuidof(IDiaEnumSymbols), (void**) &pUnknown) == S_OK) {
printf("Supports Symbol module\n");
CComPtr<IDiaSymbol> pSymbol;
for (LONG i = 0; i < blongTableCount; i++)
{
if (pUnknown->Item(i, &pSymbol) != S_OK) {
fprintf(stderr, "Error: pUnknown->Item");
}
BOOL isFunction;
if (pSymbol->get_function(&isFunction) == S_OK) {
if (isFunction == TRUE) {
BSTR symName;
if (pSymbol->get_name(&symName) == S_OK) {
printf("Symbol name: %S\n", symName);
ULONGLONG length;
if (pSymbol->get_length(&length) == S_OK) {
printf("Length of symbol: %I64u\n", length);
}
DWORD ret;
if (pSymbol->get_locationType(&ret) == S_OK) {
switch (ret) {
case LocIsStatic:
printf("LocIsStatic\n");
break;
case LocIsThisRel:
printf("LocIsThisRel\n");
break;
}
}
if (pSymbol->get_relativeVirtualAddress(&ret) == S_OK) {
printf("RVA: 0x%0.5x\n", ret);
}
ULONGLONG va;
if (pSymbol->get_virtualAddress(&va) == S_OK) {
printf("VA: %I64u\n", va);
}
}
}
}
pSymbol = NULL;
}
}
除其他外,这会产生以下相关输出:
Symbol name: ?myFunction@@YAXXZ
Length of Symbol: 44
LocIsStatic
RVA: 0x119e0
VA: 72160
出于某种原因,VA 和 RVA 值始终相同。
然后我在 IDA 反汇编器上加载了我的 .exe 文件,我在地址 0x4119e0 找到了 44 个字节的序列,以及 4 个“white-space " 值为“CC CC CC CC”的字节。
因此,我想做的是使用 RVA (0x119e0) 从我的文件在磁盘上找到偏移量。
本题(getting offset in file from RVA),用到的公式如下:
off = section_off + (rva - section_rva).
但是,就我而言,我对在此公式中使用什么值感到困惑。 0x119e0对应72160,而我的整个.exe文件只有40448字节长
您提供的公式不是您所链接问题的答案中描述的内容。然而,这个问题的答案是正确的;您需要找到哪个部分包含感兴趣的 RVA,然后将该 RVA 与对应于该部分的开始(即第一个字节)的 RVA 之间的差异添加到对应于该部分开始的文件偏移量。
也就是说
off = section_off + (rva - section_rva).