2016-11-11 82 views
1

這是可執行的指令:更改MOV設置不變0

mov dword_1006530C, esi -> 89 35 0C 53 06 10 

如何改變六角移動零點來解決?

+0

你能澄清一點嗎?你到底想做什麼? – Wold

+0

您的意思是將零值作爲32位位元戳寫入絕對地址0x1006530C?如果是這樣,那麼您將需要一些關於周圍代碼的額外上下文,因爲沒有足夠的代碼空間來就地修補當前指令。順便提一句,是地址常量還是需要在磁盤可執行文件中保留重定位記錄才能打補丁? – doynax

+2

最終目標是修補可執行文件。我在這個領域是新的,但我的猜測是我可以改變屬於這個指令的字節。也許我可以檢查寄存器,看看在那個執行點上是否有0值,並將esi更改爲那個?這會有點危險,但如果沒有簡單的解決方案可以工作? – Jonas

回答

5

沒有足夠的空間來編寫寫入零地址的指令序列。
僅編碼爲立即數的地址將佔用四個字節。僅剩下兩個字節用於:a)保存寄存器b)將其置零c)執行存儲d)恢復寄存器。

如果碰巧你在其他一些零註冊,您可以更改指令到

mov DWORD [1006530ch], <reg> 

您可以使用NASM快速找出這類代碼的機器代碼:只寫在代碼文件,在開頭添加BITS 32
組裝它並使用十六進制編輯器檢查輸出文件。
例如mov DWORD [1006530ch], edi89 3D 0C 53 06 10

如果您沒有準備好零,唯一的解決辦法是用文本部分中的自由點替換指令(jmp)(總是有一個空白點),您可以在其中粘貼機器代碼並在結束跳回原來的程序流程。

+0

使用'mov r/m32,imm32'來代替保存/恢復寄存器並將其調零可能會更短(但仍不夠短)。但是,是的,這個結論是正確的:如果你在一個區域沒有零點,你就不能在原地進行。 –