Определение адреса ф-ции в ntdll.dll (напр NtCreateProcess)

Тема в разделе "WASM.NT.KERNEL", создана пользователем sasha_s, 15 июн 2009.

Статус темы:
Закрыта.
  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Хочу перехватить в ядре парочку ф-ций методом вставки кода (не через SDT), которые лежат в ntdll.dll, например NtCreateProcess...
    Но как узнать адресс?
    И вообще смогу ли я это сделать?

    Первая идея которая пришла в голову: получать в юзермоде через GetProcAddress и в ядре корректировать, если различаются базы (но думаю базы различаться не будут).
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Найти нтдлл и вручную пропарсить экспорт.
    ПРимерно так

    Код (Text):
    1. PVOID FindNtdll()
    2. {
    3.     PSYSTEM_MODULES Modules = (PSYSTEM_MODULES) GetSystemInformation (SystemModuleInformation);
    4.     PVOID Ntdll = NULL;
    5.  
    6.     if (Modules)
    7.     {
    8.         for (ULONG i=0; i<Modules->ModulesCount; i++)
    9.         {
    10.             _strlwr (Modules->Modules[i].ImageName);
    11.  
    12.             if (strstr (Modules->Modules[i].ImageName, "ntdll"))
    13.             {
    14.                 Ntdll = Modules->Modules[i].Base;
    15.                 break;
    16.             }
    17.         }
    18.  
    19.         ExFreePool (Modules);
    20.     }
    21.  
    22.     return Ntdll;
    23. }
    24.  
    25. PVOID
    26. FindImageProcedureByNameOrPointer(
    27.     IN PVOID Base,
    28.     IN PCHAR FunctionName OPTIONAL,
    29.     IN PVOID FunctionEntry OPTIONAL
    30.     )
    31. {
    32.     PIMAGE_DOS_HEADER mz;
    33.     PIMAGE_FILE_HEADER pfh;
    34.     PIMAGE_OPTIONAL_HEADER poh;
    35.     PIMAGE_EXPORT_DIRECTORY pexd;
    36.     PULONG AddressOfFunctions;
    37.     PULONG AddressOfNames;
    38.     PUSHORT AddressOfNameOrdinals;
    39.     ULONG i;
    40.    
    41.     // Get headers
    42.     *(PUCHAR*)&mz = (PUCHAR)Base;
    43.     *(PUCHAR*)&pfh = (PUCHAR)Base + mz->e_lfanew + sizeof(IMAGE_NT_SIGNATURE);
    44.     *(PIMAGE_FILE_HEADER*)&poh = pfh + 1;
    45.  
    46.     // Get export
    47.     *(PUCHAR*)&pexd = (PUCHAR)Base + poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
    48.     *(PUCHAR*)&AddressOfFunctions = (PUCHAR)Base + pexd->AddressOfFunctions;
    49.     *(PUCHAR*)&AddressOfNames = (PUCHAR)Base + pexd->AddressOfNames;
    50.     *(PUCHAR*)&AddressOfNameOrdinals = (PUCHAR)Base + pexd->AddressOfNameOrdinals;
    51.  
    52.     // Find function
    53.     for( i=0; i<pexd->NumberOfNames; i++ )
    54.     {
    55.         PCHAR name = ((char*)Base + AddressOfNames[i]);
    56.         PVOID addr = (PVOID*)((ULONG)Base + AddressOfFunctions[AddressOfNameOrdinals[i]]);
    57.  
    58.         if (ARGUMENT_PRESENT (FunctionName))
    59.         {
    60.             if( !strcmp( name, FunctionName ) )
    61.             {
    62.                 return addr;
    63.             }
    64.         }
    65.         else if (ARGUMENT_PRESENT (FunctionEntry))
    66.         {
    67.             if (FunctionEntry == addr)
    68.                 return name;
    69.         }
    70.         else
    71.         {
    72.             ASSERTMSG ("SHOULD NOT REACH HERE", ARGUMENT_PRESENT(FunctionName) || ARGUMENT_PRESENT(FunctionEntry));
    73.         }
    74.     }
    75.    
    76.     return NULL;
    77. }
    Дальше сделать этим страницам ZwProtectVirtualMemory на запись и редактировать код.

    какие базы и где?
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    При инициализации ядра ntdll.dll мапится в процесс System, секция не освобождается, далее она при инициализации адресного пространства процесса в PsMapSystemDll() мапится в текущий процесс.
    Ядро знает про ntdll только для реализации механизма ядреных калбаков(экспорт в ней как Ki*). В остальном нечего особенного в этом модуле нет. Стубы - их многие модуля содержат, как например user32.dll
    Обработчики сервисов лежат в ядре, ничего общего с ntdll не имеют, разве только имена.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Сервисы находятся в ядре. А гетпроцаддресс в юзермоде. Нтдлл со стабами, которые делают только свич в ядро - тоже в юзермоде.
    Чтобы перехватить сервисы тебе нужно либо править указатели в сдт, либо укзатель на таблицу в KeServiceDescriptorTabble (а ля KIS), либо указатель в ETHREAD, либо сплайсить начало сервиса.

    Ни ntdll, ни GetProcAddress не имеют ни малейшего отношения к сервисам и ядру.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Память начиная с виртуального адреса MmSystemRangeStart это системное адресное пространство(>= 0x80000000), общее для всех процессов. Сдесь находится ядро и остальные системные модуля. Из юзермода эта память не доступна. ntdll отображается в пользовательское адресное пространство, ниже этого адреса, оно уникально для каждого процесса и для доступа к нему необходимо каталог страниц перезагружать, выполняя аттачь к процессу. Тоесть в ядре нет ntdll, но этот модуль отображён в пользовательское адресное пространство. Информация об ntdll которая содержится в слепке(SystemModuleInformaion) не описывает ядреные модуля, вобщем эта инфа состоит из 2-х частей, первая часть это список системных модулей(драйвера) которая и содержится в PsLoadedModuleList, вторая часть это список пользовательских модулей определённый в MmLoadedUserImageList, в последнем находится ntdll и отладочные символы(если они есть). Поэтому и база тут для ntdll оригинальная и находится в хидере оного модуля. Из ntdll можно извлекать номера сервисов, остальную работу следует выполнять с ядром(нтос).
     
Статус темы:
Закрыта.