IDA 操作記錄


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 自定義結構體

  1. Shift + F9 打開結構體
  2. insert 插入結構體
  3. D 插入結構體數據
  4. 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 以示區分。在得知一個變量或函數的作用的時候立即注釋上對應的名稱。

 


免責聲明!

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



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