在分析 Ghidra 中的匯編串列時,我偶然發現了這條指令:
CALL dword ptr [EBX*0x4 0x402ac0]=>DAT_00402abc
我假設程式正在呼叫一個地址在里面的函式DAT_00402abc,我最初認為它是一個雙字變數。事實上,當試圖在其中的位置創建一個函式DAT_00402abc時,Ghidra 不會讓我這樣做。
反編譯器向我展示了這行代碼來翻譯該指令:
(*(code *)(&int2)[iVar2])();
所以我想知道,這是什么意思,程式應該用這個呼叫做什么?Ghidra 有沒有可能完全搞砸?如果是這樣,我應該如何解釋該指令?
uj5u.com熱心網友回復:
我對 Ghidra 一點也不熟悉,但我可以告訴你如何解釋機器指令......
CALL dword ptr [EBX*0x4 0x402ac0]
有一個函式地址表0x402ac0;正在呼叫該表中的第 EBX 項。我不知道是什么DAT_00402abc意思,但是如果您在地址處檢查雙字大小的塊中的記憶體,0x0402ac0您應該找到合理的函式地址。[編輯:0x0040_2abc = 0x0040_2ac0 - 4。我懷疑這意味著當控制達到這一點時,Ghidra 認為 EBX 的值為 -1。可能是錯誤的,或者程式有錯誤。當控制達到這一點時,人們會期望 EBX 具有非負值。]
與此指令對應的自然 C 源代碼將類似于
extern void do_thing_zero(void);
extern void do_thing_one(void);
extern void do_thing_two(void);
extern void do_thing_three(void);
typedef void (*do_thing_ptr)(void);
const do_thing_ptr do_thing_table[4] = {
do_thing_zero, do_thing_one, do_thing_two, do_thing_three
};
// ...
void do_thing_n(unsigned int n)
{
if (n >= 4) abort();
do_thing_table[n]();
}
如果表中的函式接受引數或回傳值,您將在參考的 CALL 指令前后看到引數處理代碼,但 CALL 指令本身不會改變。
如果函式不都采用相同的引數集,你會看到不同的東西,而且會復雜得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/331924.html
