Скрытие файла...

Тема в разделе "WASM.NT.KERNEL", создана пользователем V1lko, 8 фев 2009.

  1. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    V1lko
    на этом сайте статьи MsRem.
    на http://www.rootkit.com/ исходники руткитов
     
  2. V1lko

    V1lko New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    53
    Статейки все его прочитал, алгоритм понятен, просто не могу реализовать это именно на ассме, а надо :dntknw:
    А исходники фиг найдёшь.

    Начал писать функцию но всё упёрлось в неумение работать с объектами :dntknw:

    Код (Text):
    1. NtOpenFileHook proc proc uses esi edi FileHandle:DWORD,IoStatusBlock:DWORD,FileInformation:DWORD,llength:DWORD, FileInformationClass:DWORD
    2. ...
    3. ...
    4. ...
    5.    je NtOpenFileHookRet  
    6.    mov eax,g_lpNtOpenFile
    7.    jmp eax
    8. NtOpenFileHookRet:  
    9.    mov eax,STATUS_ACCESS_DENIED
    10.    ret
    11. NtOpenFileHook endp
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код не мой.
    Можно изрядно его упростить.

    Код (Text):
    1. ULONG GetObjectName(HANDLE hObject, PWSTR lpwszName, ULONG dwSize)
    2. {
    3.   CHAR                   *tmpname;//[0x400];
    4.   PUNICODE_STRING         fullUniName;
    5.   NTSTATUS                NtStatus;
    6.   ULONG                   dwObjectNameLen = 0; //(by bytes)
    7.  
    8.   DbgPrintMisc(("He4hookInv: GetObjectName started!!!!!!!\n"));
    9.  
    10.   if (!lpwszName || !dwSize || KeGetCurrentIrql() > PASSIVE_LEVEL)
    11.     return 0;
    12.  
    13.   //
    14.   // Translate the hkey into a pointer
    15.   //
    16.   lpwszName[0] = 0;
    17.  
    18.   #ifndef __MISC_USE_KHEAP
    19.   tmpname = (CHAR*) ExAllocatePool(NonPagedPool, dwSize+sizeof(UNICODE_STRING));
    20.   #else
    21.   tmpname = (CHAR*) _AllocatePoolFromKHeap(hKHeapMiscDefault, dwSize+sizeof(UNICODE_STRING));
    22.   #endif //!__MISC_USE_KHEAP
    23.   if (!_MmIsAddressValid(tmpname))
    24.     return 0;
    25.   tmpname[0] = 0;
    26.  
    27.   NtStatus = ZwQueryObject(hObject, NameObjectInfo, tmpname, dwSize+sizeof(UNICODE_STRING), NULL);
    28.  
    29.   if (NT_SUCCESS(NtStatus))
    30.   {
    31.     fullUniName = &(((PNAME_OBJECT_INFO)tmpname)->Name);
    32.     dwObjectNameLen = fullUniName->Length;
    33.     if (dwSize < (sizeof(WCHAR)+dwObjectNameLen))
    34.     {
    35.       DbgPrintMisc(("He4hookInv: GetObjectName ended - ERROR!!!!!!!\n"));
    36.       #ifndef __MISC_USE_KHEAP
    37.       ExFreePool(tmpname);
    38.       #else
    39.       FreePoolToKHeap(hKHeapMiscDefault, tmpname);
    40.       #endif //!__MISC_USE_KHEAP
    41.       return 0;
    42.     }
    43. //    memset(lpwszName, 0, (sizeof(WCHAR)+fullUniName->Length));
    44.     memcpy(lpwszName, fullUniName->Buffer, dwObjectNameLen);
    45.     lpwszName[dwObjectNameLen/sizeof(WCHAR)] = 0;
    46.   }
    47.  
    48.   #ifndef __MISC_USE_KHEAP
    49.   ExFreePool(tmpname);
    50.   #else
    51.   FreePoolToKHeap(hKHeapMiscDefault, tmpname);
    52.   #endif //!__MISC_USE_KHEAP
    53.  
    54.   DbgPrintMisc(("He4hookInv: GetObjectName ended - OK!!!!!!!\n"));
    55.  
    56.   return dwObjectNameLen;
    57. }
    58.  
    59. ULONG GetObjectNameByObjectAttributes(POBJECT_ATTRIBUTES ObjectAttributes, PWSTR fullPathName, ULONG nfullPathNameSize)
    60. {
    61.   ULONG                   dwDirSize, dwNtPathNameLen;
    62.   int                     nObjectNameLen = 0;
    63.   PWSTR                   DosPathName;
    64.   NTSTATUS                NtStatus;
    65.   PWSTR                   pwszObjectName = NULL;
    66.  
    67.   if (
    68.       !_MmIsAddressValid(ObjectAttributes) ||
    69.       !_MmIsAddressValid(fullPathName)     ||
    70.       !nfullPathNameSize
    71.      )
    72.     return 0;
    73.  
    74.   fullPathName[0] = 0;
    75.   dwDirSize = 0;
    76.  
    77.   if (_MmIsAddressValid(ObjectAttributes->ObjectName))
    78.   {
    79.     if (ObjectAttributes->ObjectName->Length != 0)
    80.     {
    81.       if (_MmIsAddressValid(ObjectAttributes->ObjectName->Buffer))
    82.       {
    83.         pwszObjectName = ObjectAttributes->ObjectName->Buffer;
    84.         nObjectNameLen = ObjectAttributes->ObjectName->Length;
    85.       }
    86.     }
    87.   }
    88.  
    89.   #ifndef __MISC_USE_KHEAP
    90.   DosPathName = (PWSTR) ExAllocatePool(NonPagedPool, nfullPathNameSize);
    91.   #else
    92.   DosPathName = (PWSTR) _AllocatePoolFromKHeap(hKHeapMiscDefault, nfullPathNameSize);
    93.   #endif //!__MISC_USE_KHEAP
    94. //  DosPathName = (PWSTR)_AllocatePoolFromKHeap(hKHeapFSDefault, nfullPathNameSize);
    95.   if (DosPathName == NULL)
    96.     return 0;
    97.  
    98.   DosPathName[0] = 0;
    99.  
    100.   DbgPrintMisc(("  GetFileNameByObjectAttributes: Attributes => %08x !!!\n", ObjectAttributes->Attributes));
    101.  
    102.   if (ObjectAttributes->RootDirectory)
    103.   {
    104.     dwDirSize = GetObjectName(ObjectAttributes->RootDirectory, DosPathName, nfullPathNameSize);
    105.   }
    106.  
    107.   if (dwDirSize > 3 && pwszObjectName != NULL)
    108.   {
    109.     if (
    110.         DosPathName[(dwDirSize/sizeof(WCHAR))-1] == L'\\' &&
    111.         (pwszObjectName[0] == L'\\' || pwszObjectName[0] == L'/')
    112.        )
    113.     {
    114.       DosPathName[(dwDirSize/sizeof(WCHAR))-1] = 0;
    115.       dwDirSize -= sizeof(WCHAR);
    116.     }
    117.     else
    118.     {
    119.       if (
    120.           DosPathName[(dwDirSize/sizeof(WCHAR))-1] != L'\\' &&
    121.           (pwszObjectName[0] != L'\\' || pwszObjectName[0] != L'/')
    122.          )
    123.       {
    124.         if (dwDirSize <= (nfullPathNameSize-2*sizeof(WCHAR)))
    125.         {
    126.           DosPathName[(dwDirSize/sizeof(WCHAR))] = L'\\';
    127.           DosPathName[(dwDirSize/sizeof(WCHAR))+1] = 0;
    128.           dwDirSize += sizeof(WCHAR);
    129.         }
    130.       }
    131.     }
    132.   }
    133.  
    134.   if (pwszObjectName != NULL)
    135.   {
    136.     if (nfullPathNameSize > (nObjectNameLen+dwDirSize))
    137.     {
    138.       memcpy(((PCHAR)DosPathName+dwDirSize), pwszObjectName, nObjectNameLen);
    139.       ((PWSTR)((PCHAR)DosPathName+dwDirSize))[nObjectNameLen/sizeof(WCHAR)] = 0;
    140.     }
    141.   }
    142.  
    143.   dwNtPathNameLen = DosPathNameToNtPathName(DosPathName, fullPathName, nfullPathNameSize, 255, NULL);
    144.  
    145.   #ifndef __MISC_USE_KHEAP
    146.   ExFreePool(DosPathName);
    147.   #else
    148.   FreePoolToKHeap(hKHeapMiscDefault, DosPathName);
    149.   #endif //!__MISC_USE_KHEAP
    150.   //FreePoolToKHeap(hKHeapFSDefault, DosPathName);
    151.  
    152.   return dwNtPathNameLen;
    153. }
     
  4. V1lko

    V1lko New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    53
    Код (Text):
    1. NtOpenFile proc    
    2.               ;[eps] - адрес возврата
    3.               ;[esp+4] - FileHandle
    4.               ;[esp+8] - DesiredAccess
    5.               ;[esp+12] - ObjectAttributes
    6.               ;[esp+16] - IoStatusBlock
    7.               ;[esp+20] - ShareAccess
    8.               ;[esp+24] - OpenOptions
    9.    mov eax,[esp]
    10.    mov g_lpRet,eax   ;Сохранили адрес возврата в переменную g_lpRet
    11.    mov ebx,[esp+12]   ;В EBX указатель на структуру ObjectAttributes
    12.    assume ebx: ptr OBJECT_ATTRIBUTES
    13.    mov eax,[ebx].RootDirectory  ;В EAX хэндл объекта
    14.    assume ebx:nothing
    15.    mov ecx,esp  
    16.    mov edx,[esp+8]   ;В EDX DesiredAccess
    17.    invoke ObReferenceObjectByHandle,eax,edx,NULL,KernelMode,ecx,NULL
    18.    cmp eax,STATUS_SUCCESS   ;Проверяем, удалось ли выполнить?
    19.    jne _NtOpenFileRet
    20.    mov ebx,[esp]
    21.    assume ebx: ptr FILE_OBJECT
    22.    mov eax,[ebx].FileName.Buffer   ;В EAX указатель на строку имени файла
    23.    assume ebx:nothing
    24.    
    25. ...сравнение имени ....
    26.  
    27. _NtOpenFileJmp:
    28.    mov eax,g_lpRet
    29.    mov [esp],eax
    30.    jmp g_lpNtOpenFile
    31. _NtOpenFileRet:
    32.    mov eax,g_lpRet
    33.    mov [esp],eax
    34.    ret
    35. _NtOpenFile endp
    ObReferenceObjectByHandle возвращает ошибку :dntknw:
    Плиз, может кто видит в чём дело?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ObjectAttributes.RootDirectory может быть нулем.