没有合适的资源?快使用搜索试试~ 我知道了~
首页IDAPython 初学者指南
资源详情
资源评论
资源推荐
IDAPython 初学者指南
作者:Alexander Hanel
翻译:foyjog
目录
IDAPython 初学者指南 .............................................................................................................................1
1. 介绍 ..............................................................................................................................................3
2. 目标读者和免责声明 ..............................................................................................................3
3. 代码习惯 .....................................................................................................................................3
4. IDAPython 背景 ........................................................................................................................4
5. 基本操作 .....................................................................................................................................4
6. 段 ...................................................................................................................................................5
7. 函数 ..............................................................................................................................................6
8. 指令 ........................................................................................................................................... 11
9. 操作数 ....................................................................................................................................... 12
10. 交叉引用(Xrefs) .......................................................................................................... 18
11. 搜索 ....................................................................................................................................... 22
12. 数据选取 ............................................................................................................................. 27
13. 注释和重命名 .................................................................................................................... 28
14. 访问原始数据 .................................................................................................................... 33
15. 补丁 ....................................................................................................................................... 35
16. 输入和输出 ......................................................................................................................... 36
17. 因特尔 Pin 记录工具 ....................................................................................................... 38
18. 批生成文件 ......................................................................................................................... 41
19. 可执行脚本 ......................................................................................................................... 42
20. 结束语 .................................................................................................................................. 43
1. 介绍
大家好,这是一本关于 IDAPython 的书籍。
我写这本书的本意其实是为了给自己做参考,在我想用 IDAPython 的时候能够随时找
到一些关于 IDAPython 的功能的样例。自从我写完了这本书,我经常使用它帮助我来理解
IDAPython 的语法或者寻找一些样例中的代码。如果你关注我的博客的话,你也许会注意到
一些非常相似的功能脚本,这些功能脚本都是我在网上记录的大二实验的结果。
这些年来我收到了大量的关于询问学习 IDAPython 的最好办法的信件,而通常情况下
我都会让他们去读 Ero Carrera’s 的“Introduction to IDAPython”或者让他们去学习 IDAPython
的公开仓库中的脚本样例。这两种方法都是学习 IDAPython 的好方法,但是有一点,这两种
方法中都不包括我平常在编写脚本时所遇到的问题。所以,我打算自己写一本包含我所遇到
问题的书籍,我相信这本书会给想要学习 IDAPython 的人或者说想要希望快速参考一些例
子和片段的人一些帮助。作为一本电子书,我会定期的更新它。
2. 目标读者和免责声明
这本书不适合逆向工程的新手阅读,也不适合当一本 IDA 的启蒙书阅读。如果你对 IDA
很陌生,那么我推荐你去买一本 Chris Eagles 的”The IDA PRO Book“来读一读,绝对的物超
所值。
想要买这本书的读者需要以下几个条件:1.能够轻松的阅读汇编代码。2.有逆向工程的
经验。3.熟悉 IDA 的基本操作。如果你有时会冒出一个想法:我怎么利用 IDAPython 来自动
化这个工作呢?那么这本书就很适合你了。如果你已经能够自己编写一些 IDAPython 的脚
本,那么这本书也不适合你。说句实在话,这是一本面向 IDAPython 新手的书籍,它是一个
常用的 IDAPython 的功能脚本的参考。
还有一点要说明,我的研究方向是恶意软件的逆向工程。本书不包括静态分析中使用的
基本块或其他学术概念等编译器概念,因为在我进行恶意软件的逆向分析的时候,我很少使
用这些概念。有可能我已经使用了这些概念混淆了代码,但是出现的频率应该不高,我感觉
这对初学者还是有帮助的。相信读完这本书以后,读者可以自己深入研究 IDAPython 文档。
最后声明一点,书中将不包含 IDA 调试器的函数功能。
3. 代码习惯
书中的例子将使用 IDA 的输出窗口(命令行接口)作为输出。为了简洁一些,在一些例
子中将不会把当前的地址作为一个变量来对待,通常它会表示为 ea = here()。书中所有的代
码都可以被复制粘贴到 IDA 的命令行或者 IDA 的脚本窗口(快捷键为 shift+f2)中执行。当
然你得好好读这本书才能行的说。我不会把所有的代码都一行行的解释的,太费时间了。一
千个程序员就有一千种代码写法。在 IDAPython 中有人会写 idc.SegName(ea),有人会写
SegName(ea)。本书的话使用第一种写法,因为我发现这种写法更好阅读和调试。但有时候
这种写法会报如下的错误:
-----------------------------------------------
Python>DataRefsTo(here())
<generator object refs at 0x05247828>
Python>idautils.DataRefsTo(here())
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'idautils' is not defined
Python>import idautils # manual importing of module
Python>idautils.DataRefsTo(here())
<generator object refs at 0x06A398C8>
-----------------------------------------------
如果报错,只要像上面那样手动引入 idautils 就可以了。
4. IDAPython 背景
IDAPython 出现于 2004 年,它是 Gergely Erdelyi 和 Ero Carrera 共同努力的成果。他们
的目标在于打造一个既拥有 Python 的强大特性又拥有 IDC 的强大的自动化分析功能的脚本
语言。IDAPython 由三个分离的模块组成,他们分别是 idc,idautils 和 idaapi。idc(注意大
小写,不是 IDA 中的 IDC)是一个封装了 IDA 的 IDC 的兼容性模块,idautils 是 IDA 的高级
实用功能模块,idaapi 允许了我们访问更加底层的数据。
5. 基本操作
在深入探索之前我们应该定义一些关键字段,顺便还要复习一下 IDA 的反汇编输出的
结构,下面是个 IDA 反汇编的例子:
---------------------------------------------
.text:00012529 mov esi, [esp+4+arg_0]
---------------------------------------------
.text 的意思是 section 的名称,它的地址是 0x00012529,为十六进制显示。mov 是啥
咱就不说了,操作数为 esi,esp+4+arg0 咱也就不讲了。在使用 IDA 的函数中最常见被传递
的变量是地址。在 IDAPython 的文档中地址被记作 ea。获取当前地址有几种不同的方式,
最常见的方式就是利用 idc.ScreenEA()函数或者 here()函数。它将返回一个 Interger 值。如果
你想要获取当前 IDB 中的最小地址和最大地址的话就可以使用 MinEA()和 MaxEA()这两个函
数。
---------------------------------------------
Python>ea = idc.ScreenEA()
Python>print "0x%x %s" % (ea, ea)
0x12529 75049
Python>ea = here()
Python>print "0x%x %s" % (ea, ea)
0x12529 75049
Python>hex(MinEA())
0x401000
Python>hex(MaxEA())
0x437000
---------------------------------------------
在 IDA 的反汇编窗口中,每一个能够被描述的元素我们都可以使用 IDAPython 来获取。
下面的例子展示了如何获取这些元素。记住下面的代码要和上面的代码连起来读哦。
---------------------------------------------
Python>idc.SegName(ea) # get text
.text
Python>idc.GetDisasm(ea) # get disassembly
mov esi, [esp+4+arg_0]
Python>idc.GetMnem(ea) # get mnemonic
mov
Python>idc.GetOpnd(ea,0) # get first operand
esi
Python>idc.GetOpnd(ea,1) # get second operand
[esp+4+arg_0]
----------------------------------------------
上述代码中,我们利用了 idc.SegName(ea)来获取当前地址所在的段(segment)名称,
还利用了 idc.GetDisasm(ea)来获取当前地址的反汇编语句,同时我们利用了 idc.GetMnem(ea)
来获取当前反汇编语句的操作符(mov),利用了 idc.GetOpnd(ea,long n)来获取每个操作数
(esi 和[esp+4+arg_0])。
有些时候我们必须确认一个地址是否在当前的程序中存在,那么我们可以使用
idaapi.BADADDR 或者 BADADDR 来确认该地址。
----------------------------------------------------
Python>idaapi.BADADDR
4294967295
Python>hex(idaapi.BADADDR)
0xffffffffL
Python>if BADADDR != here(): print "valid address"
valid address
----------------------------------------------------
6. 段
打印一行数据好像并没什么卵用,但是 IDAPython 的强大之处在于它能遍历所有的指
令,所有的交叉引用地址,还有搜索所有的代码和数据。后面两项功能稍后再做介绍。我们
先从遍历所有段的指令开始讲起。
----------------------------------------------------
Python>for seg in idautils.Segments():
print idc.SegName(seg), idc.SegStart(seg), idc.SegEnd(seg)
HEADER 65536 66208
.idata 66208 66636
.text 66636 212000
.data 212000 217088
.edata 217088 217184
剩余42页未读,继续阅读
绝不原创的飞龙
- 粉丝: 1w+
- 资源: 1091
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0