问题标签 [intel-pin]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1068 浏览

linux - 固定工具中缺少共享对象

当我编译我的 pin 工具并ldd在 pin 工具共享对象上运行时,共享对象 libxed.so、libpin3dwarf.so、libdl-dynamic.so、libstlport-dynamic.so 和 libc-dynamic.so 都找不到。我认为它可能是 makefile.rules 文件,因为我对其进行了修改以链接其他一些目标文件,但即使在编译 pin 目录中提供的示例 pin 工具时,也会出现同样的问题。有谁知道问题可能是什么?

0 投票
1 回答
627 浏览

exe - 通过 Intel PinTool 在发生异常后(在 .exe 文件中)获取异常处理程序的位置

对不起,很长的帖子:)

我想为.exe文件编写一个 pintool,它会在异常情况下执行以下操作:

  1. 打印异常指令地址。
  2. 打印将处理此异常的处理程序的地址。
  3. 打印程序返回的指令地址。

我已经阅读了有关 Windows SEH 机制的所有内容,并且对 intel pin-tool 本身非常熟悉。为了开始,我编写了以下测试程序:

然后,我使用 pintool 打印了所有例程(在调用 main 之后调用的)以及该程序的返回地址。是列表:

然后我阅读了这些例程的文档。我认为这些例程的参数可能包含我需要的信息。但一切都是徒劳的。RtlRaiseException参数确实让我可以访问该ExceptionRecord结构,但它的ExceptionAddress字段包含起始地址RaiseException而不是bar.

而且我无法找到任何方法来获取将处理throw.

任何帮助表示赞赏;谢谢 :)

0 投票
1 回答
790 浏览

c++ - Windows中未解析的外部符号

我正在使用 windows8 32 位、visual studio 2012 和 intel pintool(76991 版本)。我正在使用开发人员命令提示符使用命令创建 dll:

它给出错误:

在互联网上,我发现我可能会收到此错误,原因如下所述“尝试在调试模式下构建 Pintool。将 Visual Studio 中的活动配置更新为 Release ,链接错误将消失”

我需要包含哪个标志才能在发布模式下构建它(因为我正在使用命令提示符)?

0 投票
0 回答
943 浏览

intel-pin - 使用 PIN 二进制检测工具更改寄存器的值

我正在尝试使用 PIN_SetContextReg 对寄存器的值进行一些更改。首先,我使用 PIN_GetContextReg 作为 old_val 获取 REG_INST_PTR 的值,然后我想对该值进行一些更改并将其设置在与 new_val 相同的寄存器中。我可以使用哪些可能的随机值。除了 REG_INST_PTR 之外,我还可以更改哪些其他寄存器,这将对正在检测的程序产生重大影响。

这是方法

方法在这里被调用

0 投票
1 回答
154 浏览

intel-pin - INS_IsProcedureCall() 如何工作?

Pin Documentation for 中INS_IsProcedureCall(INS ins),给出

如果 ins 是过程调用,则为 true。这会过滤掉(ab)用于其他目的的调用指令

另一方面,所有指令都INS_IsCall(INS ins)将返回。truecall

我的问题是,这两个功能究竟有何不同?更准确地说,什么样的调用指令会被返回trueINS_IsCall(INS ins)而不是被返回INS_IsProcedureCall(INS ins)

任何示例将不胜感激。

0 投票
2 回答
733 浏览

c++ - 用 sqlite3 数据库编译 pintool

我正在编写一个 pintool 来检测我的二进制文件。

我想使用 sqlite3 数据库来存储有关指令的信息。

我可以毫无问题地编译和执行 sqlite3 "helloworld" 示例。我也可以在没有 sqlite 连接的情况下编译和执行我的 pintool。但是,每当我在 pintool 中集成 sqlite 代码时,都会出现错误:

dlopen 失败:找不到库“libsqlite3.so.0”

我到底在做什么:

  1. 我的链接命令看起来像(编译完成没有任何错误):

    g++ -shared -Wl,--hash-style=sysv /home/roman/Software/pin/intel64/runtime/pincrt/crtbeginS.o -Wl,-Bsymbolic -Wl,--version-script=/home/roman/软件/pin/source/include/pin/pintool.ver -fabi-version=2 -o obj-intel64/sqliteTest.so obj-intel64/sqliteTest.o -L/home/roman/Software/pin/intel64/runtime/ pincrt -L/home/roman/Software/pin/intel64/lib -L/home/roman/Software/pin/intel64/lib-ext -L/home/roman/Software/pin/extras/xed-intel64/lib - L/usr/lib/i386-linux-gnu -lpin -lxed /home/roman/Software/pin/intel64/runtime/pincrt/crtendS.o -lpin3dwarf -ldl-dynamic -nostdlib -lstlport-dynamic -lm-dynamic - lc-动态-lsqlite3

  2. LDD 命令 ldd obj-intel64/sqliteTest.so 给我以下结果:

linux-vdso.so.1 => (0x00007fff4f4aa000)

libxed.so => 未找到

libpin3dwarf.so => 未找到

libdl-dynamic.so => 未找到

libstlport-dynamic.so => 未找到

libc-dynamic.so => 未找到

libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fd46221f000)

libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd462002000)

libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd461dfe000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd461a34000)

/lib64/ld-linux-x86-64.so.2 (0x000055565d930000)

  1. 符号链接 ls -l /usr/lib/x86_64-linux-gnu/libsqlite*:

-rw-r--r-- 1 root root 1156080 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.a

-rw-r--r-- 1 root root 965 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.la

lrwxrwxrwx 1 根 2 月 22 日 19 日 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so -> libsqlite3.so.0.8.6

lrwxrwxrwx 1 root root 19 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 -> libsqlite3.so.0.8.6

-rw-r--r-- 1 root root 870240 Feb 22 17:43 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6

  1. sqlite3 版本是 3.13.0

  2. 当我运行 pin 工具时,我得到以下信息:

/home/roman/Software/pin/pin -t /home/roman/Software/pin/source/tools/sqliteTest/obj-intel64/sqliteTest.so -- ./test.bin

E: 无法加载 /home/roman/Software/pin/source/tools/sqliteTest/obj-intel64/sqliteTest.so: dlopen failed: library "libsqlite3.so.0" not found

  1. 如果您想知道代码:

    /li>
  2. 当我在链接期间放置 -Wl 和 --verbose 选项时,我得到了以下信息:

尝试打开 /usr/lib/i386-linux-gnu/libsqlite3.so 失败

尝试打开 /usr/lib/i386-linux-gnu/libsqlite3.a 失败

尝试打开 /usr/lib/gcc/x86_64-linux-gnu/5/libsqlite3.so 失败

尝试打开 /usr/lib/gcc/x86_64-linux-gnu/5/libsqlite3.a 失败

尝试打开 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libsqlite3.so 成功

-lsqlite3 (/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libsqlite3.so)

你知道我的手有什么问题吗?

显然 pin v.3 对我无法理解的外部库有特定要求。我降级到 pin v.2.8,一切正常。

0 投票
1 回答
217 浏览

winapi - 如果包含“windows.h”,则使用 Visual Studio 2012 为 x64 构建 Mypintool 示例失败

我正在尝试构建 Mypintool 示例,该示例附带用于 x64 架构的引脚分配。我正在使用 pin3.0 (build 76991) 和 Visual Studio 2012。如果我没有包含windows.h. 但是,如果我window.h像这样包含(在单独的命名空间中):-

然后构建给出错误: -

此外,我能够构建windows.h包含没有任何问题的 win32 工具。此外,我比较了 win32 和 x64 的构建设置,但找不到任何差异。

任何帮助表示赞赏。

0 投票
0 回答
201 浏览

intel-pin - 如何检测例程以在进入例程时填充引脚快速缓冲区条目

我正在使用 pin 3.0(build 76991)和 Visual Studio 2012。我尝试了以下方法来检测例程条目以填充 pin 快速缓冲区中的条目

  1. 在图像检测期间将 RTN_InsertFillBuffer用于 所需的例程,但编译器抛出错误:RTN_InsertFillBuffer identifier not found.
  2. 通过比较图像检测回调中的名称找到了例程。用于RTN_InsHead获取启动指令。然后INS_InsertFillBuffer在该指令上添加了一个。但我得到了一个segmentation fault. PIN_DefineTraceBuffer文档说缓冲区是在线程启动时隐式分配的。现在,由于 pin 静态进行例程发现,并且在检测图像时程序尚未启动,因此在图像检测期间可能未分配缓冲区,因此调用INS_InsertFillBuffer可能会导致分段错误。我还尝试在图像检测中使用 PIN_AllocateBuffer 分配缓冲区,但这没有帮助。
  3. 通过常规检测而不是图像检测尝试了第 2 步,但同样的错误仍然存​​在。

那么如何检测例程的开始以向引脚快速缓冲区添加条目?


第一种方法的代码:

仪表回调:

仪器仪表:


代码或第二种方法:

仪表回调:

仪器仪表:


第三种方法的代码:

仪表回调:

仪器仪表:

0 投票
1 回答
409 浏览

instrumentation - 可以使用 PIN_GetContextReg 和 PIN_SetContextReg 修改哪些寄存器

我想使用 PIN_GetContextReg 来获取寄存器的值,然后更改它并使用 PIN_SetContextReg 将其放回原处。PIN 手册说我可以对整数寄存器执行此操作,但除 REG_INST_PTR 之外我尝试的所有寄存器都会出错(PIN_GetContextReg/PIN_SetContextReg 不支持寄存器**)

这是代码

在这种情况下,我尝试使用寄存器 EAX,我得到了同样的错误。我正在使用 Pin 3.0

0 投票
1 回答
645 浏览

x86 - Pin:检测指定的共享库

我正在对可执行文件及其相关共享库执行一些简单的检测任务,将所有执行的指令记录在主文件以及共享库中。

但是,Pin总是抛出

仪器仪表期间。由于我在 32 位系统上工作,每次达到 3G 左右的内存消耗时,检测过程都会崩溃。

我想在这个 32 位系统上工作,因为这个平台上有很多共享库。另一方面,因为实际上我只对一个共享库感兴趣,所以我正在考虑找到一种方法,只在主可执行文件和那个特殊库中记录执行的指令。

但是,我不知道是否/如何做到这一点。现在在仪器之前,我的设置是:

如您所见,我没有检查是否正在检测主可执行文件,这意味着我应该能够检测所有库。

我的测试平台是 32 位 x86 Ubuntu 14.04。并且测试目标是 32 位 ELF 二进制代码。

所以我的问题是:鉴于我的情况,我是否应该配置为仅检测我感兴趣的库以克服内存异常?如果是这样,我该怎么做?