嘗試在 .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>_
程式正常輸出字串,證明區段可寫屬性已生效。
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 頁面保護。.data(可讀寫)或 .const/.rdata(唯讀)區段。若需在執行期修改程式碼(如熱修補、解殼),可考慮:
VirtualProtect 暫時變更頁面保護為 PAGE_EXECUTE_READWRITE,修改後還原。VirtualAlloc + PAGE_EXECUTE_READWRITE)並複製代碼過去。此兩種方式不需修改 PE 檔區段屬性,更符合現代安全規範。