2013-02-03 82 views
0

如果在給定地址的代碼執行時沒有使其在代碼中可見,我想引發異常。當直接執行地址而未直接修改地址時引發異常

我知道使用硬件斷點是可能的,但如果有人要附加一個使用它們的調試器,那麼這些可能會被刪除,而我將無法檢測它們是否丟失並將其替換。還有什麼其他選擇?

速度是一個問題,即:我不能做PAGE_GUARD單步;用戶會滯後於死亡。

我在Windows上並使用VC 2012 w/C++。

回答

1

如果異常處理成本過高,唯一的其他解決方案是模擬CPU的代碼。

有幾個注意事項,但:

  • 有很多的指令和解碼並正確模仿他們是一個很大的任務。在仿真和執行之間切換會花費額外的CPU週期。
  • 您將無法模擬所有內容,因此必須在「操場/沙箱」中執行一些指令(例如FPU/MMX/SSE指令)。
  • 要正確處理系統調用,您實際上必須準備好CPU狀態並執行它們,然後返回到模擬器。您可能需要在此處生成代碼。
  • 如果模擬代碼導致CPU異常並使用SEH來處理它們(或者通過SEH引發並捕獲C++異常作爲CPU異常,那麼您很可能會破壞代碼,因爲堆棧解除對外部不起作用(仿真器)堆棧。
  • 事情會因多線程代碼而變得棘手,特別是在多處理器系統上。您必須捕捉線程的創建/銷燬並創建/銷燬模擬器的各個實例,並處理線程之間的內存共享並處理模擬/執行指令的原子性。
  • 無論我忘了想什麼。
  • 事情可能仍然工作得太慢或根本無法工作。

另一個,也許更實用,辦法是在關注該地址修補的可執行文件,執行轉移到您的代碼(與jmp指令),做任何你需要有再回去。您必須注意所有上下文的保存/恢復,並且模仿由其上寫下的jmp指令所損壞的指令。這裏也有一些注意事項。那些被覆蓋的指令可能會跳轉到代碼中的其他地方。你必須選擇地址,以免跳到你的jmp的中間,否則你將不得不以某種方式處理它們(還不確定)。

+0

異常處理不一定太昂貴;只有在方法觸發異常的次數過多而收益不大的情況下;即:如果我用PAGE_GUARD保護整個頁面,會發生什麼情況。 – kvanberendonck

+0

仿真現在太大了,我寧可不要。 Codecaving可以工作,但直接的代碼更改由採用代碼段散列的保護引擎檢測到。 – kvanberendonck

+0

你應該詳細說明你的問題。你沒有談及保護方面或者它的工作方式。最後,爲什麼你要在受保護的二進制文件上執行此操作? –