理清PIN工具产生的trace文件格式,是BAP下给予PIN进行分析的基础,但网上资料较少,今日研究BAP源代码时,发现一些基本知识,总结如下:

       1、PIN生成的trace文件包含一个trace头,接下来是一些列的帧。

            strcuct TraceHeader{

                 uint32_t magic;       //trace文件魔术头,0x43525442

                 uit32_t version;      //4

                 uint64_t frame_count; //此trace文件的帧个数

                 uint64_t toc_offset;    //内容表的位移

             }

       2、每个帧含有相同的头部结构,包含帧header大小和类型等信息。帧的大小是任意的,×××可以根据帧的大小区分析帧。

       包含8中类型的帧:无效、关键帧、标准指令帧、加载模块帧、系统调用帧、污点信息帧、二号标准指令帧、意外帧。

      标准帧(stdFrame):可以记录大部分的指令。其包结构如下

      地址(4)

      线程ID(4)

      长度(1)

      原始字节(N)

      缓存映射(N)

      值(N)

        关键帧(keyframe):同步执行轨迹,在数百、数千条指令中必须插入一些关键帧,包含两个作用,其一,可以知道当前每个寄存器的值,其二,可以知道当前已经执行了多少条指令。其包结构如下

    位置(8)

    所有寄存器的值(48)

    加载模块帧:记录加载的模块信息。其包结构如下:

    XXX

   污点信息帧,等同加载模块帧具有相似的结构 

       3、帧也有可能包含一个内容表(TOC),使用这个可以快速查找特定的帧。TOC表可以通过TraceHeader.toc_offset查到。