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
上图中右边用于输入脚本代码,下方是切换IDA和IDAPython,我们需要切换为IDAPython,如下所示
然后输入打印hello的代码,点击run此时在IDA界面最下方就可以看到打印的消息了
当然这个窗口我们使可以所以移动、放大缩小的
为了后面分析方便,我们都排布成这个格式
第二种运行IDAPython的办法就是直接在输出窗口处输入,如下所示
输入后敲击回车即可运行
在接下来的实验过程中,我们会不时地交替使用这两种方式
接下来将rabbithole载入到IDAPro
将光标定位到check_value函数,然后开始进行我们的学习
在深入探索之前,我们需要知道,在使用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)
点击run之后运行结果如图
在上面的代码中idautils.Segments()返回一个可迭代的对象数组,包含的元素是每个段的起始地址。通过这个起始地址我们可以获取段的名称(idc.SegName(ea)),段的起始地址idc.SegStart(ea),段的结束地址(idc.SegEnd(ea).
如果想获取当前地址所在段的下一个段的起始地址可以使用idc.NextSeg(ea)
我们已经知道如何遍历所有段了,那么如何遍历所有段中的所有函数呢?先来看看代码:
运行结果如下
来解释下代码:
Idautils.Functions()会返回一个保存着一直函数首地址的数组,idautils.Functions()也可以指定要查找的函数的起始地址和结束地址,格式为idautils.Funcitons(start_addr,end_addr).通过idc.GetFunctionName(ea)可以通过某个地址获取函数的名称。Ea这个参数可以是处于任何函数中的地址。
刚才提到函数的起始和结束地址(即函数的边界地址),我们可以通过idaapi.get_func(ea)来获取到
结果如下
Idaapi.getfunc(ea)返回一个idaapi.func_t的类给我们,在不清楚这个类能够干什么时,可以使用dir(class)函数来获取这个类的属性看看有哪些可以使用
从输出中我们可以看到startEA,endEA是用于获取起始地址和结束地址的。上面的这些属性只适用于当前的函数。
我们可以使用idc.NextFunciton(ea)和idc.PrevFunction(ea)来获取当前函数的前一个或后一个函数。ea的值需要在被分析的函数地址之内。
结果如下
IDAPython基础教程一相关推荐
- Ogre3D基础教程一
文档:教程:基础教程:基础教程一 出自Ogre3D开放资源地带 跳转到: 导航, 搜索 目录 [隐藏] 1 简介 2 从这里开始 2.1 错误排除 2.1.1 编译错误 2.1.2 运行失败 3 OG ...
- web前端开发基础教程一
网页: 网站是指因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合. 网页是网站中的一页,通常是HTML格式的文件,他要通过浏览器来阅读. 网页是构成网站的基本元素,它通常由图 ...
- Directx11基础教程一之Directx11框架
首先,我已经有一定的D3D11的基础,<Introduction to 3D Game Programming with Direct3D 11>,我已经具备D3D11入门水平了,我决定用 ...
- 嵌入式C语言基础教程一
嵌入式系统C语言编程--背景 嵌入式系统C语言编程修炼之道--软件架构 ...
- 【wordpress基础教程一】:wordpress简介和安装
一.简介 WordPress是一款免费开源的个人博客系统,但随着版本的不断更新和更多开发者的介入,wordpress已逐渐演变成一款小型的CMS系统,使用它可以制作越来越多类型的网站.目 ...
- ATOM基础教程一linter-php配置(12)
linter-php简介 linter-php是自动检查php语法错误的插件,使用起来非常方便. linter-php配置 进入linter-php的配置页面,需要指定php执行文件路径: 因为ATO ...
- 麒麟子Javascript游戏编程零基础教程一:序言
恭喜你,没有被课程大纲吓到,读到这一页的时候,表示你已经下定决心要开始学习了. 然而这一页你依然看不到什么实际的内容.因为这一页我们主要是聊聊人生,谈谈感情. 每一个游戏从业者,心中都有一个自己想做的 ...
- 小程序云开发基础教程一
接触到云函数已经有一段时间了,之前一直在看api,现在自己跟着网络上的资料和视频学习,做了一个小项目,类似于豆瓣读书系列. 具体是这样的一个流程,后面会一步步的实现. 小程序扫码实现读取isbn,获取 ...
- WPF教程一:基础(转)
WPF教程一:基础 一.WPF简介 WPF:WPF即Windows Presentation Foundation,翻译为中文"Windows呈现基础",是微软推出的基于Windo ...
最新文章
- 纪念小柴昌俊 | 中微子天体物理学的诞生
- AAAI 2021 《Regularizing Attention Networks for Anomaly Detection in Visual Question Answering》论文笔记
- Sring3MVC页面无刷新上传文件
- 幕后常驻嘉宾配音小姐姐的2021年度总结
- Spring Cloud Gateway 原生支持接口限流该怎么玩
- 创建下标为1-10的整形数组
- MemCached的telnet命令行参数
- OGNL表达式的特殊的符号
- 微信公众号sae服务器搭建,SAE 搭建微信公众平台
- python互斥锁原理_Linux 互斥锁的实现原理(pthread_mutex_t)
- linux mac time machine,用 Ubuntu 10.10 构建 Time Machine 备份服务器
- 卸载干净ssr之后出现无法上网
- 平面方程、夹角与点到平面的距离
- 关于简单的factorymode
- 怎样在html中写css样式,css样式应该怎么写?
- oracle的mins,分钟缩写是min还是mins 即min是minutes的缩
- glusterfs:Server-quorum和Client Quorum
- Java多线程案例--生产者和消费者模型(送奶人和喝奶人的故事!)
- [转载]以xilinx为例的低功耗设计
- 什么叫换位思考!(太透彻了)
热门文章
- 【V1.0】基于树莓派的OpenCV-Python摄像头人脸追踪系统
- 巧用千寻位置GNSS测绘软件| 数据文件导出技巧
- Tachyon架构分析和现存问题讨论
- WPF Binding(四种模式)
- 直播app源码,Python发文本/图片/附件邮件
- 使用GreenPlum/postgres的copy命令导出/导入数据
- Anaconda复制移植
- anaconda清理
- 爱尔兰圣三一大学计算机专业硕士,2021年爱尔兰都柏林圣三一大学研究生入学要求高吗?...
- Understanding 3D Projections(理解3D投影)