用于跟踪CreateFile调用的Pin工具

时间:2012-12-30 19:37:01

标签: c++ winapi intel-pin

我已经制作了一个pin工具来转储CreatFile win32调用(在我的案例中为CreateFileW)及其返回值。它看起来像这样:

/* ... */

VOID Image(IMG img, VOID *v)
{
    RTN cfwRtn = RTN_FindByName(img, "CreateFileW");
    if (RTN_Valid(cfwRtn))
    {
        RTN_Open(cfwRtn);

        RTN_InsertCall(cfwRtn, IPOINT_BEFORE, (AFUNPTR)CreateFileWArg,
        IARG_ADDRINT, "CreateFileW",
        IARG_FUNCARG_ENTRYPOINT_VALUE, 0,
        IARG_END);
        RTN_InsertCall(cfwRtn, IPOINT_AFTER, (AFUNPTR)CreateFileWafter,
        IARG_FUNCRET_EXITPOINT_VALUE, IARG_END);

        RTN_Close(cfwRtn);
    }
}

/* ... */

VOID CreateFileWArg(CHAR * name, wchar_t * filename)
{
    TraceFile << name << "(" << filename << ")" << endl;
}

VOID CreateFileWafter(ADDRINT ret)
{
    TraceFile << "\tReturned handle: " << ret << endl;
}

它给出了不可思议的结果。例如,在一个只打开现有文件而不执行任何操作的小程序上,它会给出:

CreateFileW(file.txt)
    Returned handle: 0
CreateFileW(file.txt)
    Returned handle: 0x74
    Returned handle: 0x74

很多异常现象。 1.)为什么有两个实际的电话? 2.)如果我没弄错,CreateFile应该永远不会返回0. 3.)第二次调用后,它会返回两次(?)

我还试图设法一个简单的c ++程序,直接调用CreateFileW 一次 ,结果:

CreateFileW(file.txt)
    Returned handle: 0
CreateFileW(file.txt)
    Returned handle: 0xffffffff
    Returned handle: 0xffffffff

我试图打开的文件不存在,所以返回值(-1 == INVALID_HANDLE_VALUE)至少是正确的。

有什么想法吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

好的,过了一段时间后我终于弄明白了这些问题的原因。

关于返回值,显示为0:

嗯,PIN文档说:

  

注意:IPOINT_AFTER是通过检测例程中的每个返回指令来实现的。 Pin尝试查找所有返回指令,但无法保证成功

如果在返回时转储函数的地址,则结果是0从> 返回从CreateFileW返回。它从另一个函数CreateFileW调用返回。 PIN的错误行为可以通过将CreateFileW方法包装在您自己的版本中来解决(转储参数,调用原始函数,转储返回值)。

关于两个函数调用而不是仅一个:

事实证明,在我的系统上,CreateFileW调用了Kernelbase.dll的函数,该函数具有完全相同的名称。由于我按照名称对例程进行了检测,这是正确的行为。检查kernel32.dll的映像名称解决了这个问题。

答案 1 :(得分:1)

我建议在系统调用级别捕获它,而不是在其中一个不确定的中间级别(无论它托管在哪个库中)。在Windows上,系统呼叫号码和界面没有正式公开,但无论如何都可以轻松找到它们。