IDA工具各个功能总结
生成文件:保存后生成的文件
id0:二叉樹數據庫
id1:文件包含描述每個程序字節的標記
nam:包含IDA NAME窗口的數據庫
til:本地數據庫有關信息
?
導航帶顏色
?
常用菜單
ESC鍵:后退鍵(避免在窗口標題欄使用,退出窗口)
?
綠色箭頭為YES,紅色箭頭為NO,藍色箭頭為下一個立即執行的塊,拖動線可以改變連接路徑。恢復源圖形,右鍵鼠標菜單,點擊布局圖表。
?
Ctrl鍵+鼠標,放大縮小視圖
?
反匯編視圖
與圖標視圖一一對應,通常打開兩個視圖分別對比工作,按住shift+;可以添加自己的注釋。
?
NAME窗口
F:為重點查看函數,常規函數
L:為庫函數(動態鏈接庫)
A:字符串
I:系統導入函數(基本不用看)(粉色導航代)
Sub_XXXXXX? ? ? ? ?子函數
loc_xxxxxx? ? ? ? ? ? ? 地址處指令
byte_xxxxxx? ? ? ? ? ? 8位數據
word_xxxxxx? ? ? ? ? ?16位數據
dword_xxxxxx? ? ? ? ?32位數據
unk_xxxxxx? ? ? ? ? ? ?未知,unknow
?
字符串窗口
查找字符串對應的位置
?
十六進制窗口
同步反匯編窗口,更好的監視
?
輸出函數窗口
唯一接口,輸出的函數,和main一樣
?
輸入函數窗口
列出二進制導入的函數,系統導入的
?
函數窗口(看英文找功能函數)
識別所有函數名稱
?
結構體窗口
查看結構體,雙擊進入結構體內部查看詳細信息
?
枚舉窗口
IDA自動識別枚舉代碼類型
?
類型庫窗口
可看到克重頭文件包含庫
右鍵鼠標可以插入自己要的庫
?
函數調用窗口
查看上層函數,本級函數級內部調用了些什么函數,與圖表視圖同步查看工作最好。
?
問題窗口(最少用到的窗口)
需要自己分析的問題
比如:未初始化的變量
?
?
導航條
藍色為常用函數,雙擊進入導航函數內部,與圖表結合使用。
g鍵:跳轉地址
?
棧幀
1。先要保護現場
2。講參數按照調用約定放在被運行棧幀上,這樣這個棧幀的棧頂指針就會發生改變
3。如果有必要,調用函數會配置一個棧指針,保存調用方希望保持不變的內容(寄存器值)
4。被調用函數為它可能需要的任何局部變量發配空間,需要棧幀棧頂向上(-操作)開辟地方
5。被調用函數返回值存放在EAX或者存放在可以立即被調用到的地方
6。一旦函數完成其他操作,任何局部變量都釋放了
7。調用地方如果重新獲得控制權,刪除再棧中開辟的空間(+操作)
8。完成“序言(3,4)”“過程(5,6)”“尾聲(6,7)”
C的調用約定_cdecl(參數從右向左一次入棧),清理方式:調用者清理(“老子”清理“兒子”)
? ?對于參數可變化的:printf("XXXXX");
VOID demo_cdecl(int w,int x,int y,int z)
asm
push w
push x
push y
push z
call demo(進入了函數,開始執行了。。。。。。)
add esp,16 ? 4*sizeof(int)
?
標準調用_stdcall
VOID demo_stdcall(int w,int x,int y,int z)
push w
push x
push y
push z
call demo(進入了函數,開始執行了。。。。。。)
ret 16
?
快速調用_fastcall
VOID demo_fastcall(int w,int x,int y,int z)
前兩個(ECX=W,edx=x)參數將被分配給ECX,EDX
剩下的都被按照_stdcall調用約定
ret 8
C++調用約定
使用this指針
VC提供了 thiscall調用,將this傳遞給而ecx
GC++中被當做靜態,存放在棧頂
?
IDA搜索功能
1. 搜索數據庫? ? ??
2. 文本搜索? ? ? ? ? ALT+T
3. 二進制搜索? ? ? ALT+B
?
重命名與局部變量
右鍵啞名可以重命名(Rename),改一處所有變量全部會跟著改變??旖萱I點擊啞名按n鍵,空格還原變量名。
arg_0(棧變量)
var_4(普通變量)
一個函數只能擁有一個arg_0
IDA的注釋與代碼轉換
shift+; 對程序注釋
右鍵鼠標常數轉換對應進制常數
?
操作函數
刪除函數:右鍵函數體(交叉引用)-> 編輯 -> 函數 -> 刪除函數
編輯函數:右鍵函數體 -> 編輯函數(還有局部變量和寄存器保存功能)
?
字符與數據間的轉換
函數 -> 編輯 -> 轉換為代碼(轉換為數據)
? 或者:左鍵點擊函數體,按C轉換代碼,按D轉換數據
改變數據大小,比如db改為dw:選項 -> 設置數據類型
字符串:db數據,以0為結尾。
(1)了解使用寄存器的方式,可以推斷出數據類型的和、大小,如果一條指令從內存中加了一個32位的寄存器,相關的內存保存了一個4字節的類型
(2)函數原型分配參數數據類型,IDA維護一個龐大的函數原型,分析傳遞的參數類型,讓他與某個內存的地址關聯起來,CRITICAL_SECTION(Windows的數據類型)
(3)分析字節序列,知道肯能的數據類型,掃描2進制,知道字符串內容
name generation(命名生成)
轉換數組:編輯 -> 轉換為數組組合
?
IDA數據中數組元素的訪問
全局:mov dword_21365c, 10
局部:mov? [ebp+var_c], 10
?
IDA中結構體與數據庫
結構體界面,按insent健,起名字后OK,按d健插入數據(在按d為類型大小變換),在ends按a為插入字符串,右鍵菜單轉換數據數組,按n健重命名,按u鍵刪除字段,按delete刪除結構體。
?
?
編輯 -> 結構體變量,在數據中轉換為結構體。
alt+k :堆結構體
?
分析頭文件
文件 -> 加載文件 -> 分析 C 頭文件
?
創建idc腳本
文件 -> 生成文件 -> 數據庫轉存為idc文件
?
C++逆向工程基礎
ecx=thisclass A: {public:A();virtual void vfunc1()=0;virtual void vfunc2();virtual void vfun3();virtual void vfun4();private:(虛擬指針)int x;int y; };class B:public A {public:B();virtual void vfunc1();virtual void vfunc2();virtual void vfunc5();private:int z; };void call_vfunc(A* a) {a->vfun3(); }int main() {A *a_ptr =new B();call_vfunc(a_ptr); }B::vfunc3()push ebpmov ebp,esp //保存現場 mov eax,[ebp+10d] //a_ptr 4個函數+虛擬指針指向虛函數表mov edx,[eax] //*a_ptr 1 將虛擬表指針內容放入edxmov ecx,[ebp+10d] //*a_ptr 將虛擬表指針放入cx,繼承作用mov eax,[edx+8] //a->vfun3();2 0,4,8 取第三個函數也就是vfun8 a->vfun3();call eax //3 call就是調用a->vfun3()// 2個可以簡寫為:mov eax,[edx+B_Vtable.vfunc3]?
交叉引用
jmp:if跳轉
call:函數調用
上箭頭:引用出在上方
下箭頭:引用處在下方
j: jmp
r: read? ? ?讀數據區的某數據
w: weite? 往某變量寫數據
o: 偏移? ? ?offset引用
p: 調用子程序
詳細:https://blog.csdn.net/hgy413/article/details/50594320
?
交叉引用列表與繪圖
交叉應用附近,點擊變量,右鍵跳轉到交叉引用列表,或者按x
查看函數調用
?
按F12,查看最清晰的流程圖
查看函數調用圖
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的IDA工具各个功能总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RedHat gcc编译器版本升级到4.
- 下一篇: C/C++:C语言小程序—批量重命名文件