我想在我的 .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;
}
}
除其他外,這會產生以下相關輸出:
符號名稱:?myFunction@@YAXXZ
符號長度:44
LocIsStatic
RVA:0x119e0
VA:72160
出于某種原因,VA 和 RVA 值始終相同。
然后我在 IDA 反匯編程式上加載了我的 .exe 檔案,我在地址0x4119e0找到了 44 個位元組的序列,以及 4 個值為“CC CC CC CC”的“空白”位元組。
因此,我想做的是使用 RVA (0x119e0) 從磁盤上的檔案中找到偏移量。
在這個問題上(從 RVA 獲取檔案中的偏移量),使用以下公式:
off = section_off (rva - section_rva)。
但是,就我而言,我對在此公式中使用哪些值感到困惑。0x119e0 對應 72,160,而我的整個 .exe 檔案只有 40,448 位元組長。
uj5u.com熱心網友回復:
您提供的公式不是您鏈接的問題的答案中描述的。然而,這個問題的答案是正確的;您需要找到哪個部分包含感興趣的 RVA,然后將該 RVA 與對應于該部分的開始(即第一個位元組)的 RVA 之間的差異添加到對應于該部分的開頭的檔案偏移量。
換一種說法
off = section_off (rva - section_rva).
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428316.html
上一篇:如何從事件函式中回傳一個變數?
