2012-04-29 25 views

回答

42

無論您使用的是獲得拆卸嘗試是有益的,通過給呼叫是從它所知道的一些符號偏移量的目標 - 但考慮到偏移量是如此之大,它可能是困惑。

  • E8call具有相對偏移:

    呼叫的實際目標可以如下來計算。

  • 在32位代碼段中,偏移量被指定爲帶符號的32位值。
  • 該值採用little-endian字節順序。
  • 偏移量是從以下指令的地址開始測量的。

例如

<some address>  E8 32 F6 FF FF   call <somewhere> 
<some address>+5  (next instruction) 
  • 偏移是0xFFFFF632
  • 解釋爲有符號的32位值,這是-0x9CE
  • call指令位於<some address>,長度爲5個字節;下一條指令是<some address> + 5
  • 所以呼叫的目標地址是<some address> + 5 - 0x9CE
+0

坦克你這麼多。你的例子是現貨! – Michael

+0

@Matthew 調用指令的長度是否可以超過5個字節? (在x86 archi中,下一個命令是否可以在 + 6)?在什麼情況下? – Rafa

+0

@Rafa,調用相對偏移量指令是5個字節,因爲最大相對偏移量必須適合4個字節。如果目標遠離2 ** 31個字節,'mov reg,imm64;調用reg'被使用。 –

-2

如果你正在用反彙編器分析PE文件,反彙編器可能會給你錯誤的代碼。大多數惡意軟件編寫者使用E8的插入作爲反分解技術。您可以驗證E8以上的代碼是跳轉位置在E8之後的跳轉指令。