Прямые вызовы функций файловой системы в Windows - PullRequest
2 голосов
/ 22 января 2012

Я искал разные способы кодирования для поиска руткитов, и здесь я натолкнулся на вопрос, на самом деле, который упомянул один из способов их обнаружения - это сканирование файлов с помощью Windows API, а затем использование прямого файла.система, и посмотрите, есть ли какие-либо несоответствия (для некоторых видов руткитов).

Это заставило меня задуматься: как вы пишете код для прямого доступа к файловой системе?Какие вызовы функций будут необходимы для этого?Это что-то, что можно сделать в C ++, или мне нужно идти на сборку?

Любые ответы или рекомендации будут прекрасны!

Спасибо, -Stefan Z

Ответы [ 2 ]

4 голосов
/ 22 января 2012

Довольно просто читать вещи напрямую ...

( Редактировать: , вы даже можете сделать это без использования специфичных для 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 недокументировано, но некоторые его части документированы . Веселитесь, исследуя.

1 голос
/ 22 января 2012

С правильными разрешениями вы можете открыть диск для чтения как блочное устройство.Вы вызываете createfile по пути менеджера объектов к устройству (см. Инструмент winobj от sysinternals), например, \. \ Devices \ HardDrive0.

Оттуда вам придется читать файловую систему вручную, интерпретируя байты, которые вы читаете с диска.Это непростая задача, так как вам нужно иметь собственную реализацию fat32 или ntfs или чего-то еще.

Это единственный способ, которым я могу думать, чтобы сделать это.Возможно, вам повезет, используя реализацию fuse ntfs в качестве основы для чтения данных.

...