1.界面介紹
https://www.freebuf.com/column/157939.html
2.IDA常用快捷鍵
切換文本視圖與圖表視圖
空格鍵
返回上一個操作地址
ESC
搜索地址和符號
G
對符號進行重命名
N
常規注釋
'冒號鍵
可重復注釋
分號鍵
添加標簽
Alt+M
查看標簽
Ctrl+M
查看段的信息
Ctrl+S
查看交叉應用
X
查看偽代碼
F5
搜索文本
Alt+T
搜索十六進
Alt+B
3.命令快捷鍵
F2:下斷點
F3:打開程序
F4:運行到當前光標處(可應用在跳出 循壞)
F7:單步步入(進函數)
F8:單步 步過
F9;運行
F10:打開反匯編選項菜單快捷鍵
F12:暫時停止
Ctrl+F2:重新開始
Art+F2:結束跟蹤
Shift+F2:打開附加選項窗口
Shift+F4:打開條件對話窗
Shift+F7:與F7相同,但是如果被調試程序發生異常而中止,調試器會首先嘗試步入被調試程序指定的異常處理
Ctrl+F7:自動步入,在所有的函數調用中一條一條地執行命令,斷點或異常時,自動 停止
Shift+F8與F8相同,但是如果被調試程序發生異常而中止,調試器會首先嘗試步過被調試程序指定的異常處理
Ctrl+F8:自動步過,一條一條的執行命令,程序到達斷點,或者發生異常時,自動步過過程都會停止
Shift+F9:與F9相同,但是如果被調試程序發生異常而中止,調試器會首先嘗試執行被調試程序指定的異常處理
Ctrl+F9 :執行直到返回,跟蹤程序直到遇到返回,在此期間不進入子函數也不更新CPU數據。因為程序是一條一條命令執行的,所以速度可能會慢一些。按Esc鍵,可以停止跟蹤。
Alt+F9:執行直到返回到用戶代碼段,跟蹤程序直到指令所屬於的模塊不在系統目錄中,在此期間不進入子函數也不更新CPU數據。按Esc鍵,可以停止跟蹤。
Ctrl+F11:Run跟蹤步入,一條一條執行命令,進入每個子函數調用,並把寄存器的信息加入到Run跟蹤的存儲數據中。Run跟蹤不會同步更新CPU窗口。
Ctrl+F12 :Run跟蹤。步過,一條一條執行命令,但是不進入子函數調用,並把寄存器的信息加入到Run跟蹤的存儲數據中。Run跟蹤不會同步更新CPU窗口。
Art+C:快速回到主界面
Alt+B:顯示斷點窗口
Alt+E:顯示模塊窗口
Art+L:顯示記錄窗口
Alt+M:顯示內存窗口
Alt+O:顯示調試選項窗口
Alt+K:顯示呼叫堆棧
Ctrl+E:編輯機器碼
Ctrl+G:輸入跟隨地址
Ctrl+N:查找名稱標志,選擇你要下斷的內容
Ctrl+S:打開查找命令次序窗口
Ctrl+P:顯示補丁窗口
Ctrl+F9:返回到跟蹤
Ctrl+F8:自動步進掃描,按F12可停止
Ctrl+F7:同上,功能略有不同
Ctrl+F6:回到OL主窗口
4.命令
CALC :判斷表達式
WATCH :添加監視表達式
AT / FOLLOW:(Disassemble at address)在地址進行反匯編
ORIG :(Disassemble at EIP )反匯編於 EIP
DUMP :(Dump at address )在地址轉存
DA :(Dump as disassembly)轉存為反匯編代碼
DB :(Dump in hex byte format )轉存在十六進制字節格式
DC :(Dump in ASCII format )轉存在 ASCII 格式
DD :(Dump in stack format )轉存在堆棧格式
DU :(Dump in UNICODE format )轉存在 UNICODE 格式
DW :(Dump in hex word format )轉存在十六進制字詞格式
STK :(Go to address in stack )前往堆棧中的地址
AS + 地址 + 字符串 :(Assemble at address )在地址進行匯編
L + 地址 + 字符串 :(Label at address )在地址進行標號
C + 地址 + 字符串 :(Comment at address )在地址進行注釋
BP :(Break with condition )使用條件中斷
BPX :(Break on all calls )中斷在全部調用
BPD :(Delete break on all calls )清除位於全部調用的斷點
BC :(Delete breakpoint )清除斷點
MR :(Memory breakpt on access )內存斷點於訪問時
MW :(Memory breakpt on write )內存斷點於寫入時
MD :(Remove memory breakpoint )清除內存斷點
HR :(HW break on access )硬件中斷在訪問
HW :(HW break on write )硬件中斷在寫入
HE :(HW break on execution )硬件中斷在執行
HD :(Remove HW breakpoint )清除硬件斷點
STOP :(Pause execution )暫停執行
RUN :(Run program )運行程序
GE :(Run and pass exception )運行和通過例外
SI :(Step into )步入
SO :(Step over )步過
TI :(Trace in till address )跟蹤進入直到地址
TO :(Trace over till address)跟蹤步過直到地址
TC :(Trace in till condition)跟蹤進入直到條件
TOC :(Trace over till condition )跟蹤步過直到條件
TR :(Till return)直到返回
TU :(Till user code )直到用戶代碼
LOG :(View Log window )查看記錄窗口
MOD :(View Modules window )查看模塊窗口
MEM :(View Memory window )查看內存窗口
CPU :(View CPU window )查看 CPU 窗口
CS :(View Call Stack )查看 Call 堆棧
BRK :(View Breakpoints window )查看斷點窗口
HELP :(Help on API function )API 函數的幫助
DASM :(Disassemble immediate opcode )反匯編直接的機器碼
FR :(Find reference to selected command/address)查找參考到選定的命令/地址
AC :(Analyse code )分析代碼
SN :(Search for Name(label) in current module )在當前模塊中搜索名稱(標號)
5.二進制命令
參考https://blog.csdn.net/qq_36982160/article/details/82950848
簡單傳送指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
MOV | 傳送指令 | MOV DEST,SRC | DEST<=SRC | |
XCHG | 交換指令 | XCHG OPER1,OPER2 | 把操作數oper1的內容與操作數oper2的內容交換 | oper1和oper2可以是通用寄存器或存儲單元,但不能同時是操作單元,也不能是立即數。 |
簡單加減指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
ADD | 加法指令 | ADD DEST,SRC | DEST<=DEST SRC | 兩數相加 |
SUB | 減法指令 | SUB DEST,SRC | DEST<=DEST-SRC | 兩數相減 |
INC | 加1指令 | INC DEST | DEST<=DEST 1 | |
DEC | 減1指令 | DEC DEST | DEST<=DEST-1 | |
NEG | 取補指令 | NEG OPRD | OPRD=0-OPRD | 對操作數取補(相反數) |
狀態標志
標志 | 中文名 | 解釋 |
---|---|---|
CF(carry flag) | 進位標志 | 主要反映算術運算是否產生進位或借位,若產生,則CF=1,否則CF=0 |
ZF | 零標志 | 反映運算結果是否為0 |
SF(sign flag) | 符號標志 | 根據運算結果的最高位,若最高位為1則SF為1,否則為0,反映了有符號數運算結果的正負(0正1負) |
OF(overflow flag) | 溢出標志 | 反映有符號數運算結果是否產生溢出,是置1,否置0 |
PF(parity flag) | 奇偶標志 | 偶數置1奇數置0 |
AF | 輔助進位標志 |
狀態標志操作指令
指令 | 中文名 | 格式 | 解釋 |
---|---|---|---|
CLC(clear carry flag) | 清進位標志指令 | CLC | 使進位標志CF為0 |
STC(set carry flag) | 置進位標志指令 | STC | 使進位標志CF為1 |
CMC(complement carry flag) | 進位標志取反指令 | CMC | 使進位標志CF取反 |
LAHF(load status flags into AH register) | 獲取狀態標志操作指令 | LAHF | 把位於標志寄存器低端的5個狀態標志位(p26圖2.3)信息同時送到寄存器AH的對應位 |
SAHF(store AH into Flags) | 設置狀態標志操作指令 | SAHF | 對標志寄存器中的低8位產生影響,使得狀態標志位SF、ZF、AF、PF和CF分別成為來自寄存器AH中對應位的值,但保留位(位1、位3、位5)不受影響 |
帶進位加減指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
ADC(add with carry) | 帶進位加法指令 | ADC DEST,SRC | DEST<=DEST SRC CF | 與add指令不同之處是要再加上進位標志cf的值 |
SBB(substraction with borrow) | 帶借位減法 | SBB DEST,SRC | DEST<=DEST-(SRC CF) | 與sub指令不同之處是要再減上借位標志cf的值 |
取有效地址指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
LEA(load effective address) | 取有效地址指令 | LEA REC,OPRD | 把操作數oprd的有效地址傳送到操作數rec,源操作數oprd必須是一個存儲器操作數,目的操作數rec必須是一個16位或32位的通用寄存器 | 與mov指令的區別:mov:移動地址中的值lea:將地址進行移動 |
堆棧和堆棧操作
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
PUSH | 進棧指令 | PUSH SRC | 把源操作數src壓入堆棧 | 源操作數src可以是32位通用寄存器、16位通用寄存器和段寄存器,也可以是雙字存儲單元或者字符存儲單元,還可以是立即數 |
POP | 出棧指令 | POP DEST | 從棧頂彈出一個雙字或字數據到目的操作數 | 如果目的操作數是雙字的,那么就從棧頂彈出一個雙字數據,否則,從棧頂彈出一個字數據,出棧至少彈出一個字(16位) |
PUSHA | 16位通用寄存器全進棧指令 | PUSHA | 將所有8個16位通用寄存器的內容壓入堆棧 | 壓入順序是AX CX DX BX SP BP SI DI,然后對戰指針寄存器SP的值減16,所以SP進棧的內容是PUSHA指令執行之前的值 |
POPA | 16位通用寄存器全出棧指令 | POPA | 以PUSHA相反的順序從堆棧中彈出內容,從而恢復PUSHA之前的寄存器狀態 | SP的值不是由堆棧彈出的,而是通過增加16來恢復 |
PUSHAD | 32位通用寄存器全進棧指令 | PUSHAD | 將所有8個32位通用寄存器的內容壓入堆棧 | 壓入順序是EAX ECX EDX EBX ESP EBP ESI EDI,然后對戰指針寄存器SP的值減32,所以SP進棧的內容是PUSHAD指令執行之前的值 |
POPAD | 32位通用寄存器全出棧指令 | POPAD | 以PUSHAD相反的順序從堆棧中彈出內容,從而恢復PUSHAD之前的寄存器狀態 | ESP的值不是由堆棧彈出的,而是通過增加32來恢復 |
過程調用和返回指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
CALL | 過程調用指令 | CALL LABEL | 段內直接調用LABEL | 與jmp的區別在於call指令會在調用label之前保存返回地址(call 中return之后主程序還可以繼續執行,jmp 當label執行完畢后不能返回主程序繼續執行) |
RET | 段內過程返回指令 | RET | 使子程序結束,繼續執行主程序 |
算術邏輯運算指令
指令 | 中文名 |
---|---|
MUL | 無符號數乘法指令 |
IMUL | 有符號數乘法指令 |
IMUL DEST,SRC | 有符號數乘法指令 |
IMUL DEST,SRC1,SRC2 | 有符號數乘法指令 |
DIV | 無符號數除法指令 |
IDIV OPRD | 有符號數除法指令 |
符號拓展指令
指令 | 中文名 | 格式 | 解釋 |
---|---|---|---|
CBW | 字節轉化為字指令 | CBW | 把寄存器AL中的值符號拓展到寄存器AH |
CWD | 字轉化為雙字指令 | CWD | 把寄存器AX中的值符號拓展到寄存器DX |
CDQ | 雙字轉化為四字指令 | CDQ | 把寄存器EAX中的值符號拓展到EDX |
CWDE | 字轉化為雙字指令 | CWDE | 把AX中的值符號拓展到EAX的高16位 |
拓展傳送指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
MOVSX | 符號拓展傳送指令 | MOVSX DEST,SRC | 把源操作數SRC符號拓展后送至目的操作數DEST | src可以是通用寄存器或者存儲單元,但是dest只能是通用寄存器(零拓展傳送指令不會改變源操作數,也不影響標志寄存器的狀態) |
MOVZX | MOVZX DEST,SRC | 把源操作數SRC零拓展后送至目的操作數DEST | 零拓展傳送指令不會改變源操作數,也不影響標志寄存器的狀態 |
邏輯運算指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
NOT | 否運算指令 | NOT OPRD | 把操作數OPRD按位取反,然后送回OPRD | |
AND | 與運算指令 | AND DEST,SRC | 把兩個操作數進行與運算之后結果送回DEST | 同1得1,否則得0 |
OR | 或運算指令 | OR DEST,SRC | 把兩個操作數進行或運算之后結果送回DEST | 同0得0,否則得1 |
XOR | 異或運算 | XOR DEST,SRC | 把兩個操作數進行異或運算之后結果送回DEST | 相同得0不同得1 |
TEST | 測試指令 | TEST DEST,SRC | 與AND指令類似,將各位相與,但是結果不送回DEST,僅影響狀態位標志,指令執行后,ZF、PF、SF反映運算結果,CF和OF被清零 | 通常用於檢測某些位是否為1,但又不希望改變操作數的值 |
移位指令
一般移位指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
SAL | 算術左移 | SAL OPRD,count | 把操作數oprd左移count位,右邊補0 | 與shl指令一樣 通過截取count的低5位,實際的移位數被限於0到31之間。 |
SHL | 邏輯左移 | SHL OPRD,count | 把操作數oprd左移count位,右邊補0 | 與sal指令一樣 通過截取count的低5位,實際的移位數被限於0到31之間。 |
SAR | 算術右移 | SAR OPRD,count | 把操作數oprd右移count位,同時每右移一位,左邊補符號位,移出的最低位進入標志位CF | 通過截取count的低5位,實際的移位數被限於0到31之間。 |
SHR | 邏輯右移 | SHR OPRD,count | 把操作數oprd右移count位,左邊補0,移出的最低位進入標志位CF | 通過截取count的低5位,實際的移位數被限於0到31之間。 |
循環移位指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
ROL | 左循環移位指令 | ROL OPRD,count | 通過截取count的低5位,實際的移位數被限於0到31之間。 | |
ROR | 右循環移位指令 | ROR OPRD,count | 通過截取count的低5位,實際的移位數被限於0到31之間。 | |
RCL | 帶進位左循環移位 | RCL OPRD,count | 相當於CF在最高位參與循環移位 | 大循環左移 通過截取count的低5位,實際的移位數被限於0到31之間。 |
RCR | 帶進位右循環移位 | RCR OPRD,count | 相當於CF在最高位參與循環移位 | 大循環右移 通過截取count的低5位,實際的移位數被限於0到31之間。 |
循環指令
指令 | 中文名 | 格式 | 解釋 | 備注 |
---|---|---|---|---|
LOOP | 計數循環指令 | LOOP LABEL | 使ECX的值減1,當ECX的值不為0的時候跳轉至LABEL,否則執行LOOP之后的語句 | |
LOOPE | 等於循環指令 | LOOPE LABEL | 使ECX的值減1,如果結果不等於0並且零標志ZF等於1(表示相等),那么就轉移到LABEL,否則執行LOOPE之后的語句 | |
LOOPZ | 零循環指令 | LOOPZ LABEL | 使ECX的值減1,如果結果不等於0並且零標志ZF等於1(表示相等),那么就轉移到LABEL,否則執行LOOPZ之后的語句 | |
LOOPNE | 不等於循環指令 | LOOPE LABEL | 使ECX的值減1,如果結果不等於0並且零標志ZF等於0(表示不相等),那么就轉移到LABEL,否則執行LOOPNE之后的語句 | |
LOOPNZ | 非零循環指令 | LOOPNZ LABEL | 使ECX的值減1,如果結果不等於0並且零標志ZF等於0(表示不相等),那么9就轉移到LABEL,否則執行LOOPNZ之后的語句 | |
JECXZ | 計數轉移指令 | JECXZ LABEL | 當寄存器ECX的值為0時轉移到LABEL,否則順序執行 | 通常在循環開始之前使用該指令,所以循環次數為0時,就可以跳過循環體 |