## 11.2 IDAPython 函數
IDAPython 能夠訪問所有的 IDC 函數,我們只介紹一些會馬上用到,為之后的 IDAPython
腳本編寫做基礎。IDC 總共有 100 多個函數,有興趣的可以研究研究。
### 11.2.1 常用函數
以下的函數都是在編寫腳本的時候經常用到的。
`ScreenEA()`
獲取 IDA 調試窗口中,光標指向代碼的地址。通過這個函數,我們就能夠從一個已知 的點運行我們的腳本。
`GetInputFileMD5()`
返回 IDA 加載的二進制文件的 MD5 值,通過這個值能夠判斷一個文件的不同版本是否 有改變。
### 11.2.2 段
在 IDA 中二進制文件被分成了不同的段,這些段根據功能分成了不同的類型( CODE, DATA, BSS, STACK, CONST,XTRN)。以下的函數用于分析獲得各種段信息。
`FirstSeg()`
訪問程序中的第一個段。
`NextSeg()`
訪問下一個段,如果沒有就返回 BADADDR。
`SegByName( string SegmentName )`
通過段名字返回段基址,舉個例子,如果調用.text 作為參數,就會返回程序中代碼段的開始 位置。
`SegEnd( long Address )`
通過段內的某個地址,獲得段尾的地址。
`SegStart( long Address )`
通過段內的某個地址,獲得段頭的地址。
`SegName( long Address )`
通過段內的某個地址,獲得段名。
`Segments()`
返回目標程序中的所有段的開始地址。
### 11.2.3 函數
循環訪問程序中的所有函數,確定函數的范圍,是腳本編程中會經常碰到的問題。下面 的函數對于處理函數非常有用。
`Functions( long StartAddress, long EndAddress )`
返回一個列表,包含了從 StartAddress 到 EndAddress 之間的所有函數。
`Chunks( long FunctionAddress )`
返回一個列表,包含了函數片段。每個列表項都是一個元組(chunk start, chunk end)
`LocByName( string FunctionName )`
通過函數名返回函數的地址。
`GetFuncOffset( long Address )`
通過任意一個地址,然后得到這個地址所屬的函數名,以及給定地址和函數的相對位移。 然后把這些信息組成字符串以"名字+位移"的形式返回。
`GetFunctionName( long Address )`
通過一個地址,返回這個地址所屬的函數。
### 11.2.4 交叉引用
找出代碼和數據的交叉引用,在分析文件的執行流程時很重要,尤其是當我們分析感興趣的代碼塊的時候,盲目的查找無意義字符會讓你有一種想死的沖動,這也是為什么 IDA 依然會成為逆向工程的王者的原因。IDAPython 提供了一大堆函數用于各種交叉引用。最常 用的就是下面幾種。
`CodeRefsTo( long Address, bool Flow )`
返回一個列表,告訴我們 Address 處代碼被什么地方引用了,Flow 告訴 IDAPython 是否要 跟蹤這些代碼。
`CodeRefsFrom( long Address, bool Flow )`
返回一個列表,告訴我們 Address 地址上的代碼引用何處的代碼。
`DataRefsTo( long Address )`
返回一個列表,告訴我們 Address 處數據被什么地方引用了。常用于跟蹤全局變量。
`DataRefsFrom( long Address )`
返回一個列表,告訴我們 Address 地址上的代碼引用何處的數據。
### 11.2.5 Debugger Hooks
Debugger Hook 是 IDAPython 提供的另一個非常酷的功能,用于 Hook 住 IDA 內部的調 試器,同時處理各種調試事件。雖然 IDA 一般不用于調試任務,但是當需要動態調試的時 候,調用 IDA 內部調試器還是比外部的會方便很多。之后我們會用 debugger hooks 創建一 個代碼覆蓋率統計工具。使用 debugger hook 之前,先要睇你一個一個 hook 類然后在類里頭 定義各種不同的處理函數。
```
class DbgHook(DBG_Hooks):
# Event handler for when the process starts
def dbg_process_start(self, pid, tid, ea, name, base, size)
return
# Event handler for process exit
def dbg_process_exit(self, pid, tid, ea, code):
return
# Event handler for when a shared library gets loaded def
dbg_library_load(self, pid, tid, ea, name, base, size):
return
# Breakpoint handler
def dbg_bpt(self, tid, ea):
return
```
這個類包含了我們在創建調試腳本時,會經常用到的幾個調試事件處理函數。安裝 hook 的方式如下:
```
debugger = DbgHook()
debugger.hook()
```
現在運行調試器,hook 會捕捉所有的調試事件,這樣就能非常精確的控制 IDA 調試器。 下面的函數在調試的時候非常有用:
`AddBpt( long Address )`
在指定的地點設置軟件斷點。
`GetBptQty()`
返回當前設置的斷點數量。
`GetRegValue( string Register )`
通過寄存器名獲得寄存器值。
`SetRegValue( long Value, string Register )`
設定寄存器的值。
- 序
- 1 搭建開發環境
- 1.1 操作系統準備
- 1.2 獲取和安裝 Python2.5
- 1.3 配置 Eclipse 和 PyDev
- 2 調試器設計
- 2.1 通用 CPU 寄存器
- 2.2 棧
- 2.3 調試事件
- 2.4 斷點
- 3 自己動手寫一個 windows 調試器
- 3.2 獲得 CPU 寄存器狀態
- 3.3 實現調試事件處理
- 3.4 全能的斷點
- 4 PyDBG---純 PYTHON 調試器
- 4.1 擴展斷點處理
- 4.2 處理訪問違例
- 4.3 進程快照
- 5 IMMUNITY----最好的調試器
- 5.1 安裝 Immunity 調試器
- 5.2 Immunity Debugger 101
- 5.3 Exploit 開發
- 5.4 搞定反調試機制
- 6 HOOKING
- 6.1 用 PyDbg 實現 Soft Hooking
- 6.2 Hard Hooking
- 7 Dll 和代碼注入
- 7.1 創建遠線程
- 7.2 邪惡的代碼
- 8 FUZZING
- 8.1 Bug 的分類
- 8.2 File Fuzzer
- 8.3 改進你的 Fuzzer
- 9 SULLEY
- 9.1 安裝 Sulley
- 9.2 Sulley primitives
- 9.3 獵殺 WarFTPD
- 10 Fuzzing Windows 驅動
- 10.1 驅動通信
- 10.2 用 Immunity fuzzing 驅動
- 10.4 構建 Driver Fuzzer
- 11 IDAPYTHON --- IDA 腳本
- 11.1 安裝 IDAPython
- 11.2 IDAPython 函數
- 11.3 腳本例子
- 12 PyEmu
- 12.1 安裝 PyEmu
- 12.2 PyEmu 一覽
- 12.3 IDAPyEmu