2010-02-20 218 views
0

假設有一個包含sprintf()的錯誤程序,我想將其更改爲snprintf,所以它沒有緩衝區溢出。我如何在IDA中執行此操作?使用IDA修補EXE

+0

這是一個相當大的改變,因爲你需要改變整個調用堆棧...你試圖與開發者交談嗎? – kennytm 2010-02-20 06:39:22

+0

我的項目並未停止,我想修復這個錯誤以保護我自己 – 2010-02-22 04:12:30

回答

3

你真的不想使用來自IDA pro的信息進行這種改變。

儘管IDA的反彙編質量相對較高,但其質量不足以支持可執行重寫。將調用轉換爲sprintf以調用snprintf需要將新參數推入堆棧。這需要引入一條新的指令,這會影響可執行映像中所有跟隨它的EA的EA。更新這些有效地址需要非常高質量的拆卸。特別是,你需要能夠:

  1. 確定可執行哪些地址數據,以及哪些代碼
  2. 確定哪些指令操作數的符號(地址引用)和指令操作數是數字。

Ida不能(可靠地)給你這些信息。另外,如果可執行文件與crt靜態鏈接,它可能不包含snpritnf,這將使手動執行重寫變得非常困難。

有幾種潛在的解決方法。如果在進行調用的函數中(或之後)有足夠的填充,則可能只能重寫單個函數。或者,如果您有權訪問對象文件,並且這些對象文件是使用/ GY開關編譯的(假設您使用的是Visual Studio),那麼您可能能夠編輯該對象文件。但是,編輯目標文件可能仍然需要大量修復。

但是,如果您有權訪問目標文件,那麼您可能也有權訪問源代碼。改變來源可能是你最好的選擇。

+0

不需要在任何接近該功能的地方提供可用空間,只要您可以在某處找到(或製作)一些空間在適當的章節中,您可以用JMP將原始函數中的某些內容替換爲您的新指令序列。但是,說實話,OllyDbg如何做到這一點更容易。 – SamB 2010-07-15 19:30:04

+0

你是對的..你不一定需要在功能附近有空間。但我不會主張頻繁做,因爲這可能會對業績產生不利影響(地區差)。對於一個打電話給sprintf的人來說,這沒關係。但是,如果你有很多打電話給sprintf的話,那麼你不想在整個地方引入一堆瘋狂的跳躍。 – 2010-07-16 02:23:51