英特尔固定工具:从地址获取指令

时间:2015-05-26 04:00:42

标签: binaryfiles instrumentation intel-pin

我使用英特尔的Pin工具来做一些二进制检测,并想知道是否有API来获取给定地址的指令字节代码。

类似的东西:

instruction = getInstructionatAddr(addr);

其中addr是所需的地址。

我知道Pin给出的函数Instruction(在许多简单/手动示例中使用)获取指令,但我需要知道其他地址的指令。我无法使用网络。任何帮助将不胜感激!

CHEERS

2 个答案:

答案 0 :(得分:3)

  

想知道是否有API来获取给定的指令字节代码   地址

是的,它有可能但是有点人为的方式:使用PIN你通常对执行的内容感兴趣(或通过执行的指令操作),所以代码/数据流之外的一切都没有任何意义用于PIN。

PIN正在使用(因此附带)Intel XED,它是指令编码器/解码器。

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

  1. 在你的Pintool中,给定 pintooled 程序虚拟空间中的任何地址,使用PIN_SafeCopy函数读取程序存储器(以及给定地址的字节) )。 PIN_SafeCopy的优点在于,即使它无法读取内存,它也能够慷慨地失败,并且可以读取"阴影"记忆的一部分。

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

  3. 有关如何使用XED解码指令的示例,请参阅first example program

    由于小示例使用硬编码缓冲区(即示例程序中的itext),请将此硬编码缓冲区替换为PIN_SafeCopy中使用的目标缓冲区。

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

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

    作为旁注:

      

    我知道函数指令(用于许多简单/手册)   由Pin给出的示例获取指令

    许多PIN示例中使用的Instruction例程称为"工具例程":其名称本身并不相关。

答案 1 :(得分:0)

{ "name": "my project name", "version": "1.0.0", "lockfileVersion": 1, "dependencies": { "js-beautify": { "version": "1.6.14", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.6.14.tgz", "integrity": "sha1-07j3Mi0CuSd9WL0jgmTDJ+WARM0=", "dev": true } } }可能会对您有所帮助。此API可以将内存内容从目标进程的地址空间复制到一个指定的缓冲区。