彙編debug程式跳轉指令的方法

純愛楓若情發表於2018-01-26

問題

一直在用微軟自帶的彙編debug軟體,今天突然有了需要修改ip指令的需求,我以為debug裡面有自帶的修改ip地址的方法,但是查了很多資料,發現並沒有。

思路

後來我研究了一下,其實可以通過朝當前的ip指向的地址內寫入一個jmp到目的地的指令,然後單步執行這個指令,那麼ip就自動跳轉到目的地去了。

方法

1.我朝記憶體中寫入了一段彙編程式碼,比如這樣:

0AE8:0100 mov ax,0
0AE8:0103 mov bx,1
0AE8:0106 add ax,bx
0AE8:0108 add bx,2
0AE8:010B cmp bx,10d
0AE8:010F jl 106

2.現在我的ip指向的並不是0100這個地址,比如指向的是0112,按r檢視暫存器當前狀態

-r
AX=0000  BX=0011  CX=0000  DX=0000  SP=FFEC  BP=0000  SI=0000  DI=0000
DS=0AE8  ES=0AE8  SS=0AE8  CS=0AE8  IP=0112   NV UP EI PL ZR NA PE NC
0AE8:0112 A2D899        MOV     [99D8],AL                          DS:99D8=00

3.然後朝ip指向的當前地址寫入一段跳轉指令

-a 112
0AE8:0112 jmp 100
0AE8:0114
-r
AX=0000  BX=0011  CX=0000  DX=0000  SP=FFEC  BP=0000  SI=0000  DI=0000
DS=0AE8  ES=0AE8  SS=0AE8  CS=0AE8  IP=0112   NV UP EI PL ZR NA PE NC
0AE8:0112 EBEC          JMP     0100
-t

AX=0000  BX=0011  CX=0000  DX=0000  SP=FFEC  BP=0000  SI=0000  DI=0000
DS=0AE8  ES=0AE8  SS=0AE8  CS=0AE8  IP=0100   NV UP EI PL ZR NA PE NC
0AE8:0100 B80000        MOV     AX,0000

可以看到寫入跳轉指令以後,單步執行,ip馬上就跳轉到指定的地址去了,即將執行的正是mov ax,0這一指令。

總結

其實想了想,上面的步驟並不是很嚴謹,如果你想直接用debug來驗證自己的彙編程式碼,第一步就應該先將ip指向自己想要記憶體區域,第二步才是朝ip指向的記憶體中寫入彙編程式碼,第三步才是進行除錯。

當然如果你說要怎麼修改暫存器的值,還是上面的思路,想好程式碼,寫入記憶體,然後單步執行。

還有,差點忘了一點,也許上面的程式碼還有點問題,我ip所指向的記憶體離我寫入彙編程式碼的地方太近了,也許我調整ip的時候,會覆蓋了我所鍵入的程式碼。因此,最好還是要檢查下程式碼被改了沒,然後再進行執行除錯。

相關文章