Как найти ntdll.dll?

Тема в разделе "WASM.WIN32", создана пользователем solvitz, 4 апр 2011.

  1. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Как мне найти адрес указывающий внутрь ntdll сразу после того как загрузчик передал управление на мой EntryPoinnt. Можно ли мне гарантированно расчитывать, что в EDX будет указатель на KiFastSystemCallRet либо может в других регистрах или стеке находятся указатели на ntdll. Желательно, чтобы способ работал на всей линейке NT.
     
  2. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    GetModuleHandle(L"ntdll.dll");
     
  3. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Я хочу вообще без импорта обойтись. Все API которые мне нужны я потом динамически подгружу через LdrLoadDll. Мне нужен гарантированный указатель внутрь ntdll.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    mov eax, fs:[0x30] ;указатель на PEB
    дальше по базе данных загрузщика искать...
     
  5. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Что конкретно из PEB мне подойдет?
     
  6. EOT

    EOT New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2010
    Сообщения:
    181
    Код (Text):
    1. static
    2. __declspec (naked)
    3. HMODULE
    4. GetNtdllBase() // x86
    5. {
    6.     __asm
    7.     {
    8.         mov         eax, fs:[30h]
    9.         mov         eax, [eax + 0Ch]
    10.         mov         eax, [eax + 1Ch]
    11.         mov         eax, [eax + 8]
    12.         ret
    13.     }
    14. }
     
  7. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    EOT
    __readfsdword()/__readfsqword() и структурки же :)
     
  8. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Спасибо всем за ответы.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    да, тем более, что ntdll.dll каким-то магическим образом может оказаться не на предполагаемом месте в списке... нужно для верности сравнивать имена библиотек с "ntdll.dll" или с ее хешом)
     
  10. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    -- она 2-я после exe всегда, если PEB не трогали
     
  11. pr0mix

    pr0mix New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    107
    Код (Text):
    1. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    2. ;функа GetModuleBase
    3. ;получение базы модулей (системных длл) через PEB
    4. ;ВХОД:
    5. ;   push    dword - размер строки (имя модуля) в unicode
    6. ;   push    dword - хэш от этой строки
    7. ;ВЫХОД:
    8. ;   EAX              - база нужного модуля  
    9. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    10. GetModuleBase:
    11.     ;assume fs: flat
    12.     pushad            
    13.     mov ebp, esp
    14.     mov     edx, dword ptr fs:[30h]     ;get a pointer to the PEB
    15.     mov     edx, dword ptr [edx + 0Ch]  ;get PEB->Ldr
    16.     mov     edx, dword ptr [edx + 14h]  ;get the first module from the InMemoryOrder module list
    17. next_mod:
    18.     mov     esi, dword ptr [edx + 28h]  ;get pointer to modules name (unicode string)
    19.     push    dword ptr [ebp + 28h]       ;push down the length we want to check
    20.     pop     ecx             ;set ecx to this length for the loop
    21.     xor     edi, edi                ;clear edi which will store the hash of the module name
    22. loop_modname:
    23.     xor     eax, eax          
    24.     lodsb                  
    25.     cmp     al, 'a'             ;some versions of Windows use lower case module names
    26.     jl  not_lowercase
    27.     sub     al, 20h             ;if so normalise to uppercase
    28. not_lowercase:
    29.     ror     edi, 13             ;rotate right our hash value
    30.     add     edi, eax                ;add the next byte of the name to the hash
    31.     loop    loop_modname            ;loop until we have read enough
    32.     cmp     edi, dword ptr [ebp + 24h]  ;compare the hash with that of module (kernel32.dll etc);
    33.     mov     ebx, dword ptr [edx + 10h]  ;get this modules base address
    34.     mov     edx, dword ptr [edx]        ;get the next module
    35.     jne     next_mod            ;if it doesn't match, process the next module
    36.     mov dword ptr [esp + 1Ch], ebx
    37.     popad
    38.     ret 04 * 2
    39. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    40. ;конец функции GetModuleBase
    41. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx        
    42.  
    43.  
    44. ;Для нтдлл.длл вызывать так:
    45.     push    12h
    46.     push    3CFA685Dh
    47.     call    GetModuleBase
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    совсем не обязательно...
     
  13. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    пестёшь, лучше GetModuleHandle('ntdll.dll') ничо нету! xD
     
  14. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Можно через сех:
    Код (Text):
    1.     push ebp
    2.     Call @f
    3. Safe:
    4.     pop dword ptr fs:[0]
    5.     lea esp,[esp + 2*4]
    6.     pop ebp
    7.     jmp Ip
    8. @@:
    9.     Call @f
    10. ;
    11. ; Fast  SEH.
    12. ;
    13. ; EXCEPTION_DISPOSITION
    14. ; (*PEXCEPTION_ROUTINE) (               // [esp] ~ nt!ExceptionHandler2()
    15. ;     IN EXCEPTION_RECORD *ExceptionRecord,     // [esp + 4]
    16. ;     IN PVOID EstablisherFrame,            // [esp + 2*4]
    17. ;     IN OUT CONTEXT *ContextRecord,        // [esp + 3*4]
    18. ;     IN OUT PVOID DispatcherContext        // [esp + 4*4]
    19. ;     );
    20.     mov eax,dword ptr [esp]
    21.     mov esp,dword ptr [esp + 2*4]
    22.     jmp Safe
    23. @@:
    24.     push dword ptr fs:[0]
    25.     mov dword ptr fs:[0],esp
    26.     hlt
    27. Ip:
    А если лодер нэйтивный, то адрес возврата будет в нтдлл, независимо от типа колбека.