【发布时间】:2012-12-15 03:52:43
【问题描述】:
我制作了一个 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)至少是正确的。
有什么想法吗?提前致谢!
【问题讨论】: