Windows上的直接文件系统函数调用

时间:2012-01-22 01:56:09

标签: c++ windows file system call

我正在寻找不同的编码方法来查找rootkit,我在这里提出了一个问题,实际上,提到一种检测它们的方法是使用windows API扫描文件,然后使用直接文件系统,看看是否有任何差异(对于某些类型的rootkit)。

这让我提出疑问:你如何编写代码来直接访问文件系统?这需要什么样的函数调用?这可以用C ++完成,还是需要进行汇编?

任何答案或指导都很可爱!

谢谢你, -Stefan Z

2 个答案:

答案 0 :(得分:4)

直接读取内容非常容易......

编辑:您甚至可以在不使用特定于Windows的标题文件的情况下执行此操作 - 请参阅下文。)

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    FILE *volume = fopen("\\\\.\\C:", "r");
    if (volume)
    {
        long long offset = 0;  // Sector-aligned offset
        setbuf(volume, NULL);  // Disable buffering

        if (_fseeki64(volume, offset, SEEK_SET) == 0)
        {
            char buf[1024];  // Multiple of sector size
            size_t cb = fread(buf, sizeof(*buf), _countof(buf), volume);

            // Process the data
        }
        fclose(volume);
    }
    return 0;
}

困难的部分是找出要阅读的 以及如何解读它。

关于NTFS的很多内容都没有记录,但是some parts of it are documented。有趣的研究。

答案 1 :(得分:1)

使用正确的权限,您可以打开磁盘以作为块设备进行读取。您可以在设备的对象管理器路径上调用createfile(请参阅sysinternals中的winobj工具),例如\。\ Devices \ HardDrive0。

从那里你必须通过解释从磁盘读取的字节来手动读取文件系统。这不是一件容易的事,因为你必须有一个自定义的fat32或ntfs或者其他的实现。

这是我能想到的唯一方法。您可能很幸运使用ntfs的fuse实现作为读取数据的基础。