簡體   English   中英

在加載之前修改裝配說明

[英]Modifying assembly instructions before loading

我有一個我需要加載的DLL(我編寫並編譯它),我想在將DLL加載到內存之前在匯編代碼的現有指令之間插入指令。 當然,你不能只讀取每個字節並在那之間插入它們,因為指令有時是多個字節。

我正在考慮使用像Udis86這樣的東西並逐個閱讀說明,然后將它們寫入內存,並在它們之間編寫我的其他指令。 這是一個好方法還是有更好的方法?

轉移說明並不是一個好主意。 許多x86指令取決於它們的位置,所以如果你改變它們,你可能會破壞很多東西。
您可以做的是將指令復制到需要修補的地方; 修補程序有一個jmp到一些空閑區域,然后在那個空閑區域放入復制的指令,你的額外代碼然后最后一個jmp回到原始代碼。 不是微不足道的,但可行的。 檢查這個這個可能的實現。
也就是說, 為什么你只需修改源代碼就可以修改二進制文件? 你應該問實際的問題,而不是“如何做X [因為我決定我需要X來解決我的問題]”。

我不知道你在哪里插入代碼。 但是如果它位於函數體的中間而不一定是函數序言或結尾,那么為什么不使用帶有一堆nop的__asm塊來填充你要編寫代碼的區域。 然后只需填寫nop在運行時的代碼。

你有(至少)兩種選擇:

  • 打開DLL文件並使用文件讀/寫操作對其進行修改
  • 加載DLL並在執行之前修改指令

兩者都是可能的,但是后者有必要規避或禁用安全保護:代碼(而不是數據)被加載到內存中,這在大多數(如果不是全部不確定的CE)Windows環境中是不可寫的。

加載代碼后,可以直接支持查找符號地址。 修改文件將需要有關解碼符號信息和解釋文件偏移的高級知識,或者專門為此目的搜索文件中放置的模式。 這可以是DllMain入口點中的邏輯,該入口點被調用以初始化DLL或DLL中已知足夠早執行的任何其他函數。

還有DLL注入技術可以實現相同的目的。


但是,一旦你編寫了要執行的代碼,那么安排DLL使用一些回調函數會傳遞給它,而不是所有這些? 如果不了解更多關於你想要完成的事情,很難說出什么是有用的。


至於如何做,一種簡單的方法是在匯編模塊中編寫指令,組裝它,然后檢查生成的字節。 當然,您應該徹底了解目標匯編語言,以便正確計算或修復分支和相對跳轉偏移以及數據引用。 雖然在運行時反匯編指令是可能的,有時也是可行的,但通過其他方法(如調試器)已經識別指令通常更容易,並讓程序查找字節序列,然后執行所需的任何轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM