Перехватить NtReadFile. Изменить текст

#c #winapi #hook #wdk

#c #winapi #перехват #wdk

Вопрос:

Я хочу подключить NtReadFile, чтобы он мог изменять текст, считываемый из файла. Но когда я пытаюсь прочитать файл, я получаю сообщение «Это приложение не удалось запустить, потому что конфигурация приложения неверна».

Вот мой код. Что не так?

 NTSTATUS HookNtReadFile (
    IN HANDLE FileHandle,
    IN HANDLE Event,
    IN PIO_APC_ROUTINE ApcRoutine,
    IN PVOID ApcContext,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    OUT PVOID Buffer,
    IN ULONG Length,
    IN PLARGE_INTEGER ByteOffset,
    IN PULONG Key) 
{
    NTSTATUS retstatus;

    retstatus = glRealNtReadFile (FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key);

    IoStatusBlock->Information = 3;
    Length = 3;
    Buffer = ExAllocatePool(PagedPool, Length);
    Buffer = "hi";

    return retstatus;
}
  

Комментарии:

1. Вы пробовали шаги , перечисленные для этого сообщения об ошибке?

2. Почему вы пытаетесь это сделать?

3. @andlabs это одно из моих заданий в университете. Я сделал другие перехваты (NtCreateFile, NtOpenFile …), Но с NtReadFile у меня возникли некоторые проблемы.

4. Вы должны быть осторожны с тем, что вы подключаете. Похоже, вы заменяете каждый прочитанный файл "hi" . Это может помешать Windows читать ваш исполняемый файл или вспомогательные файлы, такие как манифест в данном случае. Попробуйте изменить только результат определенных вызовов определенных файлов или с помощью определенных программ.

Ответ №1:

Это явно не сработает:

 Buffer = ExAllocatePool(PagedPool, Length);
Buffer = "hi";
  

Вы выделяете память, а затем немедленно отбрасываете этот адрес. Это не то, как вы копируете строки в C. Вам нужно использовать strcpy или, предпочтительно, одну из более безопасных альтернатив.

Также стоит отметить, что собственный API не использует символы ASCII. В общем случае ожидается, что все строки будут широкими строками.

Наконец, вы должны изменять значения только в том случае, если код возврата указывает на успех, и (как указывали другие в комментариях), когда дескриптор файла связан с конкретным файлом, который вы пытаетесь изменить.

Ответ №2:

http://www.rohitab.com/discuss/topic/40492-my-first-kernel-mode-rootkit/

Я знаю, что это выглядит как сомнительная ссылка. Но ответ, который вы ищете, можно найти одним щелчком мыши.