IDAPython基础教程一

给出的文件名为rabbithole
在这里插入图片描述
首先使用file命令查看一下
在这里插入图片描述
可以看到是64位的可执行文件
接下来我们切换到win,使用IDApro载入,以此文件为样例,学习IDAPython的用法。
首先介绍下IDAPython的背景。
IDAPython创建于2004年。这是GergelyErdelyi和Ero Carrera的共同努力。他们的目标是结合强大的python与自动化分析的IDA的类C脚本语言IDC。IDAPython由三个独立模块组成。第一个是idc,它是封装IDA的IDC函数的兼容性模块。第二个模块是idautils,这是IDA里的一个高级实用功能模块。第三个模块是idaapi,它允许访问更加底层的数据。
那么怎么使用呢?
直接在IDA里调用的话有两种办法:
第一种:
在IDA上方的菜单File->script command
IDAPython基础教程一_第1张图片上图中右边用于输入脚本代码,下方是切换IDA和IDAPython,我们需要切换为IDAPython,如下所示
IDAPython基础教程一_第2张图片然后输入打印hello的代码,点击run此时在IDA界面最下方就可以看到打印的消息了
IDAPython基础教程一_第3张图片当然这个窗口我们使可以所以移动、放大缩小的
为了后面分析方便,我们都排布成这个格式
IDAPython基础教程一_第4张图片第二种运行IDAPython的办法就是直接在输出窗口处输入,如下所示
IDAPython基础教程一_第5张图片输入后敲击回车即可运行
在接下来的实验过程中,我们会不时地交替使用这两种方式
接下来将rabbithole载入到IDAPro
将光标定位到check_value函数,然后开始进行我们的学习
IDAPython基础教程一_第6张图片在深入探索之前,我们需要知道,在使用IDA的函数中最常见被传递的变量是地址。比如这条反汇编的例子

在这里插入图片描述.text是section的名称,其地址是0x00012529,为16进制的格式,后面是其指令。在IDAPython的文档中,地址被记作ea。

获取当前地址有几种不同的方式。最常见的方式是使用idc.ScreenEA()函数或者here()函数,这将返回一个Interger值,如下所示。
在这里插入图片描述在这里插入图片描述如果想获取当前IDB中的最小地址和最大地址可以分别使用MinEA()和MaxEA()
在这里插入图片描述在IDA的反汇编窗口中,每一个能够被描述的元素我们都能使用IDAPython来获取,比如以下的例子
在这里插入图片描述在上图中我们使用idc.SegName(ea)获取当前地址所在的段(segment)名称,利用idc.GetDisasm(ea)来获取当前地址的反汇编语句,利用idc.GetMnem(ea)获取当前反汇编语句的操作符,利用idc.GetOpnd获取操作数,由于定位在check_value,所以打印的是check_value

有时候如果要确认一个地址是否在当前的程序中,可以使用idaapi.BADADDR或者BADADDR来确认该地址
在这里插入图片描述如上图我们首先打印出不存在的地址,然后将其与当前地址比较,如果不等则输出valid addr

打印一行数据好像用途不大,可是别忘了IDAPython结合了python,我们可以用其遍历所有的指令,所有的交叉引用地址,还能搜索所有的代码和数据。我们以遍历所有端的指令为例。
代码如下

import idautils
for seg in idautils.Segments():
print idc.SegName(seg),idc.SegStart(seg),idc.SegEnd(seg)

IDAPython基础教程一_第7张图片点击run之后运行结果如图
IDAPython基础教程一_第8张图片在上面的代码中idautils.Segments()返回一个可迭代的对象数组,包含的元素是每个段的起始地址。通过这个起始地址我们可以获取段的名称(idc.SegName(ea)),段的起始地址idc.SegStart(ea),段的结束地址(idc.SegEnd(ea).

如果想获取当前地址所在段的下一个段的起始地址可以使用idc.NextSeg(ea)
在这里插入图片描述我们已经知道如何遍历所有段了,那么如何遍历所有段中的所有函数呢?先来看看代码:
IDAPython基础教程一_第9张图片运行结果如下

IDAPython基础教程一_第10张图片来解释下代码:
Idautils.Functions()会返回一个保存着一直函数首地址的数组,idautils.Functions()也可以指定要查找的函数的起始地址和结束地址,格式为idautils.Funcitons(start_addr,end_addr).通过idc.GetFunctionName(ea)可以通过某个地址获取函数的名称。Ea这个参数可以是处于任何函数中的地址。

刚才提到函数的起始和结束地址(即函数的边界地址),我们可以通过idaapi.get_func(ea)来获取到
IDAPython基础教程一_第11张图片结果如下
在这里插入图片描述Idaapi.getfunc(ea)返回一个idaapi.func_t的类给我们,在不清楚这个类能够干什么时,可以使用dir(class)函数来获取这个类的属性看看有哪些可以使用
在这里插入图片描述从输出中我们可以看到startEA,endEA是用于获取起始地址和结束地址的。上面的这些属性只适用于当前的函数。

我们可以使用idc.NextFunciton(ea)和idc.PrevFunction(ea)来获取当前函数的前一个或后一个函数。ea的值需要在被分析的函数地址之内。
IDAPython基础教程一_第12张图片结果如下
在这里插入图片描述

你可能感兴趣的:(IDAPython基础教程一)