原始碼閱讀SourceInsight與靜態反彙編IDA Pro
1.原始碼閱讀SI
1.1呼叫關係圖(正向和方向關係調用)
Sourceinsight可以方便的檢視函式呼叫關係,點選圖示 開啟如下:
點選函式的末尾可以展開下一級呼叫關係,如上圖滑鼠彈出”加號“的位置。呼叫關係圖,右鍵可以設定查詢的關係:
for types:檢視變數型別關係設定
for functions:檢視函式呼叫關係或索引關係
for variables,constants:檢視變數值
for classes:檢視類呼叫關係或繼承關係
for files:檢視檔案呼叫關係
1.2 快捷鍵
Ctrl+O:開啟工程檔案視窗
Ctrl+?:搜尋內容視窗
Shit+F8:高量標記變數或函式
Shit+F9:搜尋結果中,往前遍歷查詢結果的檔案索引
Alt+L:只有焦點處於程式碼文字視窗中時,可以是焦點快捷地調到左邊的名稱空間視窗
2.靜態反彙編IDA
2.1反彙編演算法
a.線性掃描反彙編:無法將嵌入的資料和程式碼區分開
b.遞迴下降反彙編:無法處理間接程式碼路徑(如利用指標表來查詢目標地址的跳轉和呼叫)
2.2 常用操作與快捷方式(IDA6.5.1版本)
名稱:sub_xxxx:地址xx子例程 loc_xxxx:地址xx指令 byte_xxxx:位置xx8位資料 unk_xxxx:位置xx大小未知資料
節:idata:函式匯入段 edata:函式匯出段 data:資料段 rdata:資源段
1.Num ”-“或”+“ 圖形檢視和程式碼檢視切換(6.5版本,5.5版本使用space空格切換)
2.Ctrl+s 段跳轉 Ctrl+P 函式跳轉 Ctrl+E 跳轉到函式入口點
3.Shift+F3 函式名視窗 Shift+F4 所有名稱空間視窗 Ctrl+X交叉引用(函式和資料交叉引用,交叉引用:引用其他位置的顯示,Data Xref註釋處)
4.程式碼呼叫關係,選單欄結構圖
5.text view和graph view(單個函式的流程圖) 程式碼跳轉關係
6.ESC 回退檢視 Ctrl+Enter 前進檢視
7.F5外掛 可以翻譯彙編程式碼成pseudocode(虛擬碼)C語言版 -----使用IDA5.5版本較穩定
8.IDA載入過程出現oops錯誤,需要安裝python 2.6版本
9.text view 模式,粗虛線:迴圈,細虛線:條件跳轉,實線:非條件跳轉,紅線:同一函式內
10.Alt+T 搜尋字串
11.選單view->open subviews->cross renferences和function call檢視 (alt+num切換tab) function call和反彙編視窗組合檢視閱讀程式碼
12. Alt+M標記---->Ctrl+M跳轉到標記處
13.IDA 不能確定函式分散到各個段裡的函式邊界,所以有sub_XX和.text的跳轉
函式通過function call聯絡
.text這種分散的函式片段可以通過cross renferences確定
14.F1 IDA幫助文件檢視INC指令碼內部提供的系統函式編寫指令碼
2.3 exe檔案修改
1.修改原則:
單條指令替換
retn返回的 call指令 ------->>替換 nop(0x90)
retn XX返回的 call指令 ---------->>替換 add esp XX
替換所有指令保持棧平衡
push、retn和retn XX call指令 ------------->>替換 nop(0x90)
彙編函式返回值:ret 前賦值給 EAX,資料過大高位存在EDX,再大指標
2.修改方法:
直接修改機械碼,可能導致兩條nop語句之間的彙編程式碼對應的機械碼發生變化,使用如下操作修改
IDA->Options->General->設定opcode byte機器碼顯示
IDA配置檔案cfg目錄下的idagui.cfg,修改DISPLAY_PATCH_SUBMENU=YES,重啟ida可以看到Edit->Patch Program->assembly
使用IDA查詢到程式碼對應的16進位制碼,在UtrlEdit下查詢後,使用以下原則進行全指令替換
2.4 堆疊平衡
call呼叫前,需要壓棧引數,出棧需要彈出堆疊內所有資料,retn xx 或 ret後呼叫處add esp xx平衡,類似prinf函式引數數量不可確定,需要出棧時調整esp
(rop攻擊:面向返回值的錯誤跳轉攻擊)
2.5 反彙編技巧
1.閱讀反彙編時,資料最好從初始化源頭追蹤,如視窗控制代碼需要檢視createwindow函式,否則很難以閱讀
2.lea offset 函式,push入函式代表回撥函式;如果在定義在數組裡,陣列首地址呼叫處,可能是事件迴圈
3.反編譯工具未能識別的函式,以.text塊跳轉 (可以載入pdb檔案匯入本模組的符號表,需要設定pdb.cfg)
4.for、while迴圈:jmp無條件回跳的程式碼
if條件判斷:cmp等標誌暫存器控制 和 跳轉命令
結構體:dword ptr 表明[]字定址、雙字定址或位元組定址,其中Dword Ptr可能是4位元組指標
switch:連續多處調轉
2.6入口函式OEP
幾種語言的入口函式特徵:
C++的入口函式GetVersion
彙編的入口API函式 GetModuleHandleA
DELPHI入口特徵 GetModuleHandleA
易語言入口API函式 GetVersion
VC8入口特徵查詢 GetStartupInfoW
VB入口特徵查詢函式 ThunRTMain
2.7反彙編基礎(16位AX、32位EAX、64位RAX)
AX 累加暫存器 (除法和函式返回值中隱含使用,資料過大DX輔助) CX 記數暫存器 (迴圈中隱含使用)
SI、DI 基址變址暫存器 SP、BP、IP 指標暫存器
C++入口函式在link配置裡面可修改
關注call和jmp、lea(move offset),結構體和類反彙編相同
參考:
1.《IDA Pro權威指南 (第2版)》
2. http://blog.csdn.net/chenyujing1234/article/details/7766639
3.http://www.doc88.com/p-774671348081.html 部落格例項
4.http://www.pediy.com/kssd/pediy12/142766.html 讀書筆記
5.http://bbs.pediy.com/showthread.php?t=160887 連連看新人外掛入門
6.http://ajiannet.cnblogs.com/遊戲外掛
7.http://www.eefocus.com/book/09-05/740251276059759.html彙編指令入門
8.http://blog.csdn.net/chinabinlang/article/details/19476941
9.http://www.cnblogs.com/jack204/archive/2011/12/02/2271884.html(反彙編技巧)