【翻译】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

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学 * 引言:块——HDFS存储的核心抽象 * 一、HDFS默认块大小 * 1.1 版本演进与默认值 * 1.2 查看和验证块大小 * 1.3 配置文件中的设置 * 二、为什么HDFS采用块存储? * 2.1 核心设计思想 * 2.2 详细解析:为什么块存储如此重要? * **2.2.1 减少寻址开销,提升I/O效率** * **2.2.2 支持超大文件,超越单机限制** * **2.2.3 简化存储设计,降低元数据复杂度** * **2.2.4 便于数据复制,增强容错性** * **2.2.5 支持数据本地性,

By Ne0inhk
21届智能车雁过留痕备战指南|龙邱科技STC+神眼摄像头处理 高效搜线算法思路分享

21届智能车雁过留痕备战指南|龙邱科技STC+神眼摄像头处理 高效搜线算法思路分享

今年STC单片机首次增设摄像头组别,相信不少备战的同学想要知道这颗新U是否能够快速上手并能够像传统摄像头组别一样,高效完成图像处理,提高车模控制系统上限。 其中最突出的痛点的是:有同学搭建完核心算法组合后,可能感觉到略微卡顿或系统延迟,影响车模调试上限,我们第一次搭建完经过测试单帧处理耗时高达20多ms,这导致车辆运行稳定性和反应速度受限、甚至可能有冲出赛道的情况发生,导致调试陷入瓶颈,提速困难,短时间内难以找到有效突破方向。 针对这一高频痛点,我们结合备战同学的实际调试场景,经过反复测试、迭代优化,整理出一套实用性极强的帧率优化思路,实测验证有效,优化后单帧处理耗时可稳定降至9-11ms,彻底解决卡顿难题,这里将图像处理和以西优化思路分享给大家,希望能够帮助到更多的同学! 实测数据对比,直观呈现优化效果 图像处理方案单帧采集+处理耗时未优化(采集+处理)20ms-25ms(能感觉到慢,上限较低)优化后(采集+处理)9ms-11ms(流畅稳定,提高了上限) 同学们遇到的卡顿问题,核心症结主要集中在两点:一是内存资源不足,二是算法计算耗时过长。在拆解具体优化方法前,我

By Ne0inhk
【图论 DFS 换根法】3772. 子图的最大得分|2235

【图论 DFS 换根法】3772. 子图的最大得分|2235

本文涉及知识点 C++图论 换根法 LeetCode3772. 子图的最大得分 给你一个 无向树 ,它包含 n 个节点,编号从 0 到 n - 1。树由一个长度为 n - 1 的二维整数数组 edges 描述,其中 edges[i] = [ai, bi] 表示在节点 ai 和节点 bi 之间有一条边。 另给你一个长度为 n 的整数数组 good,其中 good[i] 为 1 表示第 i 个节点是好节点,为 0 表示它是坏节点。 定义

By Ne0inhk
Python 3.12安装库报错

Python 3.12安装库报错

报错如下: AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'? 这是因为 Python 3.12 移除了对 pkgutil.ImpImporter 的支持,而某些库(例如 setuptools 或 numpy 的旧版本)依赖于旧的导入机制。 解决方案 1. 降级到兼容的 Python 版本 numpy 和一些旧的依赖库在 Python 3.12 下出现兼容性问题,建议使用 Python 3.11。 具体步骤: 重新安装项目依赖:

By Ne0inhk