逆向与汇编的一些笔记
寄存器
EAX:累加寄存器
EBX:基址寄存器
ECX:計數寄存器
EDX:數據寄存器
ESI:來源寄存器
EDI:目標寄存器
EBP:基址指針寄存器
ESP:堆棧指針寄存器
EIP:指令指針寄存器
?
條件跳轉指令
ja? CF=0 and ZF=0
jab CF=0
jb?? CF=1
jbe? CF=1 of ZF =1
jcxz? CX=0
je???? ZF=1
jecxz?? ECX=0
jg?? ZF=0? and??? SF=OF
jge? SF=OF
jl? SF!=OF
jle? ZF=1?? or SF!=OF
jmp? 無條件跳轉
jna? CF=1 or? ZF=1
jnae? CF=1
jnb?? CF=0
jnbe? CF=0 and ZF=0
jnc???? CF=0
jne???? ZF=0
jng???? ZF=1 or SF!=OF
jnge?? SF!=OF
jnl?????? SF=OF
jnle???? ZF=0 and SF=OF
jno????? OF=0
jnp????? PF=0
jns??????SF=0
jnz????? ZF=0
jo?????? OF=1
jp?????? PF=1
jpe??? PF=1
jpo???? PF=0
js????? SF=1
jz????? ZF=1
?
標志位
Z標志位(0標志),這個標志位是最常用的,運算結果為0時候,Z標志位置1,否則置0。
O標志位(溢出標志),在運行過程中,如操作數超出了機器能表示的范圍則稱為溢出,此時OF位置1,否則置0。
C標志位(進位標志),記錄運算時從最高有效位產生的進位值。例如執行加法指令時,最高有效位有進位時置1,否則置0。
?
cmp指令大概有以下幾種格式:
cmp eax, ebx ;如果相等,Z標志位置1,否則0.
cmp eax, [404000] ;將eax和404000地址處的dword型數據相比較并同上置位。
cmp [404000], eax ;同上。
?
test指令
test eax,eax? ;如果eax的值為0,則Z標志位置1
?
邏輯運算
and eax,ebx?
or eax,ebx
xor eax,ebx
not eax
?
CALL指令
call XXX; 等于 push eip; 然后 jmp XXX;
call有以下幾點調用方式?
call 404000h ;直接跳到函數或過程的地址
call eax ;函數或過程地址存放在eax
call dword ptr [eax]
call dword ptr [eax+5]
call dword ptr [<&API>] ;執行一個系統API
?
PE文件格式
PE文件結構:
DOS header
DOS stub
PE File Header
Image Optional Header
Section Table
Data Directories
Sections
?
GetModuleHandleA這個API函數用于獲取程序的ImageBase(基址)
VA(VirtualAddress,虛擬地址)
RVA(RelativeVirtualAddress,相對虛擬地址)
EP(EntryPoint,程序入口點)
?
?
軟件斷點
設置該斷點的原理是在斷點處重寫代碼,插入一個int3中斷指令,當CPU執行到int3指令的時候,OD就可以獲得控制權。軟件斷點只能在OD的CPU界面下,在數據段它下不了,在一條指令的中間它也下不了。?
硬件斷點:
這個原理跟軟件斷點不同,硬件斷點的可行性依賴于CPU的物理支持。CPU有四個調試寄存器。如果我們想下在windows的動態鏈接庫里下斷點,需要用到硬件斷點,因為用軟件斷點下在dll文件中是不會保存的,重啟程序后將丟失斷點。
?
總結
以上是生活随笔為你收集整理的逆向与汇编的一些笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OllyDbg的一些快捷键
- 下一篇: exe的dll加载过程