[英]Modifying assembly instructions before loading
我有一個我需要加載的DLL(我編寫並編譯它),我想在將DLL加載到內存之前在匯編代碼的現有指令之間插入指令。 當然,你不能只讀取每個字節並在那之間插入它們,因為指令有時是多個字節。
我正在考慮使用像Udis86這樣的東西並逐個閱讀說明,然后將它們寫入內存,並在它們之間編寫我的其他指令。 這是一個好方法還是有更好的方法?
我不知道你在哪里插入代碼。 但是如果它位於函數體的中間而不一定是函數序言或結尾,那么為什么不使用帶有一堆nop的__asm塊來填充你要編寫代碼的區域。 然后只需填寫nop在運行時的代碼。
你有(至少)兩種選擇:
兩者都是可能的,但是后者有必要規避或禁用安全保護:代碼(而不是數據)被加載到內存中,這在大多數(如果不是全部不確定的CE)Windows環境中是不可寫的。
加載代碼后,可以直接支持查找符號地址。 修改文件將需要有關解碼符號信息和解釋文件偏移的高級知識,或者專門為此目的搜索文件中放置的模式。 這可以是DllMain入口點中的邏輯,該入口點被調用以初始化DLL或DLL中已知足夠早執行的任何其他函數。
還有DLL注入技術可以實現相同的目的。
但是,一旦你編寫了要執行的代碼,那么安排DLL使用一些回調函數會傳遞給它,而不是所有這些? 如果不了解更多關於你想要完成的事情,很難說出什么是有用的。
至於如何做,一種簡單的方法是在匯編模塊中編寫指令,組裝它,然后檢查生成的字節。 當然,您應該徹底了解目標匯編語言,以便正確計算或修復分支和相對跳轉偏移以及數據引用。 雖然在運行時反匯編指令是可能的,有時也是可行的,但通過其他方法(如調試器)已經識別指令通常更容易,並讓程序查找字節序列,然后執行所需的任何轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.