C++ 用于跟踪CreateFile调用的Pin工具

C++ 用于跟踪CreateFile调用的Pin工具,c++,winapi,intel-pin,C++,Winapi,Intel Pin,我制作了一个pin工具来转储createfile win32调用(在我的例子中是CreateFileW)及其返回值。看起来是这样的: /* ... */ VOID Image(IMG img, VOID *v) { RTN cfwRtn = RTN_FindByName(img, "CreateFileW"); if (RTN_Valid(cfwRtn)) { RTN_Open(cfwRtn); RTN_InsertCall(cfwRt

我制作了一个pin工具来转储createfile 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;
}
很多异常现象。1.)为什么实际有两个电话?2.)如果我没有弄错,CreateFile永远不会返回0。3.)在第二次调用之后,它返回两次(?)

我还尝试了一个简单的C++程序,即<强>直接< /强>调用CreateFileW <强>曾经>,结果:

CreateFileW(file.txt)
    Returned handle: 0
CreateFileW(file.txt)
    Returned handle: 0xffffffff
    Returned handle: 0xffffffff
我试图打开的文件不存在,因此返回值(-1==无效的\u句柄\u值)至少是正确的


有什么想法吗?提前谢谢

好吧,过了一段时间,我终于找出了这些问题的原因

关于返回值显示为0: 嗯,PIN文件说:

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

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

关于两个函数调用而不是一个函数调用:
事实证明,在我的系统上,CreateFileW调用了Kernelbase.dll的函数,该函数具有完全相同的名称。因为我根据例程的名称来检测它们,所以这是正确的行为。根据kernel32.dll检查映像名解决了这个问题。

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

但是我们如何区分从主应用程序发出的系统调用和从非主应用程序发出的系统调用呢?看看Nt和Zw函数@Maysara Alhindi:这是一个很好的观点。尽管这取决于主应用程序。我会试着用他们的论点来过滤他们。您应该有来自主应用程序的关于系统调用参数的提示。如果不是,这确实不是正确的解决方案。感谢您提供了宝贵的信息,介绍了在尝试为此类函数添加工具时可能遇到的此类经典(但不可预测)陷阱。
CreateFileW(file.txt)
    Returned handle: 0
CreateFileW(file.txt)
    Returned handle: 0xffffffff
    Returned handle: 0xffffffff