用于跟踪CreateFile调用的Pin工具
Pin tool for tracking CreateFile calls
我已经制作了一个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
大量异常。
- 为什么有两个呼叫?
- 如果我没弄错,CreateFile应该永远不会返回0。
- 第二次调用后,它返回两次(?)
我还尝试编写了一个简单的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上,系统调用号和接口不是官方公开的,但是人们可以很容易地找到它们。
相关文章:
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在clang++预处理器中确定gcc工具链版本
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 参数化自定义CMake工具链
- 如何在QT中的自定义视频小工具t上绘制矩形
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 使用英特尔 PIN 修改寄存器
- 用于C++的静态二进制检测或二进制重写工具和框架
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 如何使用英特尔 PIN 捕获阵列的所有负载?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- Q没有管理权限的 exe 无法启动维护工具
- C++合并排序可视化工具
- 为Bazel工具链指定sysroot
- 正在编译具有依赖项的PIN工具
- 英特尔 PIN:英特尔 PIN 工具的初始设置
- 如何在非JIT模式下使用Pin工具
- PIN工具是否可以插入一个bash脚本,其中包含运行其他命令的代码
- 用于跟踪CreateFile调用的Pin工具