1

我正在使用 Intel 的 Pin Tool 进行一些二进制检测,并且想知道是否有 API 可以在给定地址获取指令字节码。

就像是:

instruction = getInstructionatAddr(addr);

其中 addr 是所需的地址。

我知道 Pin 给出的功能指令(在许多简单/手动示例中使用)获取指令,但我需要知道其他地址的指令。我仔细阅读了网络,但无济于事。任何帮助,将不胜感激!

干杯

4

2 回答 2

3

想知道是否有 API 可以在给定地址获取指令字节码

是的,这是可能的,但以一种有点做作的方式:使用 PIN,您通常对执行的内容(或通过执行的指令进行操作)感兴趣,因此代码/数据流之外的所有内容对 PIN 没有任何兴趣。

PIN 正在使用(因此附带)英特尔 XED,它是一种指令编码器/解码器。

在您的 PIN 安装中,您应该拥有一个\extra包含两个子目录的文件夹:xed-ia32xed-intel64(选择适合您架构的一个)。XED 的主要包含文件xed-interface.h位于\include上述目录的文件夹中。

  1. 在您的 Pintool 中,给定您的pintooled程序的虚拟空间中的任何地址,使用该PIN_SafeCopy函数读取程序内存(以及给定地址处的字节)。的优点PIN_SafeCopy是即使它无法读取内存也会优雅地失败,并且可以读取内存的“阴影”部分。

  2. 使用 XED 为您解码指令字节。

有关如何使用 XED 解码指令的示例,请参见第一个示例程序

由于小示例使用了硬编码缓冲区(即itext在示例程序中),请将这个硬编码缓冲区替换为您在PIN_SafeCopy.

显然,您应该确保您正在阅读的内存确实包含代码。

AFAIK,不可能INS从任意地址获取类型(描述 PIN 指令的常用类型),因为只有代码流中的地址才会“生成”INS类型。

作为旁注:

我知道 Pin 给出的功能指令(在许多简单/手动示例中使用)获取指令

许多 PIN 示例中使用的Instruction例程称为“仪表例程”:其名称本身并不相关。

于 2015-05-30T11:31:58.770 回答
0

Pin_SafeCopy可以帮助你。此 API 可以将内存内容从目标进程的地址空间复制到一个指定的缓冲区。

于 2017-09-18T14:54:37.620 回答