文章目录

  • 安装包下载链接:
  • 环境配置
  • 编译Pintool
    • 报错1(无法打开包括文件:"xed-iclass-enum.h":No such file or directory):
    • 报错2(若编译时产生“XX模块对SAFESEH映像是不安全的”报错):
    • 报错3(若报错“无法解析的外部符号__fltused”):
    • 报错4(NO STACK TRACE ACAILABLE):
  • Pintool使用
  • Pintool基本框架

安装包下载链接:

https://software.intel.com/en-us/articles/pintool-downloads

环境配置

  1. 先将下载完的压缩包解压到某个目录,会看到目录下有pin.exe文件,这是32位的。由于pin与架构有关,有32位和64位的版本,为了方便使用,pin分为pin32和pin64。将当前目录的pin.exe重命名为pin.bak并新建pin32.bat,并填入如下代码:
@echo off
%~dp0\ia32\bin\pin.exe %*
  1. 随后创建pin64.bat,代码类似,只需要把“ia32”改成"intel64"。然后把当前目录加入环境变量PATH中。若配置正常,输出如下:

编译Pintool

在source\tools\MyPintool目录下有Intel提供的样例代码,需要用VS。打开MyPinTool.vcxproj,进行生成解决方案:

报错1(无法打开包括文件:“xed-iclass-enum.h”:No such file or directory):

  1. 打开MyPintool属性,在"c/c++ —>常规—>附加包含目录"中加入"..\..\..\extras\xed-ia32\include\xed"(若是64位,则加入"..\..\..\extras\xed-intel64\include\xed"

报错2(若编译时产生“XX模块对SAFESEH映像是不安全的”报错):

  1. 打开MyPintool属性,在“链接器—>高级—>映像具有安全异常处理程序”中把选项设置为“否”

报错3(若报错“无法解析的外部符号__fltused”):

  1. 打开MyPintool属性,在“链接器—>输入—>附加依赖项"中添加"crtbeginS.obj"

报错4(NO STACK TRACE ACAILABLE):

  1. 因为32位的Pintool不支持Windows 10,需要编译完后放置Windows 7或Windows 8虚拟机中运行

Pintool使用

 pin32 -t .\MyPinTool.dll -o log.log -- cmd /c echo 123


log.log其中记录了程序执行的基本块数目和指令数目。

pin32 -pid 17592 -t -h  .\MyPinTool.dll -o log.log

附加到现有的程序

Pintool基本框架

 int main(int argc,char *argv[]){//初始化PIN运行库//若是有参数-h,则输出帮助信息,即调用Usage函数if(PIN_Init(argc,argv)){return Usage();}string filename=KnobOutputFile.Value();if(!filename.empty()){out=new std::ofstream(fileName.c_str());}if(KnobCount){TRACE_AddInstrumentFunction(Trace,0);//  注册在执行指令trace时会执行的函数PIN_AddThreadStartFunction(ThreadStart,0);//注册每个线程启动时会执行的函数PIN_AddFiniFunction(Fini,0);//注册程序结束时会执行的函数}PIN_StartProgram();   //启动程序,该函数不会返回return 0;}

Pintool会先执行Pin_Init对Pin运行库进行初始化,若是参数有-h或者初始化失败报错,则会输出工具的帮助信息,即调用Usage.

随后Pintool根据命令行输入的参数初始化filaName变量,KnobOutputFile和KnobCount的定义如下:

KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE,"pintool","o","","specity file name for  MyPinTool output");KNOB<BOOL> KnobCount(KNOB_MODE_WRITEONCE,"pintool","count","1","count instructions,basic blocks and threads in the application");;

参数为o时,会设置KnobOutputFile的值,默认为空,参数为count时,会设置KnobCount的值,默认值为1。在KnobCount被设置的情况下,会注册为3个插桩函数,随后调用PIN_StartProgram运行被插桩的程序(PIN_StartProgram不会返回)

插桩粒度 API 执行时机
指令级插桩(instruction) INS_AddInstrumentFunction 执行一条新指令
轨迹级插桩(trace) TRACE_AddInstrumentFunction 执行一个新trace
镜像级插桩(image) IMG_AddInstrumentFunction 加载新镜像时
函数级插桩(routine) RTN_AddInstrumentFunction 执行一个函数时
  1. 对于指令级插桩,Pin会在执行一条新指令时进行插桩,换句话说,对于动态生成的代码,Pin也能对其进行自动化的插桩,因此可以用Pin处理加壳的程序
  2. 轨迹级插桩可以认为是基本块(base block)级的插桩,但是Pin定义的基本块比一般情况定义的基本块要多。轨迹级插桩会在顶部的基本块被调用,若是执行程序中生成了新的基本块(如分支),则会生成新的轨迹,与上述指令级插桩有相同的特性,可以方便地处理动态生成的代码。
  3. 镜像级插桩和函数级插桩依赖符号信息,需要在调用PIN_Init前调用Pin_InitSymbols对程序进行符号分析

Windows环境下Pin(二进制动态插桩引擎)搭建相关推荐

  1. 插桩valgrind_基于动态插桩的CC++内存泄漏检测工具的设计与实现.pdf

    基于动态插桩的CC++内存泄漏检测工具的设计与实现.pdf 第32卷第6期 计 算 机 应 用 研 究 V01.32No.6 20l5年 6月 ApplicationResearchofCompute ...

  2. Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)

    Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(畅销10年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 75 ...

  3. 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记

    琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...

  4. Windows环境下32位汇编语言程序设计(典藏版)

    <Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...

  5. Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI

    Windows环境下Unicode编程总结 UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下. UN ...

  6. 在Windows环境下搭建Android开发环境

    标题:在Windows环境下搭建 Android 开发环境 作者:CrazyPebble 时间:2011年2月28日 声明:此文在参考其他网上资料以及笔者实践总结写下,一来自己可以做一些总结,二来给跟 ...

  7. 腾讯云CMQ消息队列在Windows环境下的使用

    版权声明:本文由李少华原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/community/article/100 来源:腾云阁 https://www.qcl ...

  8. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  9. java本地可以发到linux不行,java 使用 ftp 在windows环境下可以正常下载文件,在linux环境下不行...

    windows环境下使用 public static void dowmloadFtpWindos(String fileUuid, HttpServletRequest request,HttpSe ...

最新文章

  1. 这老哥把GPU当暖气用,省钱了!
  2. java cglib jar包_Java面试题|反射必看的4道面试题
  3. netbeans 9_NetBeans 9抢先体验
  4. cobbler介绍与部署
  5. 软考初级程序员真题资料(2009年上半年——2019年上半年)
  6. 超市登录系统 java_超市订单管理系统,登录功能实现
  7. html箭头轮播,CSS-用伪类制作小箭头(轮播图的左右切换btn)
  8. 离散数学自反,对称,传递闭包
  9. 腾讯优图开源项目TNN总结与实践
  10. Python从字典中提取子字典
  11. 基于Java毕业设计大学生兼职网站源码+系统+mysql+lw文档+部署软件
  12. [Kali Linux]入门:内网穿透的教程和实战(很适合入门|附图)
  13. 同态加密能否拯救云计算
  14. delphi adoquery的post和UpdateBatch
  15. Java小农养成记第八天
  16. ISO/OSI网络体系结构和TCP/IP协议模型
  17. jq使用face-api.js 识别人脸对比是否是同一个人
  18. Win2003 + IIS6.0 + PHP5 / ASP + MySQL5 服务器配置及虚拟主机基本安全设置
  19. 等参元八节点matlab,平面四边形八节点等参元matlab程序.docx
  20. BERT文本分类,代码超基础、超详细解析

热门文章

  1. python3编译器怎么下载_Python编译器及Sublime Text3安装及开发环境配置
  2. 电脑显示器变色_两千元档超强电竞小金刚:180hz的泰坦军团T27QR显示器
  3. 成功解决Fit Failed Warning: Estimator fit failed. The score on this train-test partition for these param
  4. Paper:《Graph Neural Networks: A Review of Methods and Applications》翻译与解读
  5. 成功解决Windows10环境下运行Linux系统下的.sh文件
  6. Algorithm:论一个产品经理的十八般武艺
  7. (转)select、poll、epoll之间的区别
  8. guava-collections
  9. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
  10. ibatis学习笔记(三)java实体跟表映射.xml文件详解