【翻译】IDAPython 官方教程|(一)IDAPython 入门指南

【翻译】IDAPython 官方教程|(一)IDAPython 入门指南
本文翻译自Getting Started | Hex-Rays Docs,该文档更新速度较快,上次更新还是在3个月之前。最新版本建议去官网查看或者连接其 MCP 进行查阅。该网站需要科学上网才能正常访问,因此不便国内学者进行研究,所以直接在博客中进行翻译。
未选择翻译分类,是因为 ZEEKLOG 中的翻译的大分类要求比较复杂,而且推流方面也很大的问题,检索不到,并且 tag 也会变得很丑,并非缺失版权意识而蓄意为之,请见谅。
本文由 Gemini 3.0 翻译,对目录结构多有整理(我觉得比官方整理得好),仅供学习交流使用,如有侵权请私联删除。

文章目录

IDAPython 入门指南

启用方式:先装好 Python <= 3.11,运行 IDA 根目录下的idapyswitch.exe 即可。

在这里插入图片描述

1. 简介

IDAPython API 为您提供了一系列功能函数,用于与反汇编器进行交互、在输出结果中导航,以及操作各种元素(如函数、指令、数据和注释)。

本指南旨在加快您学习 IDAPython 的速度,并开启您的 IDA 脚本编写之旅。我们要假设您已经熟悉了 IDA 的操作界面,并掌握了 IDA 基础知识

我们的 IDA SDK 是开源的,可以在 GitHub 上找到。

在这里插入图片描述

1.1 本指南的结构

首先,请查看 2. 基础知识,了解常用变量等核心概念;然后深入学习我们简单、简短且可重用的 3. 代码片段,其中展示了常用函数的基本示例。

1.2 在哪里可以找到完整的示例库?

当您对最常用的 IDAPython API 用法感到得心应手时,可以深入研究我们更复杂的 示例集。完整的示例库随您的 IDA 安装包一起提供,位于 python/examples 文件夹中。您也可以在 GitHub 仓库 中找到它们。

2. 基础知识

2.1 常用模块

IDAPython API 是按模块组织的,乍一看其数量可能有点让人眼花缭乱。以下是您应该首先关注的模块列表:

  • idautils:该模块提取了最有用和最方便的函数,允许您直接与反汇编结果进行交互,而无需从一开始就仔细研究整个 IDAPython API。您可以在这里找到遍历整个段(Segments)、函数(包括 IDA 发现的和用户定义的)、命名位置等的函数。
  • ida_idaapi:当您想要创建自定义插件或处理事件时,ida_idaapi 模块非常有用,因为它为您提供了访问更高级函数的权限,并允许与整个系统进行交互。
  • idc:该模块提供了最初属于原生 IDA IDC 脚本语言的函数,并将其封装以供 IDAPython API 使用。如果您已经熟悉 IDC 脚本,这将是一个很好的起点。
  • ida_funcs:该模块为您提供了在 IDA 中创建和操作函数的工具。
  • ida_kernwin:该模块提供了与 IDA 用户界面(UI)交互的功能,因此您可以创建自定义对话框等。

2.2 常用变量和常量

当您开始使用 IDAPython 时,您会意识到最常传递的变量之一是 ea,它指的是有效的内存地址(Effective Address)。另一方面,BADADDR 是一个表示无效地址的常量。它用于指示操作(例如查询函数)已失败或返回了无效结果,或者表示特定的内存位置不可用。每当您使用返回内存地址的函数时,最佳实践是检查结果是否等于 BADADDR,以确保操作成功。

3. 代码片段

在这里,您可以查看按主题分组的最常用函数,以及可用作长脚本构建块的简短代码示例。它们通常专注于执行特定操作,并且可以轻松地在更复杂的脚本中重用(您稍后可以在示例部分找到这些脚本)。

3.1 导航反汇编——地址和名称

获取当前地址
ea = idc.here()# 获取当前地址print(f"Current address: {hex(ea)}")

或者使用:

idc.get_screen_ea()
设置当前地址(跳转)
idc.jumpto(0x401000)# 跳转到地址 0x401000
获取 IDB 中的最小地址
idc.get_inf_attr(INF_MIN_EA)
获取 IDB 中的最大地址
idc.get_inf_attr(INF_MAX_EA)
列出所有指令地址
for ea in idautils.Heads():print(hex(ea))
获取与给定地址关联的名称
ida_name.get_name(0x100000da0)
获取与给定名称关联的地址
ida_name.get_name_ea(0,"_main")

3.2 读取和写入数据

读取字节(Byte)和字(Word)
byte_value = idc.get_wide_byte(0x401000)# 读取地址 0x401000 处的一个字节 word_value = idc.get_wide_word(0x401002)# 读取地址 0x401002 处的一个字(2字节) dword_value = idc.get_wide_dword(0x401004)# 读取地址 0x401004 处的一个双字(4字节)print(f"Byte: {byte_value}, Word: {word_value}, Dword: {dword_value}")
写入字节(Byte)和字(Word)
idc.patch_byte(0x401000,0x90)# 在地址 0x401000 处写入一个字节 (0x90) idc.patch_word(0x401002,0x9090)# 在地址 0x401002 处写入一个字 (0x9090) idc.patch_dword(0x401004,0x90909090)# 在地址 0x401004 处写入一个双字 (0x90909090)

3.3 注释操作

添加常规注释(不可重复)或可重复注释
idc.set_cmt(0x401000,"This is a comment",0)# 在地址 0x401000 处添加常规注释 idc.set_cmt(0x401000,"This is a repeatable comment",1)# 在地址 0x401000 处添加可重复注释
获取常规注释
comment = idc.get_cmt(0x401000,0)# 获取地址 0x401000 处的常规注释print(f"Comment: {comment}")

3.4 段(Segments)操作

获取段名称
idc.get_segm_name(ea)
获取第一个段的地址
get_first_seg()
遍历所有段并返回段名称
for seg in idautils.Segments():print(idc.get_segm_name(seg))

3.5 函数操作

创建和删除函数
idc.add_func(0x401000,0x401050)# 创建一个起始于 0x401000 并结束于 0x401050 的函数 idc.del_func(0x401000)# 删除位于 0x401000 的函数
获取函数名称
get_func_name(ea)
遍历所有函数并打印其有效地址和名称
for func_ea in idautils.Functions(): func_name = idc.get_func_name(func_ea)print(hex(func_ea), func_name)

3.6 导航交叉引用 (Xrefs)

列出指向某地址的交叉引用(XrefsTo)
for xref in idautils.XrefsTo(0x401000):print(f"Xref to 0x401000 from {hex(xref.frm)}")
列出从某地址发出的交叉引用(XrefsFrom)
for xref in idautils.XrefsFrom(0x401000):print(f"Xref from 0x401000 to {hex(xref.to)}")
遍历指向特定地址的所有交叉引用,并打印引用来源地址
for ref in idautils.XrefsTo(ea):print(hex(ref.frm))

3.7 用户界面 (UI) 操作

设置函数的背景颜色
set_color(0x401000, idc.CIC_FUNC,0x007fff)# 为起始地址 0x401000 的函数设置背景颜色
显示自定义对话框
ida_kernwin.info("This is a custom message dialog. Good luck with learning IDAPython API!")

4. 复杂脚本示例

如果您现在对 IDAPython 感觉更自如了,可以深入研究随 IDA 实例提供的更复杂、更高级的示例。您可以在安装 IDA 的 python/examples 文件夹中找到它们,或者查看我们的 文档。这些集合汇总了更高级的代码示例,通常会使用更多的模块和 API。

5. 下一步做什么?

深入学习我们的教程:如何在 IDAPython 中创建您的第一个自定义插件

更多翻译,请自行搜索我的主页,可能会更新,可能不会更新,但这篇文档不会再更新。
本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.ZEEKLOG.net/article/details/156644216。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

Read more

华为od 面试八股文_Python_06_含答案

华为od 面试八股文_Python_06_含答案

1:__slots__ 是什么?它解决什么问题?有什么坑? 回答要点: * __slots__ 可以限制实例属性集合,避免每个对象都带一个 __dict__,从而减少内存占用、提高属性访问性能(在大量小对象场景更明显)。 * 常见坑: * 加了 __slots__ 后不能随便新增属性(除非 slot 里声明了)。 * 如果类需要弱引用,要在 slots 里加 __weakref__。 * 继承时要小心:子类 slots 叠加规则、以及是否保留父类 __dict__。 2:__getattr__ vs __getattribute__ 有什么区别?什么时候会无限递归? 回答要点: * __getattribute__:所有属性访问都会先走它;你在里面写错很容易把对象变成“不可用”。 * __getattr__:只在正常查找失败(属性不存在)时才会调用,通常更安全。 * 无限递归典型原因:在 __getattribute_

By Ne0inhk
AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题

AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题

AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题 AI 的智能体专栏:手把手教你用豆包打造专属 Python 智能管家,轻松解决编程难题,本文介绍了如何利用豆包平台打造专属Python智能管家。首先简述豆包平台的核心优势,接着说明创建前的准备工作,包括注册账号、明确定位和收集训练资料。随后详细讲解创建流程,从新建智能体、基础设置、能力配置到测试优化,还提及集成代码执行环境等高级功能扩展,以及使用技巧与实际应用案例。该智能官能解决多种Python编程问题,可提升学习效率和问题解决速度,是实用的个性化编程助手。 前言     人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。无论你是刚接触 AI 的新手,还是有一定基础想提升的人,都能在这里找到合适的内容。从最基础的工具操作方法,到背后深层的技术原理,专栏都有讲解,还搭配了实例教程和实战案例。这些内容能帮助学习者一步步搭建完整的 AI 知识体系,让大家快速从入门进步到精通,

By Ne0inhk
Java 程序员快速入门 Python:常见语法对照 + 常用库映射

Java 程序员快速入门 Python:常见语法对照 + 常用库映射

目录 一、这篇文章怎么用 二、语法对照总览 三、最常用语法对照(详细) 四、函数、类、对象对照 五、常用集合与写法对照 六、常用库映射(超实用) 七、常用库对照示例 八、Java 思维迁移到 Python 的小技巧 九、常见坑(直白版) 结语 补充说明 一、这篇文章怎么用 你会 Java,这篇文章就按“Java 写法 → Python 写法 → 一句话解释”来讲,并补上常用库映射。看完就能写出一份能跑的 Python 代码。 二、语法对照总览 * for (int i=0;

By Ne0inhk
Python 包管理工具 UV 功能介绍及安装

Python 包管理工具 UV 功能介绍及安装

pip install uv 是用于安装 UV(一个高性能 Python 包管理工具)的命令。以下是详细解释: 1. UV 是什么? * UV 是由 Astral 团队开发的 Python 工具,旨在替代传统的 pip、pip-tools、virtualenv 等工具,提供更快的依赖解析和安装速度(比 pip 快 10-100 倍)。 * 它集成了包管理、虚拟环境管理、依赖锁定等功能,兼容 pip 的命令和 requirements.txt 文件。 2. 命令作用 * pip install uv 通过 Python 的包管理器 pip 安装 UV

By Ne0inhk