当前位置: 首页 > article >正文

Intel Pin常用基础函数

Intel Pin根据颗粒度可以划分为指令级插桩(INS)、基本块级插桩(TRACE)、函数级插桩(RTN)、镜像级插桩(IMG)。

基础函数

PIN_InitSymbols函数
用于初始化程序的符号表,对于RTN和IMG两个颗粒度的插桩分析时这个函数不可缺少。

Fini函数

PIN_AddFiniFunction(Fini, 0);
VOID Fini(INT32 code, VOID* v)
{
    fprintf(trace, "#eof\n");
    fclose(trace);
}

Usage函数

if (PIN_Init(argc, argv)) return Usage();
INT32 Usage()
{
    PIN_ERROR("This Pintool prints the IPs of every instruction executed\n" + KNOB_BASE::StringKnobSummary() + "\n");
    return -1;
}

Knob类

KnobOutputFile
KNOB< string > KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "inscount.out", "specify output file name");

分析函数的参数

字段作用及意义
IARG_INST_PTR指令的地址
IARG_REG_VALUE寄存器的值
IARG_CONTEXT
IARG_FUNCARG_ENTRYPOINT_VALUE传递给RTN的参数,需要额外参数表示RTN的第几个参数,第一个参数从0开始
IARG_FUNCRET_EXITPOINT_VALUERTN的返回值

分析函数的参数
https://software.intel.com/sites/landingpage/pintool/docs/98650/Pin/doc/html/group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da623ad95758bce14fcb9427beef53736a

编写Pintool常用的语法

BBL遍历

for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl))
    {
        BBL_InsertCall(bbl, IPOINT_BEFORE, (AFUNPTR)docount, IARG_UINT32, BBL_NumIns(bbl), IARG_END);
}

指令类型判断
// 查找将值从内存移动到寄存器的指令
例如:Mov eax,[0x77d154h]

   if ( INS_Opcode (ins) == XED_ICLASS_MOV && INS_IsMemoryRead (ins) && INS_OperandIsReg (ins, 0) && INS_OperandIsMemory (ins, 1))
        INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(DoLoad), IARG_UINT32, REG(INS_OperandReg(ins, 0)), IARG_MEMORYREAD_EA,IARG_RETURN_REGS, INS_OperandReg(ins, 0), IARG_END);

首先if语句的判断确定这必须是一条mov寄存器,内存这样的地址。因此IARG_MEMORYREAD_EA获取内存的地址,然后使用IARG_RETURN_REGS指定返回值保存位置,也就是当前指令的第一个寄存器,其中INS_OpeandReg(ins,0)能够获取指令的第0个操作数(也就是寄存器)。

获取malloc函数在IMG中的函数映射地址

RTN mallocRtn = RTN_FindByName(img, MALLOC);

如果在多线程应用程序上运行时,pintool在回调中打开文件,则可能会发生死锁。要解决此问题,请在 main中打开一个文件,并使用线程 ID 标记数据。请参阅 source/tools/ManualExamples/buffer_windows.cpp 作为示例。

修改原始指令
INS_Delete()删除原始指令;
插入直接或间接分支(使用INS_InsertDirectJump和INS_InsertIndirectJump);
这样可以更轻松地模拟更改控制流的指令。

官方提供Pintool及其作用

Malloctrace.cpp跟踪传递给malloc函数的参数值或返回值
Imageload.cpp加载模块及image详情
Proccount.cpp函数过程调用及次数统计

参考链接

https://software.intel.com/sites/landingpage/pintool/docs/98650/Pin/doc/html/index.html#WindowsNotes


http://www.kler.cn/a/5099.html

相关文章:

  • 【 Verdi实用技巧-Part-3】
  • Redis数据库笔记——主从复制
  • kubeneters-循序渐进Cilium网络(二)
  • 鸿蒙UI(ArkUI-方舟UI框架)
  • Clickhouse基础(一)
  • (七)人工智能进阶之人脸识别:从刷脸支付到智能安防的奥秘,小白都可以入手的MTCNN+Arcface网络
  • Java设计模式-7、装饰器模式
  • 【华为OD机试真题JAVA】两个数和两数之和绝对值问题
  • BO OLAP 连接 HANA 先决条件
  • 【SSM】MyBatis(十一.MyBatis的高级映射和延迟加载)
  • 设计模式——装饰者模式
  • satellite.js库下载、介绍、安装、引用,返回函数的方法
  • chatgpt-retrieval-plugin:chatgpt检索插件简介
  • 读《刻意练习》后感,与原文好句摘抄
  • linux串口通信
  • 硬件语言Verilog HDL牛客刷题day04 序列检测部分
  • 线程安全、线程同步(同步代码块、同步方法、同步锁)
  • 【Linux】gcc/g++区别和联系
  • docker私有仓库,仓库管理器
  • 程序监控报警失败自动重启脚本
  • 【不同入参ajax请求】ajax请求接口入参form形式和body形式如何写前端代码(附源码详解)
  • Appium 自动化测试从入门到精通,零基础也能听懂
  • 掌握C语言的这3个函数,你就学会随机读写文件了
  • 二战华为成功上岸,准备了小半年,要个27k应该也算不上很高吧~
  • redis 三. hash应用场景及底层分析
  • PCIe基础