我想寫一個程序集,一旦加載到內存中,寫入新的指令,但我不是100%確定如何繼續,因爲我有對指令指針和其他裝配概念有些懷疑。我假設的方法:在x86彙編中實現反射(在運行時編輯程序)
_func:
push rip ; Not allowed to push RIP, how can I read from RIP?
jmp stage1
stage2:
mov eax, 0
ret
stage1:
pop rbx
; How many times should I increment rbx to point to ‘mov eax, 0’?
; Assuming this is done:
;Move opcodes for ‘mov eax, 1’ into memory where ‘mov eax, 0’ located
mov [rbx], 0xB8
mov [rbx+1], 0x01
mov [rbx+2], 0x00
mov [rbx+3], 0x00
mov [rbx+4], 0x00
jmp stage2
當跳轉到第2階段,而不是 'MOV EAX,0',它會遇到操作碼 'B8 01 00 00 00',並解釋 'MOV EAX,1。'我的一般方法是否正確,並且有人能夠填補代碼中的空白嗎?
附加混亂/問題
是否RBX指向的指令線,或「整體」行的第一個字節?是上述方法正確,或者我應該寫:
mov [rbx], B801000000h
操作系統:的Mac OS X 10.9 彙編: NASM
我不會把這種「反思」 - 這個詞是有點高層次的概念。自修改代碼更像它。 http://stackoverflow.com/questions/24676966/implementing-reflection-in-x86-assembly-editing-the-program-whilst-running –