2011-04-19 91 views
0

我想反向工程拆解的二進制文件。我不明白它使一個呼叫時它在做什麼,例如:當您在程序集中推送內存地址時會發生什麼?

推$ 0x804a254

是什麼使得它更加混亂的是,該地址是不是和指令的地址也不是在符號表。它在做什麼?

+2

它將某種32位數字推入堆棧。沒有某種背景,完全不可能再說什麼。 – 2011-04-19 16:49:30

+0

是的,發佈一個反彙編,而不是一條指令。 – 2011-04-19 17:00:41

回答

2

這是以下三種情況之一:它是一個常量(無論是散列,數字,位標記還是類型地址),變量或緩衝區的地址(包括字符串文字)或者是一個錯誤分析的操作數(由於加密/廢棄)。它的真正意義與它的使用有關(不管是調用參數還是設置mem/reg的間接方法)。

1

您看到的值不在任何表格或指令中,因爲它是局部變量。 (局部變量不保持與符號表關聯的名字,因爲他們只是「活着」,而你是在一個特定的方法)地址相當於像

void somefunc() 
{ 
    int t; //t may have address 0x804a254 since this is a local variable. 
} 

爲了正確地釋放內存的局部變量在系統堆棧上分配而不是在內存中的其他位置。它們在函數創建時被推入,當函數返回時彈出,這就是你所看到的。

+0

而不是在x86上使用esp(或ebp)寄存器引用本地函數變量嗎?我認爲0x804a254可能是一個全局變量地址或稍後彈出的常量...... – 2011-04-19 16:57:56

+0

局部變量是相對於堆棧指針(例如ebp或esp)而不是絕對地址尋址的。所以我懷疑這是發生了什麼。 – 2011-04-19 17:00:11

+0

那麼它是一個全局變量,因爲它們不只是推動0x4或%eax或其他東西?如果是這樣,如果它不再被引用,那麼將其設爲全局是沒有意義的。 另外,什麼 jmp * 0x804b0fc 意思是什麼時候該地址也沒有在反彙編或符號表中的其他地方引用? – Gabe 2011-04-19 17:00:27

1

該指令只是將32位常量(0x804a254)推入堆棧。

僅靠這個指令是不足以讓我們知道它是如何被使用的。你能否提供更多的代碼解構?特別是我想知道這個值在哪裏出現,以及這個值如何被使用。

在開始任何逆向工程之前,我會推薦閱讀本書(Reverse Engineering secrets),然後再閱讀X86指令集手冊(IntelAMD)。我假設你是x86 CPU的反向工程。

相關問題