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

組語在程式碼區寫入資料:連結器 /section:.text,rw 參數詳解

     編輯:組合語言

問題現象

嘗試在 .code 區段定義變數並寫入:

.code
messAdd dd 0
mess db 'How are you !',0
start:
    lea eax, mess
    mov messAdd, eax   ; 寫入 .code 區資料
    invoke StdOut, messAdd
    invoke ExitProcess, NULL

執行時彈出錯誤訊息框,程式崩潰。原因:連結器預設將 .text(.code 區段)屬性設為 Read/Execute/Code,不含 Write 權限,任何寫入嘗試皆觸發存取違例。

解決方案:連結時指定區段屬性

ml /coff 11.asm /link /subsystem:console /section:.text,rw
  • /section:.text,rw:將 .text 區段屬性改為 Read/Write(R=讀、W=寫)。
  • 連結器輸出顯示 /section:.text,rw 確認生效。

執行結果

D:\MASM7>11
How are you !
D:\MASM7>_

程式正常輸出字串,證明區段可寫屬性已生效。

原理與注意事項

  • PE 檔區段屬性定義於 Section Header 的 Characteristics 欄位(IMAGE_SCN_MEM_WRITE = 0x80000000)。
  • 預設 .text 為 IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ (0x60000020)。
  • 加入 rw 會設定 IMAGE_SCN_MEM_WRITE,使該區段在載入時獲得 PAGE_EXECUTE_READWRITE 頁面保護。
  • 安全性警示:可寫執行區段違反 DEP (Data Execution Prevention) 原則,現代 Windows 可能阻止或記錄此類程式。僅供教學、相容舊代碼或特殊需求(如自我修改代碼、JIT 編譯器)使用。
  • 正常資料應放在 .data(可讀寫)或 .const/.rdata(唯讀)區段。

替代方案

若需在執行期修改程式碼(如熱修補、解殼),可考慮:

  1. VirtualProtect 暫時變更頁面保護為 PAGE_EXECUTE_READWRITE,修改後還原。
  2. 分配獨立可執行記憶體(VirtualAlloc + PAGE_EXECUTE_READWRITE)並複製代碼過去。

此兩種方式不需修改 PE 檔區段屬性,更符合現代安全規範。

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