配置和执行英特尔的 PIN 工具

逆向工程 动态分析 仪器仪表 小工具
2021-07-07 08:47:48

我正在尝试在 Windows 上开发 Pintool。但到目前为止,我一直无法配置或执行 PIN。我的系统上安装了 Microsoft Visual Studio 10.0。我还从其网站下载并解压缩了 pin。

在 Windows 上,“pin”命令需要 pintool 的“.dll”文件才能执行。假设我想在“prog1.exe”上执行“icount.cpp”。我怎样才能做到这一点?

如何使用 Visual Studio 开发自己的工具?我已经学习了教程,我知道该写什么,但我不知道从哪里开始以及如何开始?

提前谢谢你。

3个回答

我所知道的最快且不那么麻烦的方法是制作MyPinTool目录的副本(在<pin dir>\source\tools\文件MyPinTool.cpp用您自己的代码覆盖该文件

MyPinTool.sln在 Visual Studio 中打开并构建您的目标。之后,您可以将 DLL 重命名为您想要的任何名称。

这不是一个优雅的解决方案,但它完成了工作。最后,您希望花时间编写自己的代码,PinTool而不是对编译器特定的设置感到恼火……

我找到了一个博客,它帮助我配置 Visual Studio 10 来开发我自己的工具。这是博客的链接提到的步骤是通用的。但我观察到的一件事是,在我的 Pin 安装中,很少有目录名称不同。所以请记住更新这些名称。由于一些奇怪的原因,我不得不将“\LIBPATH:(path to additional library commands)”变量添加到命令行链接器选项。

也在每个cpp文件的开头提到

#define _SECURE_SCL 0

您可能面临的一个常见错误是“错误:LNK1104:无法打开文件* **”。您可以参考此链接来解决问题。

编辑:要执行 PIN 工具:

发布配置中构建解决方案我已经在我的解决方案目录中提取了 PIN。转到pin.exe所在的目录在命令提示符下以以下格式执行命令:

pin -t [发布目录中解决方案 DLL 的位置(带有文件名)] -- [要执行的应用程序的位置(带有文件名)]

希望这对将来遇到此问题的任何人都有帮助。

卡洛斯的回答更像是一种解决方法,但它非常准确。让所有正确的旋钮都正确是一项疯狂的工作。更重要的是,第 3 版从操作系统可能拥有的任何本机运行时切换过来,并开始使用它们自己的运行时。

经过半天的颠倒示例后,我可以想出这个(我假设是 64 位 Windows 目标,但不难注意到什么是特定于体系结构的)

首先,您应该正确设置包含文件夹(但请确保首先设置PIN_ROOT

$(PIN_ROOT)\source\include\pin;$(PIN_ROOT)\source\include\pin\gen;$(PIN_ROOT)\source\tools\InstLib;$(PIN_ROOT)\extras\xed-intel64\include\xed;$(PIN_ROOT)\extras\components\include;$(PIN_ROOT)\extras\stlport\include;$(PIN_ROOT)\extras;$(PIN_ROOT)\extras\libstdc++\include;$(PIN_ROOT)\extras\crt\include;$(PIN_ROOT)\extras\crt;$(PIN_ROOT)\extras\crt\include\arch-x86;$(PIN_ROOT)\extras\crt\include\kernel\uapi;$(PIN_ROOT)\extras\crt\include\kernel\uapi\asm-x86;

然后,在编译器中设置这些标志: /MT /GR- /GS- /EHs- /EHa- /fp:strict /Oi- /FIinclude/msvc_compat.h

而这些定义的预处理器:TARGET_IA32E;HOST_IA32E;TARGET_WINDOWS;WIN32;__PIN__=1;PIN_CRT=1;__LP64__(拜托,真的要注意前两个.. IA32 Ë指的x86-64和他们的错误组合可能导致的符号和诸如此类的东西无数恶人的问题)。

请记住,除了像 3 个标题([xmm]intrin.h和有限的windows.h)之外,您不能使用 pintool 之外的任何其他标题。

接下来是链接器。你需要这些文件夹

$(PIN_ROOT)\intel64\lib;$(PIN_ROOT)\intel64\lib-ext;$(PIN_ROOT)\extras\xed-intel64\lib;$(PIN_ROOT)\intel64\runtime\pincrt;

和这些库,以绝对正确的顺序(/NODEFAULTLIB推荐)

pin.lib;xed.lib;pinvm.lib;kernel32.lib;pincrt.lib;ntdll-64.lib;crtbeginS.obj

( stlport-static.lib, m-static.lib,c-static.lib并且os-apis.lib在更复杂的情况下也可能需要)

最后但并非最不重要的是,您应该添加/export:main /SAFESEH:NO /IGNORE:4210 /IGNORE:4049到链接器命令行。对于其他任何事情,请查看PinCRT 白皮书,我无法推荐足够的阅读。