Winapi ReadFile 监视器

逆向工程 登录 函数挂钩
2021-07-06 19:35:36

我正在尝试制作一个小型代理 dll,它将能够打印出游戏尝试从磁盘访问的所有文件。

我正在使用 dinput8 包装器 dll 作为我的代理 dll,从中我设法附加了一个控制台并打印出一些东西。但我想我不明白我应该如何挂钩 ReadFile 函数。

首先,我不确定这是否可能,因为我想为 ReadFile 创建和导出一个包装函数,它的声明与我要包装的 dll 位于完全不同的 dll 中。

我现在正在尝试(并且它不起作用)是声明一个 ReadFile_wrapper 函数,它现在实际上正在调用原始函数:

extern "C" BOOL WINAPI ReadFile_wrapper(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
                        LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
{
    MessageBoxA(NULL, "Reading", "", 0);
    return ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
}

此外,我在 .def 文件中声明了一个定义,以便导出函数的名称类似于原始 ReadFile 函数

...
ReadFile=ReadFile_wrapper

我显然在这里遗漏了一些关键的东西,所以非常感谢任何帮助。

3个回答

为什么不使用现有工具来完成这项工作?

如果您只是想监控哪些文件被访问,我建议您使用Process MonitorProcess Monitor是 Windows 的高级监控工具,可显示实时文件系统、注册表和进程/线程活动。

进程监视器截图 进程监控进程详情截图

如果您想查看正在读取或写入的数据,我建议您使用Rohitab API MonitorAPI Monitor是一款免费软件,可让您监控和控制应用程序和服务进行的 API 调用。它是查看应用程序和服务如何工作或跟踪您自己的应用程序中存在的问题的强大工具。

Rohitab API 监视器屏幕截图 Rohitab 读取文件 Rohitab 查看缓冲区

这两个工具都是免费的。

我建议使用hooking

挂钩时,您可以在要在内存中挂钩的函数开始处修补一些字节以重定向到您自己的代码。完成您想要的任何操作后,您就可以返回到原始实现。

有各种教程和实现可以为您做到这一点。

也许是开始您的好资源。祝你好运。

这是我的绕行功能:

const void* DetourFunc(BYTE* const src, const BYTE* dest, const DWORD length)
    {
        BYTE* jump = new BYTE[length + 5];
        for (int i = 0; i < sizeof(detourBuffer) / sizeof(void*); ++i)
        {
            if (!detourBuffer[i])
            {
                detourBuffer[i] = jump;
                break;
            }
        }

        DWORD dwVirtualProtectBackup;
        VirtualProtect(src, length, PAGE_READWRITE, &dwVirtualProtectBackup);

        memcpy(jump, src, length);
        jump += length;

        jump[0] = 0xE9;
        *(DWORD*)(jump + 1) = (DWORD)(src + length - jump) - 5;

        src[0] = 0xE9;
        *(DWORD*)(src + 1) = (DWORD)(dest - src) - 5;

        VirtualProtect(src, length, dwVirtualProtectBackup, &dwVirtualProtectBackup);

        return jump - length;
    }

用法: DetourFunc ((BYTE*)oFuncAddr, (BYTE*)&hkFunc, 5);