首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

PE 檔案注入技術:在現有程式植入 MessageBox 程式碼

     編輯:組合語言

前言

本程式示範如何解析 PE(Portable Executable)檔案結構,若目標程式已匯入 USER32.dll 的 MessageBoxA,則在其程式碼區(.text)尾端注入一段顯示訊息框的機器碼,並修改入口點(Entry Point)導向新程式碼。此技術常用於軟體保護、熱修補或惡意程式碼分析研究。

核心流程

  1. 取得檔案路徑:支援命令列參數或開啟檔案對話框(GetOpenFileName)。
  2. 記憶體映射檔案:CreateFileMapping + MapViewOfFile 將整個 PE 映射至記憶體,直接操作映射視圖即修改檔案內容。
  3. 驗證 PE 格式:檢查 DOS 標誌(MZ)與 PE 標誌(PE\0\0)。
  4. 掃描匯入表:遍歷 .rdata 區段的 IMAGE_IMPORT_DESCRIPTOR,尋找 USER32.dll 及 MessageBoxA 的 FirstThunk 位址。
  5. 定位程式碼區:解析 Section Table,找出 .text 與 .rdata 的原始偏移與虛擬位址。
  6. 注入程式碼:
    • 計算原 .text 區末尾可用空間(SizeOfRawData - VirtualSize)。
    • 將注入程式碼(FirstRun)複製至該空間。
    • 修改 AddressOfEntryPoint 指向新程式碼起始位置。
    • 更新 .text 區的 VirtualSize。
  7. 修正注入程式碼中的位址:注入程式碼需動態填入 MessageBoxA 真實位址(IAT 項)與返回原入口點的相對位移。

關鍵資料結構與函數

  • CheckPEValid:驗證 PE 標誌。
  • HaveMessageBox / CheckFunction:掃描匯入表尋找 MessageBoxA。
  • IniData:定位 .text、.rdata 區段表項。
  • AddCode / ModifyCode:執行實際注入與位址修正。
  • FirstRun:注入的機器碼模板,包含 push MB_ICONINFORMATION、call 取得字串位址、call MessageBoxA、jmp 原入口點。

編譯注意事項

程式需修改自身程式碼區(寫入 .text),連結時須加入 /section:.text,rw 參數賦予區段可寫屬性(參考「系列11:把資料寫到程式碼段」)。

限制與風險

  • 僅適用於標準編譯器產生的 PE,手工修改過的 PE(如加殼、區段合併)可能失效。
  • 若 .text 區剩餘空間不足,注入失敗。
  • 修改入口點可能觸發防毒軟體heuristic掃描。

總結

本範例完整展示 PE 結構解析、匯入表遍歷、區段空間計算與程式碼注入的核心步驟,是理解 Windows 執行檔內部運作的優良教材。實際應用時務必遵守法律法規與軟體授權條款。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved