【问题标题】:Intel Pin - How to only instrument child processIntel Pin - 如何仅检测子进程
【发布时间】:2023-01-04 22:20:31
【问题描述】:

我有一个 run.sh 脚本:

expr 1 + 1

我真正想要检测的是 expr。 这是我的 Pin 工具的代码(我只检测间接调用以避免输出变大):

/*
 * Copyright (C) 2004-2021 Intel Corporation.
 * SPDX-License-Identifier: MIT
 */

#include <iostream>
#include <fstream>
#include <set>
#include "pin.H"
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
using std::cerr;
using std::endl;
using std::ios;
using std::ofstream;
using std::string;
using namespace std;

pid_t trg_pid = 0;

 VOID print_ins(ADDRINT addr) {
    cout<<PIN_GetPid()<<'\t'<<trg_pid<<'\t'<<hex<<addr<<oct<<endl;
    
 }
 

// Pin calls this function every time a new instruction is encountered
VOID Instruction(INS ins, VOID* v)
{
    if(INS_IsCall(ins) && INS_IsIndirectControlFlow(ins))
    {
        INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)print_ins, IARG_INST_PTR,IARG_END);
    }
    
}

BOOL FollowChild(CHILD_PROCESS cProcess, VOID* userData)
{
    int argcc;
    char ** argvv;
    CHILD_PROCESS_GetCommandLine(cProcess,&argcc,(const char* const**)&argvv);
    if(string(argvv[0]).find("expr") != string::npos)
    {
        trg_pid = PIN_GetPid();
        cout<<"trgpid : "<<trg_pid<<endl;
    }
    return TRUE;
}

// This function is called when the application exits
VOID Fini(INT32 code, VOID* v)
{
    // Write to a file since cout and cerr maybe closed by the application
    cout<<"finish"<<endl;
}

/* ===================================================================== */
/* Print Help Message                                                    */
/* ===================================================================== */

INT32 Usage()
{
    cerr << "This tool counts the number of dynamic instructions executed" << endl;
    cerr << endl << KNOB_BASE::StringKnobSummary() << endl;
    return -1;
}

/* ===================================================================== */
/* Main                                                                  */
/* ===================================================================== */
/*   argc, argv are the entire command line: pin -t <toolname> -- ...    */
/* ===================================================================== */

int main(int argc, char* argv[])
{
    // Initialize pin
    if (PIN_Init(argc, argv)) return Usage();

    PIN_AddFollowChildProcessFunction(FollowChild, 0);

    // Register Instruction to be called to instrument instructions
    INS_AddInstrumentFunction(Instruction, 0);

    // Register Fini to be called when the application exits
    PIN_AddFiniFunction(Fini, 0);

    // Start the program, never returns
    PIN_StartProgram();

    return 0;
}

我使用以下命令运行 Pin:

/home/lzy/Desktop/pin-3.25-98650-g8f6168173-gcc-linux/pin -follow_execv -t /home/lzy/Desktop/pin-3.25-98650-g8f6168173-gcc-linux/source/tools/MyPinTool/obj-intel64/MyPinTool.so -- ./run.sh

和输出:

256709  0   7f42258b185a
765305  0   7f422589f9fd
765305  0   7f422589f908
765305  0   7f422589f9fd
765305  0   7f422589f908
765305  0   7f42258b4dc7
765305  0   7f42258b4e81
765305  0   7f42258b4f3d
765305  0   7f42258b4ff9
765305  0   7f42258b50b4
765305  0   7f42258af5cf
765305  0   7f42258af99b
765305  0   7f422589a752
765305  0   7f422589a799
765305  0   7f42258af368
765305  0   7f42258b91fa
765305  0   7f4225898a53
765305  0   7f422589f9fd
765305  0   7f422589fd1b
765305  0   7f422589f908
765305  0   7f42258af368
765305  0   7f4225895a54
765305  0   7f4225895f4c
765305  0   7f42258af470
765305  0   7f42258a82d7
765305  0   7f42258a82d7
765305  0   7f42258a82d7
765305  0   7f42258a82d7
765305  0   7f42258b2d68
765305  0   7f42258a642b
765305  0   7f42258a64a0
765305  0   7f42258a36e9
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3091
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a3a8d
765305  0   7f42258a6524
765305  0   7f42258a6675
765305  0   7f422589786c
765305  0   7f42258a36e9
765305  0   7f422589847c
765305  0   7f422589847c
765305  0   55857ba33f0f
765305  0   7f4211abde66
765305  0   7f4211abdeb9
765305  0   7f4211abdd8e
765305  0   55857ba45061
765305  0   55857ba45061
765305  0   7f4211b091c8
765305  0   7f4211b09d25
765305  0   7f4211b0a047
765305  0   55857ba3bbfe
trgpid : 765310
256712  0   7fb6e21c885a
765310  0   7fb6e21b69fd
765310  0   7fb6e21b6908
765310  0   7fb6e21b69fd
765310  0   7fb6e21b6908
765310  0   7fb6e21cbdc7
765310  0   7fb6e21cbe81
765310  0   7fb6e21cbf3d
765310  0   7fb6e21cbff9
765310  0   7fb6e21cc0b4
765310  0   7fb6e21c65cf
765310  0   7fb6e21c699b
765310  0   7fb6e21b1752
765310  0   7fb6e21b1799
765310  0   7fb6e21c6368
765310  0   7fb6e21d01fa
765310  0   7fb6e21afa53
765310  0   7fb6e21b69fd
765310  0   7fb6e21b6d1b
765310  0   7fb6e21b6908
765310  0   7fb6e21c6368
765310  0   7fb6e21d01fa
765310  0   7fb6e21afa53
765310  0   7fb6e21b69fd
765310  0   7fb6e21b6d1b
765310  0   7fb6e21b6908
765310  0   7fb6e21c6368
765310  0   7fb6e21aca54
765310  0   7fb6e21c6368
765310  0   7fb6e21aca54
765310  0   7fb6e21acf4c
765310  0   7fb6e21c6470
765310  0   7fb6e21bf2d7
765310  0   7fb6e21bf2d7
765310  0   7fb6e21bf2d7
765310  0   7fb6e21bf2d7
765310  0   7fb6e21bf2d7
765310  0   7fb6e21c9d68
765310  0   7fb6e21bd42b
765310  0   7fb6e21bd4a0
765310  0   7fb6e21ba6e9
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21ba091
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21baa8d
765310  0   7fb6e21bd524
765310  0   7fb6e21bd675
765310  0   7fb6e21ae86c
765310  0   7fb6e21ba6e9
765310  0   7fb6e21af47c
765310  0   7fb6e21af47c
765310  0   7fb6e21af438
765310  0   7fb6e21af47c
765310  0   55690b901b4f
765310  0   7fb6ce26ce66
765310  0   7fb6ce26cd8e
765310  0   7fb6ce279c06
765310  0   7fb6e21bc0d0
765310  0   7fb6ce5c4192
765310  0   7fb6ce5c4192
765310  0   55690b90c5e2
765310  0   7fb6e21bc0d0
765310  0   7fb6ce2c3053
765310  0   7fb6ce2ce752
765310  0   7fb6ce2d0d5d
765310  0   7fb6ce2c1bed
765310  0   7fb6ce288493
765310  0   7fb6ce2c2227
765310  0   7fb6ce2cfa5d
2
765310  0   7fb6ce2cef78
finish

我想用一个全局变量trg_pid来过滤expr中执行的指令,但是在FollowChild中改值后trg_pid还是0。有人知道吗?提前致谢!

【问题讨论】:

    标签: c++ intel-pin


    【解决方案1】:

    看起来 expr 1 + 1 使用 execve 系统调用来执行子程序。 execve的一个重要特点就是进程不会变,所以进程ID也不会变。

    trg_pid 保持为 0 的原因是当 pintool 调用 FollowChild 时,只有父程序的 trg_pid 版本被设置为 PID。这是因为:

    1. Pin_AddFollowChildProcessFunction执行子程序执行。
    2. Pin instruments 两个程序都是独立的,即它们都有自己的 trg_pid 副本。

      FollowChild 执行后,您看到的输出是检测子程序的结果,子程序具有与父程序相同的进程 ID,但仍具有默认的 trg_pid 值 0。

      您发布的示例有点误导,因为在调用 FollowChild 之前您看不到进程 ID 更新。实际上,其他东西改变了进程 ID。基于 strace,看起来在 execve 之前不久有一个对 vfork 的呼叫。 vfork 生成的孩子执行execve。您的 pintool 当前不跟踪 vfork。为此,您可以尝试通过 PIN_AddForkFunction() 检测 fork 函数。

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2019-11-11
      • 2020-01-04
      • 2019-11-05
      • 2018-08-08
      • 2018-04-03
      • 2018-11-09
      • 2019-08-25
      • 1970-01-01
      相关资源
      最近更新 更多