我正在使用 Intel 的 Pin Tool 进行一些二进制检测,并且想知道是否有 API 可以在给定地址获取指令字节码。
就像是:
instruction = getInstructionatAddr(addr);
其中 addr 是所需的地址。
我知道 Pin 给出的功能指令(在许多简单/手动示例中使用)获取指令,但我需要知道其他地址的指令。我仔细阅读了网络,但无济于事。任何帮助,将不胜感激!
干杯
我正在使用 Intel 的 Pin Tool 进行一些二进制检测,并且想知道是否有 API 可以在给定地址获取指令字节码。
就像是:
instruction = getInstructionatAddr(addr);
其中 addr 是所需的地址。
我知道 Pin 给出的功能指令(在许多简单/手动示例中使用)获取指令,但我需要知道其他地址的指令。我仔细阅读了网络,但无济于事。任何帮助,将不胜感激!
干杯
想知道是否有 API 可以在给定地址获取指令字节码
是的,这是可能的,但以一种有点做作的方式:使用 PIN,您通常对执行的内容(或通过执行的指令进行操作)感兴趣,因此代码/数据流之外的所有内容对 PIN 没有任何兴趣。
PIN 正在使用(因此附带)英特尔 XED,它是一种指令编码器/解码器。
在您的 PIN 安装中,您应该拥有一个\extra
包含两个子目录的文件夹:xed-ia32
和xed-intel64
(选择适合您架构的一个)。XED 的主要包含文件xed-interface.h
位于\include
上述目录的文件夹中。
在您的 Pintool 中,给定您的pintooled程序的虚拟空间中的任何地址,使用该PIN_SafeCopy
函数读取程序内存(以及给定地址处的字节)。的优点PIN_SafeCopy
是即使它无法读取内存也会优雅地失败,并且可以读取内存的“阴影”部分。
使用 XED 为您解码指令字节。
有关如何使用 XED 解码指令的示例,请参见第一个示例程序。
由于小示例使用了硬编码缓冲区(即itext
在示例程序中),请将这个硬编码缓冲区替换为您在PIN_SafeCopy
.
显然,您应该确保您正在阅读的内存确实包含代码。
AFAIK,不可能INS
从任意地址获取类型(描述 PIN 指令的常用类型),因为只有代码流中的地址才会“生成”INS
类型。
作为旁注:
我知道 Pin 给出的功能指令(在许多简单/手动示例中使用)获取指令
许多 PIN 示例中使用的Instruction
例程称为“仪表例程”:其名称本身并不相关。
Pin_SafeCopy
可以帮助你。此 API 可以将内存内容从目标进程的地址空间复制到一个指定的缓冲区。