逆向so文件調試工具ida基礎知識點


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時,就可以跳過循環體


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM