Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 英特尔引脚修改指令地址_X86_Instrumentation_Intel Pin - Fatal编程技术网

X86 英特尔引脚修改指令地址

X86 英特尔引脚修改指令地址,x86,instrumentation,intel-pin,X86,Instrumentation,Intel Pin,我正在尝试使用英特尔Pin工具工具对可执行二进制文件进行指令分析 在分析Pin工具中执行的指令时,我发现接收到的指令地址(程序计数器)值范围与使用objdump-d-S分析编译代码反汇编时观察到的非常不同。我正在标准的Linux/bin/ls可执行二进制文件上测试它 根据我的理解,Pin修改了原始二进制文件,以放置自己的“钩子”来收集与执行相关的信息,这些信息在我们所需的Pin工具中调用回调进行分析。因此,这自然会导致实际执行的二进制文件与原始文件不同。不幸的是,我不知道其他关于Pin的秘密 我

我正在尝试使用英特尔Pin工具工具对可执行二进制文件进行指令分析

在分析Pin工具中执行的指令时,我发现接收到的指令地址(程序计数器)值范围与使用
objdump-d-S
分析编译代码反汇编时观察到的非常不同。我正在标准的Linux
/bin/ls
可执行二进制文件上测试它

根据我的理解,Pin修改了原始二进制文件,以放置自己的“钩子”来收集与执行相关的信息,这些信息在我们所需的Pin工具中调用回调进行分析。因此,这自然会导致实际执行的二进制文件与原始文件不同。不幸的是,我不知道其他关于Pin的秘密


我想知道是否有办法保留原始代码布局,或者在旧的二进制和新的二进制指令地址之间获得一些对应关系?

现代发行版使用PIE可执行文件,这些文件是在运行时重新定位的ELF共享对象
objdump
仅显示相对于映像库的地址。及

您可以像GDB一样禁用ASLR,使其始终重新定位到相同的位置,如
0x55555…
,但它仍然与
objdump
地址不匹配

我认为可以使用
objdump--adjust vma=offset
重新定位反汇编


或者您可以使用
gcc-no-PIE-fno-PIE-O3构建非PIE可执行文件,以便objdump知道每条指令的实时运行地址。

现代发行版使用的PIE可执行文件是在运行时重新定位的ELF共享对象
objdump
仅显示相对于映像库的地址。及

您可以像GDB一样禁用ASLR,使其始终重新定位到相同的位置,如
0x55555…
,但它仍然与
objdump
地址不匹配

我认为可以使用
objdump--adjust vma=offset
重新定位反汇编


或者您可以使用
gcc-no-PIE-fno-PIE-O3构建非PIE可执行文件,这样objdump将知道每条指令的实时运行地址。

如果我理解正确,问题在于二进制图像的放置(请注意,
Pin
分析说明确实没有如此积极地改变程序的用户可见行为。主要影响是性能和缓存等方面)。例如,您的
glibc
图像被放置在与程序在
Pin
中运行时的地址不同的地址。如果是这种情况,首先,您应该添加一个图像回调,如下所示:

...
VOID callbackFn(IMG img, VOID *v)
{...}
...
int main(int argc, char *argv[])
{
   ...
   IMG_AddInstrumentFunction(callbackFn, 0);
   ...
}
...
回调函数(即,
callbackFn()
)在每次图像加载时都会被调用。在回调函数体中,您可以使用
IMG\u LowAddress(IMG)
在运行时获取每个图像的加载地址。还有
IMG\u Name(IMG)
IMG\u IsMainExecutable(IMG)等函数
这可能会有帮助。现在,您知道了二进制图像的起始地址,即
B

您希望在运行时在映像中查找函数
foo()
的地址。假设,
objdump
表示它位于二进制映像开头的地址
a
。要查找
foo()
的运行时地址,只需将
a
添加到
B
。换句话说,
foo()
在运行时位于
A+B


注意:在解析图像名称时,请注意符号链接。您可以使用来解决此问题。

如果我理解正确,问题在于二进制图像的放置(请注意,
Pin
分析说明确实没有如此积极地改变程序的用户可见行为。主要影响是性能和缓存等方面)。例如,您的
glibc
图像被放置在与程序在
Pin
中运行时的地址不同的地址。如果是这种情况,首先,您应该添加一个图像回调,如下所示:

...
VOID callbackFn(IMG img, VOID *v)
{...}
...
int main(int argc, char *argv[])
{
   ...
   IMG_AddInstrumentFunction(callbackFn, 0);
   ...
}
...
回调函数(即,
callbackFn()
)在每次图像加载时都会被调用。在回调函数体中,您可以使用
IMG\u LowAddress(IMG)
在运行时获取每个图像的加载地址。还有
IMG\u Name(IMG)
IMG\u IsMainExecutable(IMG)等函数
这可能会有帮助。现在,您知道了二进制图像的起始地址,即
B

您希望在运行时在映像中查找函数
foo()
的地址。假设,
objdump
表示它位于二进制映像开头的地址
a
。要查找
foo()
的运行时地址,只需将
a
添加到
B
。换句话说,
foo()
在运行时位于
A+B

注意:在解析图像名称时,要小心符号链接。你可以用它来解决这个问题