Windows环境下Pin(二进制动态插桩引擎)搭建
文章目录
- 安装包下载链接:
- 环境配置
- 编译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
环境配置
- 先将下载完的压缩包解压到某个目录,会看到目录下有pin.exe文件,这是32位的。由于pin与架构有关,有32位和64位的版本,为了方便使用,pin分为pin32和pin64。将当前目录的pin.exe重命名为pin.bak并新建pin32.bat,并填入如下代码:
@echo off
%~dp0\ia32\bin\pin.exe %*
- 随后创建pin64.bat,代码类似,只需要把“ia32”改成"intel64"。然后把当前目录加入环境变量PATH中。若配置正常,输出如下:
编译Pintool
在source\tools\MyPintool目录下有Intel提供的样例代码,需要用VS。打开MyPinTool.vcxproj,进行生成解决方案:
报错1(无法打开包括文件:“xed-iclass-enum.h”:No such file or directory):
- 打开MyPintool属性,在"c/c++ —>常规—>附加包含目录"中加入
"..\..\..\extras\xed-ia32\include\xed"
(若是64位,则加入"..\..\..\extras\xed-intel64\include\xed"
)
报错2(若编译时产生“XX模块对SAFESEH映像是不安全的”报错):
- 打开MyPintool属性,在“链接器—>高级—>映像具有安全异常处理程序”中把选项设置为“否”
报错3(若报错“无法解析的外部符号__fltused”):
- 打开MyPintool属性,在“链接器—>输入—>附加依赖项"中添加"crtbeginS.obj"
报错4(NO STACK TRACE ACAILABLE):
- 因为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 | 执行一个函数时 |
- 对于指令级插桩,Pin会在执行一条新指令时进行插桩,换句话说,对于动态生成的代码,Pin也能对其进行自动化的插桩,因此可以用Pin处理加壳的程序
- 轨迹级插桩可以认为是基本块(base block)级的插桩,但是Pin定义的基本块比一般情况定义的基本块要多。轨迹级插桩会在顶部的基本块被调用,若是执行程序中生成了新的基本块(如分支),则会生成新的轨迹,与上述指令级插桩有相同的特性,可以方便地处理动态生成的代码。
- 镜像级插桩和函数级插桩依赖符号信息,需要在调用PIN_Init前调用
Pin_InitSymbols
对程序进行符号分析
Windows环境下Pin(二进制动态插桩引擎)搭建相关推荐
- 插桩valgrind_基于动态插桩的CC++内存泄漏检测工具的设计与实现.pdf
基于动态插桩的CC++内存泄漏检测工具的设计与实现.pdf 第32卷第6期 计 算 机 应 用 研 究 V01.32No.6 20l5年 6月 ApplicationResearchofCompute ...
- Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)
Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(畅销10年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 75 ...
- 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...
- Windows环境下32位汇编语言程序设计(典藏版)
<Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...
- Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
Windows环境下Unicode编程总结 UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下. UN ...
- 在Windows环境下搭建Android开发环境
标题:在Windows环境下搭建 Android 开发环境 作者:CrazyPebble 时间:2011年2月28日 声明:此文在参考其他网上资料以及笔者实践总结写下,一来自己可以做一些总结,二来给跟 ...
- 腾讯云CMQ消息队列在Windows环境下的使用
版权声明:本文由李少华原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/100 来源:腾云阁 https://www.qcl ...
- java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...
进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...
- java本地可以发到linux不行,java 使用 ftp 在windows环境下可以正常下载文件,在linux环境下不行...
windows环境下使用 public static void dowmloadFtpWindos(String fileUuid, HttpServletRequest request,HttpSe ...
最新文章
- 这老哥把GPU当暖气用,省钱了!
- java cglib jar包_Java面试题|反射必看的4道面试题
- netbeans 9_NetBeans 9抢先体验
- cobbler介绍与部署
- 软考初级程序员真题资料(2009年上半年——2019年上半年)
- 超市登录系统 java_超市订单管理系统,登录功能实现
- html箭头轮播,CSS-用伪类制作小箭头(轮播图的左右切换btn)
- 离散数学自反,对称,传递闭包
- 腾讯优图开源项目TNN总结与实践
- Python从字典中提取子字典
- 基于Java毕业设计大学生兼职网站源码+系统+mysql+lw文档+部署软件
- [Kali Linux]入门:内网穿透的教程和实战(很适合入门|附图)
- 同态加密能否拯救云计算
- delphi adoquery的post和UpdateBatch
- Java小农养成记第八天
- ISO/OSI网络体系结构和TCP/IP协议模型
- jq使用face-api.js 识别人脸对比是否是同一个人
- Win2003 + IIS6.0 + PHP5 / ASP + MySQL5 服务器配置及虚拟主机基本安全设置
- 等参元八节点matlab,平面四边形八节点等参元matlab程序.docx
- BERT文本分类,代码超基础、超详细解析
热门文章
- python3编译器怎么下载_Python编译器及Sublime Text3安装及开发环境配置
- 电脑显示器变色_两千元档超强电竞小金刚:180hz的泰坦军团T27QR显示器
- 成功解决Fit Failed Warning: Estimator fit failed. The score on this train-test partition for these param
- Paper:《Graph Neural Networks: A Review of Methods and Applications》翻译与解读
- 成功解决Windows10环境下运行Linux系统下的.sh文件
- Algorithm:论一个产品经理的十八般武艺
- (转)select、poll、epoll之间的区别
- guava-collections
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
- ibatis学习笔记(三)java实体跟表映射.xml文件详解