## 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