问题标签 [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.
linux - 固定工具中缺少共享对象
当我编译我的 pin 工具并ldd
在 pin 工具共享对象上运行时,共享对象 libxed.so、libpin3dwarf.so、libdl-dynamic.so、libstlport-dynamic.so 和 libc-dynamic.so 都找不到。我认为它可能是 makefile.rules 文件,因为我对其进行了修改以链接其他一些目标文件,但即使在编译 pin 目录中提供的示例 pin 工具时,也会出现同样的问题。有谁知道问题可能是什么?
exe - 通过 Intel PinTool 在发生异常后(在 .exe 文件中)获取异常处理程序的位置
对不起,很长的帖子:)
我想为.exe文件编写一个 pintool,它会在异常情况下执行以下操作:
- 打印异常指令地址。
- 打印将处理此异常的处理程序的地址。
- 打印程序返回的指令地址。
我已经阅读了有关 Windows SEH 机制的所有内容,并且对 intel pin-tool 本身非常熟悉。为了开始,我编写了以下测试程序:
然后,我使用 pintool 打印了所有例程(在调用 main 之后调用的)以及该程序的返回地址。这是列表:
然后我阅读了这些例程的文档。我认为这些例程的参数可能包含我需要的信息。但一切都是徒劳的。RtlRaiseException
参数确实让我可以访问该ExceptionRecord
结构,但它的ExceptionAddress
字段包含起始地址RaiseException
而不是bar
.
而且我无法找到任何方法来获取将处理throw
.
任何帮助表示赞赏;谢谢 :)
c++ - Windows中未解析的外部符号
我正在使用 windows8 32 位、visual studio 2012 和 intel pintool(76991 版本)。我正在使用开发人员命令提示符使用命令创建 dll:
它给出错误:
在互联网上,我发现我可能会收到此错误,原因如下所述“尝试在调试模式下构建 Pintool。将 Visual Studio 中的活动配置更新为 Release ,链接错误将消失”
我需要包含哪个标志才能在发布模式下构建它(因为我正在使用命令提示符)?
intel-pin - 使用 PIN 二进制检测工具更改寄存器的值
我正在尝试使用 PIN_SetContextReg 对寄存器的值进行一些更改。首先,我使用 PIN_GetContextReg 作为 old_val 获取 REG_INST_PTR 的值,然后我想对该值进行一些更改并将其设置在与 new_val 相同的寄存器中。我可以使用哪些可能的随机值。除了 REG_INST_PTR 之外,我还可以更改哪些其他寄存器,这将对正在检测的程序产生重大影响。
这是方法
方法在这里被调用
intel-pin - INS_IsProcedureCall() 如何工作?
在Pin Documentation for 中INS_IsProcedureCall(INS ins)
,给出
如果 ins 是过程调用,则为 true。这会过滤掉(ab)用于其他目的的调用指令
另一方面,所有指令都INS_IsCall(INS ins)
将返回。true
call
我的问题是,这两个功能究竟有何不同?更准确地说,什么样的调用指令会被返回true
,INS_IsCall(INS ins)
而不是被返回INS_IsProcedureCall(INS ins)
?
任何示例将不胜感激。
c++ - 用 sqlite3 数据库编译 pintool
我正在编写一个 pintool 来检测我的二进制文件。
我想使用 sqlite3 数据库来存储有关指令的信息。
我可以毫无问题地编译和执行 sqlite3 "helloworld" 示例。我也可以在没有 sqlite 连接的情况下编译和执行我的 pintool。但是,每当我在 pintool 中集成 sqlite 代码时,都会出现错误:
dlopen 失败:找不到库“libsqlite3.so.0”
我到底在做什么:
我的链接命令看起来像(编译完成没有任何错误):
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
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)
- 符号链接 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
sqlite3 版本是 3.13.0
当我运行 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
如果您想知道代码:
/li>当我在链接期间放置 -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,一切正常。
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 的构建设置,但找不到任何差异。
任何帮助表示赞赏。
intel-pin - 如何检测例程以在进入例程时填充引脚快速缓冲区条目
我正在使用 pin 3.0(build 76991)和 Visual Studio 2012。我尝试了以下方法来检测例程条目以填充 pin 快速缓冲区中的条目
- 在图像检测期间将 RTN_InsertFillBuffer用于 所需的例程,但编译器抛出错误:
RTN_InsertFillBuffer identifier not found.
- 通过比较图像检测回调中的名称找到了例程。用于
RTN_InsHead
获取启动指令。然后INS_InsertFillBuffer
在该指令上添加了一个。但我得到了一个segmentation fault
.PIN_DefineTraceBuffer
文档说缓冲区是在线程启动时隐式分配的。现在,由于 pin 静态进行例程发现,并且在检测图像时程序尚未启动,因此在图像检测期间可能未分配缓冲区,因此调用INS_InsertFillBuffer
可能会导致分段错误。我还尝试在图像检测中使用 PIN_AllocateBuffer 分配缓冲区,但这没有帮助。 - 通过常规检测而不是图像检测尝试了第 2 步,但同样的错误仍然存在。
那么如何检测例程的开始以向引脚快速缓冲区添加条目?
第一种方法的代码:
仪表回调:
仪器仪表:
代码或第二种方法:
仪表回调:
仪器仪表:
第三种方法的代码:
仪表回调:
仪器仪表:
instrumentation - 可以使用 PIN_GetContextReg 和 PIN_SetContextReg 修改哪些寄存器
我想使用 PIN_GetContextReg 来获取寄存器的值,然后更改它并使用 PIN_SetContextReg 将其放回原处。PIN 手册说我可以对整数寄存器执行此操作,但除 REG_INST_PTR 之外我尝试的所有寄存器都会出错(PIN_GetContextReg/PIN_SetContextReg 不支持寄存器**)
这是代码
在这种情况下,我尝试使用寄存器 EAX,我得到了同样的错误。我正在使用 Pin 3.0
x86 - Pin:检测指定的共享库
我正在对可执行文件及其相关共享库执行一些简单的检测任务,将所有执行的指令记录在主文件以及共享库中。
但是,Pin
总是抛出
仪器仪表期间。由于我在 32 位系统上工作,每次达到 3G 左右的内存消耗时,检测过程都会崩溃。
我想在这个 32 位系统上工作,因为这个平台上有很多共享库。另一方面,因为实际上我只对一个共享库感兴趣,所以我正在考虑找到一种方法,只在主可执行文件和那个特殊库中记录执行的指令。
但是,我不知道是否/如何做到这一点。现在在仪器之前,我的设置是:
如您所见,我没有检查是否正在检测主可执行文件,这意味着我应该能够检测所有库。
我的测试平台是 32 位 x86 Ubuntu 14.04。并且测试目标是 32 位 ELF 二进制代码。
所以我的问题是:鉴于我的情况,我是否应该配置为仅检测我感兴趣的库以克服内存异常?如果是这样,我该怎么做?