1

我正在对可执行文件及其相关共享库执行一些简单的检测任务,将所有执行的指令记录在主文件以及共享库中。

但是,Pin总是抛出

Pin is out of memory: MmapChecked 

仪器仪表期间。由于我在 32 位系统上工作,每次达到 3G 左右的内存消耗时,检测过程都会崩溃。

我想在这个 32 位系统上工作,因为这个平台上有很多共享库。另一方面,因为实际上我只对一个共享库感兴趣,所以我正在考虑找到一种方法,只在主可执行文件和那个特殊库中记录执行的指令。

但是,我不知道是否/如何做到这一点。现在在仪器之前,我的设置是:

PIN_LockClient();
IMG img = IMG_FindByAddress(INS_Address(ins));
PIN_UnlockClient();

// if (IMG_Valid(img) && IMG_IsMainExecutable(img)){
if (IMG_Valid(img)) {           <--------------------- this line
    INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)insCallBack,
                   IARG_BOOL,
                   IARG_ADDRINT, INS_Address(ins),
                   IARG_PTR, new string(INS_Disassemble(ins)),
                   IARG_CONTEXT,
                   IARG_ADDRINT, INS_NextAddress(ins),
                   IARG_END);

}

如您所见,我没有检查是否正在检测主可执行文件,这意味着我应该能够检测所有库。

我的测试平台是 32 位 x86 Ubuntu 14.04。并且测试目标是 32 位 ELF 二进制代码。

所以我的问题是:鉴于我的情况,我是否应该配置为仅检测我感兴趣的库以克服内存异常?如果是这样,我该怎么做?

4

1 回答 1

1

使用 IMG_Name 获取 pin 看到的文件名,并将其与感兴趣的共享对象进行比较。InstLib 提供了一个插入式的实现,但你自己很容易做到。

于 2016-09-07T07:19:12.797 回答