我编写了一个非常简单的Pin工具,它只包含一个工具函数,即下面的instruction
。它没有分析功能/回调。其目的是仅存储可能执行的指令的地址。
#include <cstdint>
#include <iostream>
#include <fstream>
#include <list>
#include "pin.H"
std::ofstream of1;
std::list<uint64_t> instrList;
uint64_t instrCount = 0;
VOID instruction(INS ins, VOID* v)
{
ADDRINT ip = INS_Address(ins);
of1 << ip << std::endl;
of1.flush();
instrList.push_back(ip);
++instrCount;
}
VOID finishFunc(INT32 code, VOID *v)
{
of1.close();
std::ofstream of2;
of2.open("out2.txt", std::ofstream::out);
of2 << std::hex;
for (std::list<uint64_t>::iterator i = instrList.begin(); i != instrList.end(); ++i)
of2 << *i << std::endl;
of2.close();
std::cerr << "Instruction count: " << instrCount << std::endl;
}
int main(int argc, char* argv[])
{
PIN_Init(argc, argv);
of1.open("out1.txt", std::ofstream::out);
of1 << std::hex;
INS_AddInstrumentFunction(instruction, 0);
PIN_AddFiniFunction(finishFunc, 0);
PIN_StartProgram();
return 0;
}
文件out1.txt
和out2.txt
的内容应该相同。
我将此Pin工具附加到某些程序,例如/bin/ls
。对于他们来说,out1.txt
和out2.txt
是相同的。但是,当我将其附加到gcc
编译代码时,out1.txt
会有比out2.txt
更多的行。 out2.txt
有一些等于instrCount
的行,这似乎是合理的。似乎fstream
对应out1.txt
存在问题。与out1.txt
相比,out2.txt
有许多重复的行。
这些代码段显示它们开始不同的地方(标有<
):
out1.txt:。
7f87ceb050a2
7f87ceb050a4
7f87ceb050a5
7f87ceb050a8
7f87ceb050aa
7f87ceb050b2
7f87ceb050b7
7f87ceb050b9
<7f87ceb050a4
<7f87ceb050a5
<7f87ceb050a8
<7f87ceb050aa
<7f87ceb050b2
<7f87ceb050b7
<7f87ceb050b9
<7f87ceb050b2
45218c
<7f87ceb050b7
45218e
<7f87ceb050b9
452190
out2.txt:
7f87ceb050a2
7f87ceb050a4
7f87ceb050a5
7f87ceb050a8
7f87ceb050aa
7f87ceb050b2
7f87ceb050b7
7f87ceb050b9
45218c
45218e
452190
我在PIN_LOCK
内部使用instruction
功能,但这并没有改变任何内容。我还尝试使用fprintf
写入输出文件,但问题仍然存在。
知道如何解决这个问题吗?