Статейки все его прочитал, алгоритм понятен, просто не могу реализовать это именно на ассме, а надо А исходники фиг найдёшь. Начал писать функцию но всё упёрлось в неумение работать с объектами Код (Text): NtOpenFileHook proc proc uses esi edi FileHandle:DWORD,IoStatusBlock:DWORD,FileInformation:DWORD,llength:DWORD, FileInformationClass:DWORD ... ... ... je NtOpenFileHookRet mov eax,g_lpNtOpenFile jmp eax NtOpenFileHookRet: mov eax,STATUS_ACCESS_DENIED ret NtOpenFileHook endp
Код не мой. Можно изрядно его упростить. Код (Text): ULONG GetObjectName(HANDLE hObject, PWSTR lpwszName, ULONG dwSize) { CHAR *tmpname;//[0x400]; PUNICODE_STRING fullUniName; NTSTATUS NtStatus; ULONG dwObjectNameLen = 0; //(by bytes) DbgPrintMisc(("He4hookInv: GetObjectName started!!!!!!!\n")); if (!lpwszName || !dwSize || KeGetCurrentIrql() > PASSIVE_LEVEL) return 0; // // Translate the hkey into a pointer // lpwszName[0] = 0; #ifndef __MISC_USE_KHEAP tmpname = (CHAR*) ExAllocatePool(NonPagedPool, dwSize+sizeof(UNICODE_STRING)); #else tmpname = (CHAR*) _AllocatePoolFromKHeap(hKHeapMiscDefault, dwSize+sizeof(UNICODE_STRING)); #endif //!__MISC_USE_KHEAP if (!_MmIsAddressValid(tmpname)) return 0; tmpname[0] = 0; NtStatus = ZwQueryObject(hObject, NameObjectInfo, tmpname, dwSize+sizeof(UNICODE_STRING), NULL); if (NT_SUCCESS(NtStatus)) { fullUniName = &(((PNAME_OBJECT_INFO)tmpname)->Name); dwObjectNameLen = fullUniName->Length; if (dwSize < (sizeof(WCHAR)+dwObjectNameLen)) { DbgPrintMisc(("He4hookInv: GetObjectName ended - ERROR!!!!!!!\n")); #ifndef __MISC_USE_KHEAP ExFreePool(tmpname); #else FreePoolToKHeap(hKHeapMiscDefault, tmpname); #endif //!__MISC_USE_KHEAP return 0; } // memset(lpwszName, 0, (sizeof(WCHAR)+fullUniName->Length)); memcpy(lpwszName, fullUniName->Buffer, dwObjectNameLen); lpwszName[dwObjectNameLen/sizeof(WCHAR)] = 0; } #ifndef __MISC_USE_KHEAP ExFreePool(tmpname); #else FreePoolToKHeap(hKHeapMiscDefault, tmpname); #endif //!__MISC_USE_KHEAP DbgPrintMisc(("He4hookInv: GetObjectName ended - OK!!!!!!!\n")); return dwObjectNameLen; } ULONG GetObjectNameByObjectAttributes(POBJECT_ATTRIBUTES ObjectAttributes, PWSTR fullPathName, ULONG nfullPathNameSize) { ULONG dwDirSize, dwNtPathNameLen; int nObjectNameLen = 0; PWSTR DosPathName; NTSTATUS NtStatus; PWSTR pwszObjectName = NULL; if ( !_MmIsAddressValid(ObjectAttributes) || !_MmIsAddressValid(fullPathName) || !nfullPathNameSize ) return 0; fullPathName[0] = 0; dwDirSize = 0; if (_MmIsAddressValid(ObjectAttributes->ObjectName)) { if (ObjectAttributes->ObjectName->Length != 0) { if (_MmIsAddressValid(ObjectAttributes->ObjectName->Buffer)) { pwszObjectName = ObjectAttributes->ObjectName->Buffer; nObjectNameLen = ObjectAttributes->ObjectName->Length; } } } #ifndef __MISC_USE_KHEAP DosPathName = (PWSTR) ExAllocatePool(NonPagedPool, nfullPathNameSize); #else DosPathName = (PWSTR) _AllocatePoolFromKHeap(hKHeapMiscDefault, nfullPathNameSize); #endif //!__MISC_USE_KHEAP // DosPathName = (PWSTR)_AllocatePoolFromKHeap(hKHeapFSDefault, nfullPathNameSize); if (DosPathName == NULL) return 0; DosPathName[0] = 0; DbgPrintMisc((" GetFileNameByObjectAttributes: Attributes => %08x !!!\n", ObjectAttributes->Attributes)); if (ObjectAttributes->RootDirectory) { dwDirSize = GetObjectName(ObjectAttributes->RootDirectory, DosPathName, nfullPathNameSize); } if (dwDirSize > 3 && pwszObjectName != NULL) { if ( DosPathName[(dwDirSize/sizeof(WCHAR))-1] == L'\\' && (pwszObjectName[0] == L'\\' || pwszObjectName[0] == L'/') ) { DosPathName[(dwDirSize/sizeof(WCHAR))-1] = 0; dwDirSize -= sizeof(WCHAR); } else { if ( DosPathName[(dwDirSize/sizeof(WCHAR))-1] != L'\\' && (pwszObjectName[0] != L'\\' || pwszObjectName[0] != L'/') ) { if (dwDirSize <= (nfullPathNameSize-2*sizeof(WCHAR))) { DosPathName[(dwDirSize/sizeof(WCHAR))] = L'\\'; DosPathName[(dwDirSize/sizeof(WCHAR))+1] = 0; dwDirSize += sizeof(WCHAR); } } } } if (pwszObjectName != NULL) { if (nfullPathNameSize > (nObjectNameLen+dwDirSize)) { memcpy(((PCHAR)DosPathName+dwDirSize), pwszObjectName, nObjectNameLen); ((PWSTR)((PCHAR)DosPathName+dwDirSize))[nObjectNameLen/sizeof(WCHAR)] = 0; } } dwNtPathNameLen = DosPathNameToNtPathName(DosPathName, fullPathName, nfullPathNameSize, 255, NULL); #ifndef __MISC_USE_KHEAP ExFreePool(DosPathName); #else FreePoolToKHeap(hKHeapMiscDefault, DosPathName); #endif //!__MISC_USE_KHEAP //FreePoolToKHeap(hKHeapFSDefault, DosPathName); return dwNtPathNameLen; }
Код (Text): NtOpenFile proc ;[eps] - адрес возврата ;[esp+4] - FileHandle ;[esp+8] - DesiredAccess ;[esp+12] - ObjectAttributes ;[esp+16] - IoStatusBlock ;[esp+20] - ShareAccess ;[esp+24] - OpenOptions mov eax,[esp] mov g_lpRet,eax ;Сохранили адрес возврата в переменную g_lpRet mov ebx,[esp+12] ;В EBX указатель на структуру ObjectAttributes assume ebx: ptr OBJECT_ATTRIBUTES mov eax,[ebx].RootDirectory ;В EAX хэндл объекта assume ebx:nothing mov ecx,esp mov edx,[esp+8] ;В EDX DesiredAccess invoke ObReferenceObjectByHandle,eax,edx,NULL,KernelMode,ecx,NULL cmp eax,STATUS_SUCCESS ;Проверяем, удалось ли выполнить? jne _NtOpenFileRet mov ebx,[esp] assume ebx: ptr FILE_OBJECT mov eax,[ebx].FileName.Buffer ;В EAX указатель на строку имени файла assume ebx:nothing ...сравнение имени .... _NtOpenFileJmp: mov eax,g_lpRet mov [esp],eax jmp g_lpNtOpenFile _NtOpenFileRet: mov eax,g_lpRet mov [esp],eax ret _NtOpenFile endp ObReferenceObjectByHandle возвращает ошибку Плиз, может кто видит в чём дело?