给出的文件名为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基础教程一相关推荐

  1. Ogre3D基础教程一

    文档:教程:基础教程:基础教程一 出自Ogre3D开放资源地带 跳转到: 导航, 搜索 目录 [隐藏] 1 简介 2 从这里开始 2.1 错误排除 2.1.1 编译错误 2.1.2 运行失败 3 OG ...

  2. web前端开发基础教程一

    网页: 网站是指因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合. 网页是网站中的一页,通常是HTML格式的文件,他要通过浏览器来阅读. 网页是构成网站的基本元素,它通常由图 ...

  3. Directx11基础教程一之Directx11框架

    首先,我已经有一定的D3D11的基础,<Introduction to 3D Game Programming with Direct3D 11>,我已经具备D3D11入门水平了,我决定用 ...

  4. 嵌入式C语言基础教程一

    嵌入式系统C语言编程--背景 嵌入式系统C语言编程修炼之道--软件架构                                                                  ...

  5. 【wordpress基础教程一】:wordpress简介和安装

    一.简介        WordPress是一款免费开源的个人博客系统,但随着版本的不断更新和更多开发者的介入,wordpress已逐渐演变成一款小型的CMS系统,使用它可以制作越来越多类型的网站.目 ...

  6. ATOM基础教程一linter-php配置(12)

    linter-php简介 linter-php是自动检查php语法错误的插件,使用起来非常方便. linter-php配置 进入linter-php的配置页面,需要指定php执行文件路径: 因为ATO ...

  7. 麒麟子Javascript游戏编程零基础教程一:序言

    恭喜你,没有被课程大纲吓到,读到这一页的时候,表示你已经下定决心要开始学习了. 然而这一页你依然看不到什么实际的内容.因为这一页我们主要是聊聊人生,谈谈感情. 每一个游戏从业者,心中都有一个自己想做的 ...

  8. 小程序云开发基础教程一

    接触到云函数已经有一段时间了,之前一直在看api,现在自己跟着网络上的资料和视频学习,做了一个小项目,类似于豆瓣读书系列. 具体是这样的一个流程,后面会一步步的实现. 小程序扫码实现读取isbn,获取 ...

  9. WPF教程一:基础(转)

    WPF教程一:基础 一.WPF简介 WPF:WPF即Windows Presentation Foundation,翻译为中文"Windows呈现基础",是微软推出的基于Windo ...

最新文章

  1. 纪念小柴昌俊 | 中微子天体物理学的诞生
  2. AAAI 2021 《Regularizing Attention Networks for Anomaly Detection in Visual Question Answering》论文笔记
  3. Sring3MVC页面无刷新上传文件
  4. 幕后常驻嘉宾配音小姐姐的2021年度总结
  5. Spring Cloud Gateway 原生支持接口限流该怎么玩
  6. 创建下标为1-10的整形数组
  7. MemCached的telnet命令行参数
  8. OGNL表达式的特殊的符号
  9. 微信公众号sae服务器搭建,SAE 搭建微信公众平台
  10. python互斥锁原理_Linux 互斥锁的实现原理(pthread_mutex_t)
  11. linux mac time machine,用 Ubuntu 10.10 构建 Time Machine 备份服务器
  12. 卸载干净ssr之后出现无法上网
  13. 平面方程、夹角与点到平面的距离
  14. 关于简单的factorymode
  15. 怎样在html中写css样式,css样式应该怎么写?
  16. oracle的mins,分钟缩写是min还是mins 即min是minutes的缩
  17. glusterfs:Server-quorum和Client Quorum
  18. Java多线程案例--生产者和消费者模型(送奶人和喝奶人的故事!)
  19. [转载]以xilinx为例的低功耗设计
  20. 什么叫换位思考!(太透彻了)

热门文章

  1. 【V1.0】基于树莓派的OpenCV-Python摄像头人脸追踪系统
  2. 巧用千寻位置GNSS测绘软件| 数据文件导出技巧
  3. Tachyon架构分析和现存问题讨论
  4. WPF Binding(四种模式)
  5. 直播app源码,Python发文本/图片/附件邮件
  6. 使用GreenPlum/postgres的copy命令导出/导入数据
  7. Anaconda复制移植
  8. anaconda清理
  9. 爱尔兰圣三一大学计算机专业硕士,2021年爱尔兰都柏林圣三一大学研究生入学要求高吗?...
  10. Understanding 3D Projections(理解3D投影)