用于跟踪CreateFile调用的Pin工具

Pin tool for tracking CreateFile calls

本文关键字:Pin 工具 调用 跟踪 CreateFile 用于      更新时间:2023-10-16

我已经制作了一个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)至少是正确的。

任何想法?提前感谢!

好了,经过一段时间,我终于找到了这些问题的原因。

关于返回值为0:

PIN文档说:

注意:IPOINT_AFTER是通过在例程中插入每个返回指令来实现的。Pin试图找到所有返回指令,但不能保证成功

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

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

原来,在我的系统上,CreateFileW调用到Kernelbase.dll的函数,它有完全相同的名称。由于我通过例程的名称来检测它们,所以这是正确的行为。根据kernel32.dll检查映像名称解决了这个问题。

我建议在系统调用级别捕获它,而不是在那些不确定的中间级别(无论它驻留在哪个库中)捕获它。在windows上,系统调用号和接口不是官方公开的,但是人们可以很容易地找到它们。