OLLYDBG知识
1.MUL DWORD PTR DS:[405000]解釋
MUL:MUL(無符號數的乘法)
有兩種乘法,第一個種是MUL,這種是無符號數乘法,只有一個操作數,另一個操作數是EAX,結果存放到EDX:EAX中。
---- EDX:EAX是指結果存放在EDX:EAX中,如果需要得到結果,則由EDX連接到EAX而得。比如:計算后:結果是:1FFFFFFFA,由于EAX只能存放FFFFFFFA,那個1則存放在EDX中(00000001)。
dword 雙字 就是四個字節
ptr pointer縮寫 即指針
[]里的數據是一個偏移地址值,這個偏移地址與DS組合指向一個雙字型數據
如果不加[]就會報錯
DS:CS:代碼段寄存bai器;DS:數據段寄存器;SS:堆棧段du寄存器。段寄存器DS指向數據段,ES指向附加段,在存取操作數時,二者之一和一個偏移量合并就可得到存儲單元的物理地址。該偏移量可以是具體數值、符號地址和指針寄存器的值等之一,具體情況將由指令的尋址方式來決定。
ds:[]ds是段前綴 例如:ds:[bx]
偏移地址在bx中,段地址在ds中。
轉換時,先將16位的段地址左移4位,相當于乘以16或者16進制的10H,再和偏移地址相加。–from - https://blog.csdn.net/thisispan/article/details/7685040
轉換公式為:
物理地址 = 段地址*10H + 偏移地址(H(hexadecimal):16進制)
2.循環
—from 看雪學院翻譯的ollydbg
LOOPNZ, LOOPNE 重復循環,直到零標志位Z清0
這幾條指令同樣是循環指令,即重復循環體,直到計數器為0,每次循環將計數器的值遞減1。此外,LOOPZ,LOOPNZ指令還將檢查零標志位Z是否為0。只有計數器的值和零標志Z同時滿足條件時才循環。
3 . 尋址方式
看雪學院翻譯的ollydbg
直接尋址
這是最簡單的一種尋址方式-該指令的操作數中包含一個具體的地址。
例如:
MOV DWORD PTR [00513450], ECX
MOV AX, WORD PTR [00510A25]
MOV AL, BYTE PTR [00402811]
CALL 452200
JMP 421000
不需要進行任何有關地址解析的計算,地址的值是純數字。
間接尋址
MOV DWORD PTR[EAX], ECX
CALL EAX
JMP [EBX + 4]
要想在指令執行之前看到真實地址,需要在該指令上下斷點,斷下來以后查看寄存器的值或者查看解釋窗口中的提示信息。
許多程序使用間接尋址來完成一些復雜的操作,因此剛開始分析調試的時候真實地址并不會顯示出來。直到我們執行到這條指令的時候,查看相應寄存器的值才能夠直到真實的地址。
現在我們再次用OD加載Cruehead’a的CrackMe。
這里我們來看一看間接尋址的例子:PUSH [EBP + 8]
因為當前我們處于入口點,在執行PUSH [EBP + 8]指令之前我們并不能預先直到EBP寄存器的值,我們在該指令處(4010E9)按下F2鍵,設置一個斷點。
然后按F9鍵(運行)-CrackMe運行一會兒就會斷在我們設置的斷點處。
解釋窗口中提示EBP+8=12FFF8。在我的機器上面此時EBP為12FFF0,所以EBP+8=12FFF8。
現在讓我們在數據窗口中看看EBP+8指向內存單元的值,在數據窗口中單擊鼠標右鍵選擇-Go to-Expression,輸入EBP+8
使用間接尋址的指令,只能在執行這條指令的時候獲取地址當前的值。
4 . 快捷鍵
5 .XOR EAX,ECX會把結果存到第一個操作數中,CMP不會。
6 .反調試
總結
- 上一篇: webstorm导致CPU占用率高
- 下一篇: 《凡人修仙传》读后