pintool 添加元数据,如radare2

逆向工程 小工具
2021-07-02 21:04:32

看看这个非常基本的 C 程序:

#include <stdio.h>
int main()
{
    printf("Hello world\n");
    return 0;
}

现在看看这个非常基本的 pintool:

#include "pin.H"
#include <stdio.h>

VOID callback_instruction(INS ins, VOID *v)
{
    printf("%lx\t%s\n", INS_Address(ins),INS_Disassemble(ins).c_str());
}

int main(int argc, char *argv[])
{
    if (PIN_Init(argc,argv))
    {
        printf("Erreur\n");
        return 0;
    }

    INS_AddInstrumentFunction(callback_instruction, 0);
    PIN_StartProgram();

    return 0;
}

这是这个 pintool 打印的内容:

....
55ef42b84139    lea rdi, ptr [rip+0xec4]
55ef42b84140    call 0x55ef42b84030
...

这是我在radare2中得到的:

|           0x00001135      55             push rbp
|           0x00001136      4889e5         mov rbp, rsp
|           0x00001139      488d3dc40e00.  lea rdi, str.Hello_world    ; 0x2004 ; "Hello world"
|           0x00001140      e8ebfeffff     call sym.imp.puts           ; int puts(const char *s)
|           0x00001145      b800000000     mov eax, 0
|           0x0000114a      5d             pop rbp
\           0x0000114b      c3             ret

如您所见,radare2 能够在注释中显示字符串的值(Hello world)和导入的函数名称(puts)。我的问题是:是否可以用 pintool 做同样的事情?

谢谢

1个回答

当然,这是可能的,但您必须自己实现逻辑:检查指令类型/操作数,获取引用的内存,尝试检测它是否看起来像一个字符串等等。对于函数名称,您需要解析二进制文件的符号表。

没有现成的 pintool 可以做到这一点(AFAIK)。