здравствуйте! я реализую так: Код (Text): NTSTATUS (*RealZwQueryDirectoryFile)(IN HANDLE, IN HANDLE, IN PIO_APC_ROUTINE, IN PVOID, OUT PIO_STATUS_BLOCK, OUT PVOID, \ IN ULONG, IN FILE_INFORMATION_CLASS, IN BOOLEAN, IN PUNICODE_STRING, IN BOOLEAN); NTSTATUS NewZwQueryDirectoryFile( IN HANDLE FileHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PVOID FileInformation, IN ULONG FileInformationLength, IN FILE_INFORMATION_CLASS FileInformationClass, IN BOOLEAN ReturnSingleEntry, IN PUNICODE_STRING FileName OPTIONAL, IN BOOLEAN RestartScan) { NTSTATUS status; RealZwQueryDirectoryFile = (NTSTATUS (__cdecl *)(void*, void*, PIO_APC_ROUTINE, void*, IO_STATUS_BLOCK* , void*, ULONG, FILE_INFORMATION_CLASS, BOOLEAN, UNICODE_STRING*, BOOLEAN))(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQueryDi rectoryFile"); status = (NTSTATUS)RealZwQueryDirectoryFile; if (NT_SUCCESS(status)) { PFILE_FULL_DIRECTORY_INFORMATION FileDirectoryInfo, LastFileDirectoryInfo; PFILE_FULL_DIRECTORY_INFORMATION LastFileFullDirectoryInfo, FileFullDirectoryInfo; PFILE_BOTH_DIRECTORY_INFORMATION LastFileBothDirectoryInfo, FileBothDirectoryInfo; PFILE_NAMES_INFORMATION LastFileNamesInfo, FileNamesInfo; ULONG Offset = 0; switch (FileInformationClass) { case FileDirectoryInformation : FileDirectoryInfo = NULL; do { FileDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset); LastFileDirectoryInfo = FileDirectoryInfo; if (FileDirectoryInfo->FileName[0] == 0x55) { if (!FileDirectoryInfo->NextEntryOffset) { if (LastFileDirectoryInfo) LastFileDirectoryInfo->NextEntryOffset = 0; else status = STATUS_NO_SUCH_FILE; return status; } else if (LastFileDirectoryInfo) LastFileDirectoryInfo->NextEntryOffset += FileDirectoryInfo->NextEntryOffset; } Offset += FileDirectoryInfo->NextEntryOffset; } while (FileDirectoryInfo->NextEntryOffset); break; case FileFullDirectoryInformation : FileFullDirectoryInfo = NULL; do { LastFileFullDirectoryInfo = FileFullDirectoryInfo; FileFullDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset); if (FileFullDirectoryInfo->FileName[0] == 0x55) { if (!FileFullDirectoryInfo->NextEntryOffset) { if (LastFileFullDirectoryInfo) LastFileFullDirectoryInfo->NextEntryOffset = 0; else status = STATUS_NO_SUCH_FILE; return status; } else if (LastFileFullDirectoryInfo) LastFileFullDirectoryInfo->NextEntryOffset += FileFullDirectoryInfo->NextEntryOffset; } Offset += FileFullDirectoryInfo->NextEntryOffset; } while (FileFullDirectoryInfo->NextEntryOffset); break; case FileBothDirectoryInformation : FileBothDirectoryInfo = NULL; do { LastFileBothDirectoryInfo = FileBothDirectoryInfo; FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset); if (FileBothDirectoryInfo->FileNameLength > 1 && FileBothDirectoryInfo->FileName[0] == 0x55) { if (!FileBothDirectoryInfo->NextEntryOffset) { if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0; else status = STATUS_NO_SUCH_FILE; return status; } else if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; } Offset += FileBothDirectoryInfo->NextEntryOffset; } while (FileBothDirectoryInfo->NextEntryOffset); break; case FileNamesInformation : FileNamesInfo = NULL; do { LastFileNamesInfo = FileNamesInfo; FileNamesInfo = (PFILE_NAMES_INFORMATION)((ULONG)FileInformation + Offset); if (FileNamesInfo->FileName[0] == 0x55) { if (!FileNamesInfo->NextEntryOffset) { if(LastFileNamesInfo) LastFileNamesInfo->NextEntryOffset = 0; else status = STATUS_NO_SUCH_FILE; return status; } else if (LastFileNamesInfo) LastFileNamesInfo->NextEntryOffset += FileNamesInfo->NextEntryOffset; } Offset += FileNamesInfo->NextEntryOffset; } while (FileNamesInfo->NextEntryOffset); break; } } return status; } после этого делаю нечто вроде Код (Text): ReplaceIATEntryInAllMods("ntdll.dll", GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQueryDirectoryFile"), (PROC)NewZwQueryDirectoryFile); но при инжекте в любой процесс, будь то totalcmd.exe или еще какой, процесс падает =( не могли бы вы показать маленьки рабочий пример правильного перехвата. буду очень признателен!!!
Недавно сам реализовывал, правда в ядре, проверь структуру FILE_BOTH_DIRECTORY_INFORMATION, во многоих источниках неправильно составлена структура. Ищи пост MS Rema, он недавно выкладывал правильный вариант, вполне возможно ошибка тут
Уж очень ты странно вызываешь RealZwQueryDirectoryFile. 1. Ты уверен, что твоя и оригинальные процедуры должны быть _cdecl, а не _stdcall? 2. Вызвать RealZwQueryDirectoryFile ты должен как-то так status = (*RealZwQueryDirectoryFile)(FileHandle, Event, ... далее идут другие параметры... );
Да, точно, нужны только stdcall'овские процедуры. psw1 молодец. При _cdecl стек не очищается от параметров процедурой, и программа получает не ту вершину стека, на которую рассчитывала. Да и лучше б ты на asm'е написал, читать проще было бы.