180203 逆向-Win下PinTools编写

1625-5 王子昂 总结《2018年2月3日》 【连续第491天总结】
A. PinTools编写、win32程序的适配
B.
之前编译好了ManualExamples中的inscount,但是0、1、2的计算都很不准确,高达几百万且波动极大,所以没法通过例程的指令计数来爆破

于是只好自己参照API来修改
感觉很久没有从零开始查文档写程序啦~
官方的例程真的很充分,文档也特别详细

基础介绍

PinTools文档:
https://software.intel.com/sites/landingpage/pintool/docs/81205/Pin/html/index.html

Linux

Pin tool由int main(int argc, char * argv[])函数开始,由NMAKE编译选项编译成特定的动态链接库,如果要编译自己的动态链接库,在Nmakefile文件中把要编译的动态链接库名字加到COMMON_TOOLS=后面,使用..\nmake.bat TARGET=ia32 xxx.dll命令进行编译。

Windows

在makefile.rules中找到

TEST_TOOL_ROOTS := inscount0_win_stdout
来修改,添加目标

另外obj-ia32中的库只能对32位的程序(无论是elf还是exe使用),对于64位的程序则需要编译出obj-intel64的版本

make TARGET=ia32/intel64 可以指定目标版本

如果在程序中要使用符号,要调用PIN_InitSymbols();来初始化PIN_Init(argc, argv)

PIN tool分四种插装粒度

  • 指令级插桩(instruction instrumentatio),通过函数INS_AddInstrumentFunctio实现。

  • 轨迹级插装(trace instrumentation),通过函数TRACE_AddInstrumentFunction实现。(貌似就是基本块插装)

  • 镜像级插装(image instrumentation),使用IMG_AddInstrumentFunction函数,由于其依赖于符号信息去确定函数边界,因此必须在调用PIN_Init之前调用PIN_InitSymbols。

  • 函数级的插装(routine instrumentation),使用RTN_AddInstrumentFunction函数。函数级插装比镜像级插装更有效,因为只有镜像中的一小部分函数被执行。

其中,IMG_AddInstrumentFunction和RTN_AddInstrumentFunction需要先调用PIN_InitSymbols(),来分析出符号。在无符号的程序中,IMG_AddInstrumentFunction和RTN_AddInstrumentFunction无法分析出相应的需要插装的块。
在各种粒度的插装函数调用时,可以添加自己的处理函数在代码中,程序被加载后,在被插装的代码运行时,自己添加的函数会被调用。

INS_AddIns

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值