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時,就可以跳過回圈體 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/121088.html
標籤:其他
