从 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).