我使用英特尔的Pin工具来做一些二进制检测,并想知道是否有API来获取给定地址的指令字节代码。
类似的东西:
instruction = getInstructionatAddr(addr);
其中addr是所需的地址。
我知道Pin给出的函数Instruction(在许多简单/手动示例中使用)获取指令,但我需要知道其他地址的指令。我无法使用网络。任何帮助将不胜感激!
CHEERS
答案 0 :(得分:3)
想知道是否有API来获取给定的指令字节代码 地址
是的,它有可能但是有点人为的方式:使用PIN你通常对执行的内容感兴趣(或通过执行的指令操作),所以代码/数据流之外的一切都没有任何意义用于PIN。
PIN正在使用(因此附带)Intel XED,它是指令编码器/解码器。
在您的PIN安装中,您应该拥有包含两个子目录的\extra
文件夹:xed-ia32
和xed-intel64
(选择适合您的体系结构的子目录)。 XED的主要包含文件是xed-interface.h
,位于上述目录的\include
文件夹中。
在你的Pintool中,给定 pintooled 程序虚拟空间中的任何地址,使用PIN_SafeCopy
函数读取程序存储器(以及给定地址的字节) )。 PIN_SafeCopy
的优点在于,即使它无法读取内存,它也能够慷慨地失败,并且可以读取"阴影"记忆的一部分。
使用XED为您解码指令字节。
有关如何使用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可以将内存内容从目标进程的地址空间复制到一个指定的缓冲区。