IDA 操作記錄
1、加載文件
windows 下,用ida加載文件后,會在該文件同目錄下生成幾個文件,含義如下:
.id0 : 二叉樹數據庫
.id1: 文件包含描述每個程序字節的標記
.nam: 包含 IDA NAME 窗口的數據庫
.til: 本地數據庫有關信息
2、保存
don't pack database: 不將ida的加載文件打包
pack database(store): 將加載文件打包(在加載文件的路徑下,將加載生成的文件打包成一個 .pdb(program database) 文件,下次啟動,可以直接用ida加載該pdb文件)。
pack database(deflate): 將加載文件 打包(同上,但是,該方案是將加載文件打包,壓縮)。
3、建議
提倡在分析完數據后,做好數據的保存,ida可能會崩潰。崩潰原因是 ida本身的bug 或者 使用的第三方插件引起的bug,
介紹
通過分析自己用VS2013寫的Win DLL來學習IDA反匯編工具的使用。這里記錄了我分析二進制代碼過程中經常遇到的問題。
首先通過參考資料[1]來熟悉下IDA的使用,建立個最基本的概念。“idb”文件是你分析樣本的數據庫文件,你對樣本的分析信息,比如對函數變量的重命名了,代碼的注釋了,都會存在這個文件里。
PE(Portable Executable)格式,是微軟Win32環境可移植可執行文件(如exe、dll、vxd、sys和vdm等)的標准文件格式,這是我現在要分析的樣本格式。
IDA的主要窗口如下
IDA view: 定位要修改的代碼段在哪里。
Hex view: 用來修改我們的數據
exports window: 導出窗口
import window: 導入窗口
names window: 函數和參數的命名列表
functions window: 樣本的所有函數窗口
strings window: 字符串顯示窗口,會列出程序中的所有字符串
上面幾個窗口由於樣本的作者會做些反分析處理, 你裝載樣本后, 馬上去看是不准確的。
分析二進制代碼比想像中的復雜很多,除了二進制代碼比較冗長外,樣本作者還會采取各種措施阻礙你分析它的代碼。
一般樣本會hide關鍵字符串,讓你找不到。
當然一旦你的IDA程序正確起來加載了樣本,就沒有破解不了的東西,難是難在時間成本的控制,因為你不可能花幾年時間把所有的二進制代碼讀一遍。
如何確定反匯編的區域
這是最難的部份,樣本的作者[1]可能加殼[2]代碼段里放數據,數據段里放代碼讓IDA無法自動線性反匯編,不能確定函數和過程邊界[3]在代碼段里插入特定指令讓IDA無法自動線性反匯編[4]函數體(代碼)分散在各個數據段里,你必須手動確定函數體[5]注冊碼放入多級指針中分別進行多級offset,讓你無法使用IDAtrace[6]每次啟動進程,根據注冊碼生成的內部注冊碼都不一樣,等等。
如果樣本比較簡單的話,可以通過樣本訪問了哪些系統API為始點進行動態分析,確定反匯編區域。
在這個過程中你經常需要改變“內存變量的值”,“執行流程”來測試你現在所跟蹤的分支是否有“價值”進一步分析其含義。
如何修改數據
在Hex View窗口下,[S1]雙擊要修改的地方[S2]使用[F2]捷方式修改當前字節[S3]再按下[F2]快捷方式應用修改。
如何改變執行流程
[1]修改跳轉指令。
[2]修改內存數據。
[3]IDA View中使用下面的命令Jump to IP,Set IP, Run to cursor。
保存修改
使用下面的主菜單命令,直接把修改保存到輸入文件中
[IDA Main Menu]->[Edit]->[PatchProgram]->[Apply patches to input file...]。
如何查看函數之間的關系
IDAView下使用小鍵盤“-”,“+”快捷方式可以在代碼同關系圖之間切換。
如何查看符號引用
IDA View下使用[X]快捷方式,定位引用了當前符號的代碼。
FQA
Q 如何實現16進制加法運算?
A
Matlab中使用下面的命令可以實現0x50+0x150=0x1a0的計算
dec2hex(hex2dec('50')+hex2dec('150'))
Q C語言函數形參表壓棧順序
A
從右向左壓棧,Call指令返回后,需要根據函數的參數數量修改esp寄存器的值,
add esp,0Ch;三個參數,每個參數四字節所以是0ch
Q 如何顯示C偽代碼
A
如果有[Main menu]->[View]->[Open SubViews]->[Pseudocode F5]菜單,說明你已經安裝了Hex Rays decompiler插件,可以在查看匯編的時候,按[F5]打開偽代碼子窗口。
Q 如何返回Function(Proc)的上級調用
A
打開“Call Stack”View。使用[Esc]返回。
Q 如何把變量重定義為數組
A
使用快捷鍵"*"。
Q如何對DLL文件進行動態跟蹤
A
Step1: 用[F2]在IDA View中當前代碼行切換斷點。
Step2: 啟動裝載DLL的EXE文件。
Step3: 使用[Debugger]->[Attach toprocess]把當前二進制代碼attach到正在運行的進程中去。
Step4: 現在應該進入斷點。[F7]Stepinto。[F8]Stepover。[F9]continue。
Step5: Cursor移到內存位置后雙擊就可以查看到具體內存中的值,右擊快捷菜單[Jumpto IP]項,可以回到你剛才指令的地方。
Step6: IDA View中有很多行代碼,可以使用[;]快捷鍵對當前行進行注釋。
Step7: 為了觀察具體指令的二進制表示你還需要[IDAView]->[右擊快捷菜單]->[Synchronize with]->[Hex View 1]這樣Hex View會和你的IDA View中光標位置同步。
沒有第七步,你很難看懂ASM的意思。
Step8: 在IDA View中為函數改名,用[N]快捷鍵。
Step10: 觀察內存(變量)[Tool bar]->[Open the watch list window],[Toolbar]->[Add a variable towatch]。
Step11(可選): 如果作者混淆了二進制代碼,你需要IDAView在頻繁使用[D]ata快捷鍵,[C]ode快捷鍵,強制IDA,解析指定數據塊為數據(Data)或代碼(Code)。
常用指令同二進制的對應關系
NOP 00 00 A0 E1
常用工具
WinSpy 查看進程的窗口信息
http://www.catch22.net/software/winspy-17
Resource Hacker查看EXE、DLL的資源
http://www.angusj.com/resourcehacker/
參考資料
[1] 利用IDA Pro反匯編程序
http://www.cnblogs.com/vento/archive/2013/02/09/2909579.html
[2] experiment : add struct define onIDA6.1
http://blog.csdn.net/lostspeed/article/details/9300575
[3] ASCII碼與16進制的互相轉換(表)
http://www.cnblogs.com/ciey/archive/2010/01/05/1639969.html
[4] 去除 dll 和 exe 文件的數字簽名
http://www.cnblogs.com/szyicol/archive/2012/06/21/2558104.html
[5]在線破解工具包
http://down.52pojie.cn/Tools/
后記
有空瀏覽下IDA主菜單、popup menu、IDA本身自帶的幫助文檔,了解有哪些基本功能可供我們調用,以及如何使用。
來源: https://blog.csdn.net/liuhw4598/article/details/78340180
IDA 自定義結構體
- Shift + F9 打開結構體
- insert 插入結構體
- D 插入結構體數據
- Alt + Q 將某一組數據定義為某結構體
去除行數和機器碼
當我們拷貝代碼是,如果左邊帶有行數和機器碼,就麻煩了。打開 Options -> General,將 Line prefixes 去掉,Number of opcode bytes 置位 0,該字段指顯示多少字節的機器碼
解析方式的轉換
選定地址處,按下 D 鍵,可以將該快內容解析成數據;按下 C 鍵,可以將該塊內容解析成代碼
按 D 鍵,可以將該塊數據解析成單字節/雙字節/四字節等,可以在 Options->Setup data types 中設置需要解析的數據類型。
如果數據是一組數組,右鍵,選擇 Array,可以設置數組格式
將數據轉換為浮點
Edit -> Operand type -> Number -> Floating point
交叉引用
函數的右側,顯示了調用該函數的代碼位置,另外,可以在函數名上按 X 快捷鍵查看。如果要在代碼處顯示多條引用,打開 Options -> General,在 Cross-references 選項卡下的選擇最大顯示條數。
各種快捷鍵
快捷鍵 K
IDA 在反匯編后,浮點操作數如果時內存單元,不能辨認出其所占字節長度時,可以按 K 鍵來轉換其解析方式
快捷鍵 N
可以為變量、函數等取別名
快捷鍵 Q
64 位匯編,按 Q 鍵可以轉化為習慣的讀法
關於習慣
分段
當分析反匯編代碼時,要習慣分段來解析代碼。在注釋時多按一個回車,可以將代碼分成一塊一塊的代碼塊:
注釋
在得知一個變量是有符號還是無符號的時候,要立馬加上標記,比如在名稱為 Var 的變量前面加上 nVar 以示區分。在得知一個變量或函數的作用的時候立即注釋上對應的名稱。