Доброго времени суток. Необходимо реализовать драйвер под Windows XP, Vista, 7 x86. - Который будет контролировать загрузку .dll модулей в процессы. Начал копать в сторону перехват SDT функции ZwMapViewOfSection, вроде как то что нужно, НО, когда встала задача именно фильтации, то есть необходимо получать имена модулей, то столкнулся с проблемой... ZwMapViewOfSection -> ObReferenceObjectByHandle(SectionHandle, ...) -> затем ObQueryNameString() Всё хорошо, имена получаю, НО, некоторые результаты удивляют, а именно получаю результат "(null)" где длина 8. - То есть, имена некоторых модулей не могу получить, хотя точно знаю и вижу что подгружается библиотека .dll в процесс. Код (Text): NTSTATUS ZwMapViewOfSection_New( __in HANDLE SectionHandle, __in HANDLE ProcessHandle, __inout PVOID *BaseAddress, __in ULONG_PTR ZeroBits, __in SIZE_T CommitSize, __inout_opt PLARGE_INTEGER SectionOffset, __inout PSIZE_T ViewSize, __in SECTION_INHERIT InheritDisposition, __in ULONG AllocationType, __in ULONG Win32Protect) { ULONG uProcessId = 0; KPROCESSOR_MODE mAccess = KeGetPreviousMode(); // ---- PEPROCESS curProcess = PsGetCurrentProcess(); ULONG curProcesId = (ULONG)PsGetCurrentProcessId(); // ---- PVOID pHandle; NTSTATUS nRes; // ---- ULONG uLen = 0; WCHAR buffer[512]; UNICODE_STRING tmpStr = {0, 512, buffer}; // ---- if ( curProcesId == g_Main.PID ) { nRes = ObReferenceObjectByHandle(SectionHandle, 0, NULL, KernelMode, & pHandle, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- return g_ZwMapViewOfSection.funcOriginal(SectionHandle, ProcessHandle, BaseAddress, ZeroBits, CommitSize, SectionOffset, ViewSize, InheritDisposition, AllocationType, Win32Protect); } // ---- nRes = ObQueryNameString(pHandle, (POBJECT_NAME_INFORMATION) & tmpStr, tmpStr.MaximumLength, & uLen); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("ObQueryNameString() Error: 0x%.8X;\n\0", nRes); // ---- return g_ZwMapViewOfSection.funcOriginal(SectionHandle, ProcessHandle, BaseAddress, ZeroBits, CommitSize, SectionOffset, ViewSize, InheritDisposition, AllocationType, Win32Protect); } // ---- DPRINT("ObQueryNameString: '%wZ'; uLen: %ld;\n\0", & tmpStr, uLen); } // ---- return g_ZwMapViewOfSection.funcOriginal(SectionHandle, ProcessHandle, BaseAddress, ZeroBits, CommitSize, SectionOffset, ViewSize, InheritDisposition, AllocationType, Win32Protect); } Результат: "ObQueryNameString: '(null)'; uLen: 8;" P.S. -> Что за ерунда? Каким образом можно решить данную проблему?
Мне необходимо обнаружить момент, когда процесс A.exe пытаеться добавить name.dll в процесс B.exe и при необходимости мне необходимо эту операцию заигнорить. Мне не просто необходимо получать уведомление, мне ещё необходимо отменять операцию при необходимости!
Как именно нужно отменять? - Отменять полностью, возвращая статус ошибки? - Отменять, но при этом делать вид, что фактически DLL загрузилась? Первое делается тривиально, второе сложнее и не понятно зачем. Ну так что?
Попробуй так, у меня по крайней мере работало нормально: Код (Text): NTSTATUS NewZwMapViewOfSection( IN HANDLE SectionHandle, IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN ULONG ZeroBits, IN ULONG CommitSize, IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, IN OUT PSIZE_T ViewSize, IN SECTION_INHERIT InheritDisposition, IN ULONG AllocationType, IN ULONG Protect ) { NTSTATUS status; // Сначала дадим закончить процесс проекции status = OldZwMapViewOfSection( SectionHandle, ProcessHandle, BaseAddress, ZeroBits, CommitSize, SectionOffset OPTIONAL, ViewSize, InheritDisposition, AllocationType, Protect ); if( NT_SUCCESS( status ) ) { unsigned int imageOffset = 0; VOID* pSection = NULL; unsigned int imageSection = FALSE; HANDLE hRoot = NULL; PUNICODE_STRING objectName = NULL; if( ObReferenceObjectByHandle( SectionHandle, SECTION_MAP_EXECUTE, *MmSectionObjectType, KernelMode, &pSection, NULL ) == STATUS_SUCCESS ) { // Проверить, является ли это секцией имиджа // если да - сохранить хэндл и имя объекта _asm { mov edx, pSection mov eax, [edx+14h] add eax, imageOffset mov edx, [eax] test byte ptr [edx+20h], 20h jz not_image_section mov imageSection, TRUE mov eax, [edx+24h] mov edx, [eax+4] mov hRoot, edx add eax, 30h mov objectName, eax not_image_section: }... В objectName будет имя подгружаемой библиотеки. Дальше, думаю, понятно