перехват функции NtCreateThread как получить имя процесса и адресс?

Тема в разделе "WASM.BEGINNERS", создана пользователем foxhunter, 12 мар 2007.

  1. foxhunter

    foxhunter New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    вообще задача написать драйвер который отменяет загрузку процесса с заданным именем до загрузки его первичного потока

    перехват делаю подменой адресса в SDT (как описано в статье "Перехват API функций в Windows NT (часть 3). Нулевое кольцо.")
    при перехвате NtCreateProcess ничего не происходит (т.е. при старте процесса код моей newNtCreateProcess не выполняется)
    решил перехватывать NtCreateThread
    она вроде как перехватывается, но не знаю как узнать имя и адресс (на винте) процесса
    нашел какую-то функцию NtQueryInformationProcess но она возвращает STATUS_ACCESS_VIOLATION

    подскажите ченибудь
     
  2. wasm_test

    wasm_test wasm test user

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

    эта как?

    получить структуру EPROCESS для процесса, там есть имя вроде бы.
     
  3. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Код (Text):
    1. __declspec(naked) NTSTATUS _ZwQueryInformationThread(
    2.     HANDLE      ThreadHandle,
    3.     THREADINFOCLASS ThreadInformationClass,
    4.     PVOID           ThreadInformation,
    5.     ULONG       ThreadInformationLength,
    6.     PULONG      ReturnLength)
    7. {
    8.     __asm
    9.     {
    10.         cmp     SDT_ZwQueryInformationThread,000h
    11.         jz      failed
    12.         mov     eax,SDT_ZwQueryInformationThread
    13.         lea     edx,[esp+004h]
    14.         int     02Eh
    15.         retn    00014h
    16.    
    17.         failed:
    18.         mov     eax,0xC00000001     // STATUS_UNSUCCESSFUL
    19.         retn    00014h
    20.     }
    21. }
    22.  
    23. // ...
    24.  
    25. NTSTATUS ns;
    26. THREAD_BASIC_INFORMATION ThreadInf;
    27. ULONG ProcId;
    28.  
    29. ns = _ZwQueryInformationThread(*ThreadHandle, ThreadBasicInformation, &ThreadInf, sizeof(ThreadInf), NULL);
    30. if (NT_SUCCESS(ns))
    31. {
    32.     ProcId = (ULONG)ThreadInf.ClientId.UniqueProcess;
    33.  
    34.     DbgMsg("ZwCreateThread() PID:%d\n", ProcId);
    35. }
    36.  
    37. // ...
    как получить имя по PID-у поищи на форуме...

    >> получить структуру EPROCESS для процесса, там есть имя вроде бы.
    там только имя, полный путь к бинарнику нужно из PEB вытаскивать
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну не суть) PEB читается как раз плюнуть. тока сначала конечно базу fs надо вычислить.
    В ринг3 это GetThreadSelectorEntry - основана на ntdll.ZwQueryInformationThread, аналогично и в ядре можно. а потом ZwReadVirtualMemory.
     
  5. foxhunter

    foxhunter New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Код (Text):
    1. NTSTATUS NewNtCreateThread(OUT PHANDLE ThreadHandle,
    2.                             IN ACCESS_MASK DesiredAccess,
    3.                             IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    4.                             IN HANDLE ProcessHandle,
    5.                             OUT PCLIENT_ID ClientId,
    6.                             IN PCONTEXT ThreadContext,
    7.                             IN PINITIAL_TEB UserStack,
    8.                             IN BOOLEAN CreateSuspended)
    9. {
    10.     DPRINT("PID = %d",ClientId->UniqueProcess);
    11.  
    12.     return TrueNtCreateThread(ThreadHandle,
    13.                               DesiredAccess,
    14.                               ObjectAttributes,
    15.                               ProcessHandle,
    16.                               ClientId,
    17.                               ThreadContext,
    18.                               UserStack,
    19.                               CreateSuspended);
    20. }
    в общем вот, перехватывает вроде она все, только Pid в основном выдает какие-то левые, из тех что совпадают, это svhost, lsass ну и бездействие системы (0)
    при запуске calc.exe например выдает -1,

    может я не ту функцию перехватываю,
    а чем отличаются Nt функции от Zw?
    какаято из них заглушка я так понял

    Cr4sh в твоем коде THREAD_BASIC_INFORMATION структура
    я ее в заголовках DDK не нашел
    и вот эта переменная SDT_ZwQueryInformationThread откуда взялась

    если че, сильно не пинайте, я слово DDK только неделю назад услишал
     
  6. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Cr4sh в твоем коде THREAD_BASIC_INFORMATION структура я ее в заголовках DDK не нашел
    она не документирована
    Код (Text):
    1. typedef struct THREAD_BASIC_INFORMATION
    2. {
    3.     NTSTATUS    ExitStatus;
    4.     PVOID       TebBaseAddress;
    5.     CLIENT_ID   ClientId;
    6.     KAFFINITY   AffinityMask;
    7.     KPRIORITY   Priority;
    8.     KPRIORITY   BasePriority;
    9.  
    10. } THREAD_BASIC_INFORMATION,
    11. *PTHREAD_BASIC_INFORMATION;
    >> вот эта переменная SDT_ZwQueryInformationThread откуда взялась
    это номер ф-ции ZwQueryInformationThread в таблице системных сервисов
     
  7. foxhunter

    foxhunter New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    так
    1-е SDT_ZwQueryInformationThread как этот номер получить?
    у меня файл с адресами есть, но там только Nt функции

    2-е так почему у меня в вышеописанном коде Client_ID половину левые значения возвращает, причем при запуске процесса она 100% срабатывает (что-то запускаю, и DPRINT моментально PID возвращает), т.е. создание потока вроде как перехватует,может я не тем путем иду?
     
  8. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> у меня файл с адресами есть, но там только Nt функции
    без разницы

    >> так почему у меня в вышеописанном коде Client_ID половину левые значения возвращает
    хз
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не скажи) ты про ntdll или про ntoskrnl? в ядре разница есть
     
  10. foxhunter

    foxhunter New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Windows XP Professional Build 2600
    NtCreateThread 0035
    вот полный код:

    driver.c:
    Код (Text):
    1. #include "driver.h"
    2.  
    3.  
    4. extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
    5.  
    6. extern PUSHORT NtBuildNumber;
    7.  
    8.  
    9. NtCreateThreadPointer TrueNtCreateThread;
    10.  
    11. ULONG OpenProcId;
    12.  
    13. OldCode OpPrcOld;
    14. PVOID NewNtOpenProcessAdr;
    15. PVOID NewNtCreateProcessAdr;
    16.  
    17. ULONG ResetCR0()
    18. {
    19.     ULONG CR0Reg;
    20.     __asm
    21.     {
    22.         cli
    23.         mov eax, cr0
    24.         mov CR0Reg, eax
    25.         and eax, 0xFFFEFFFF
    26.         mov cr0, eax
    27.     }
    28.     return CR0Reg;
    29. }
    30. ULONG RestoreCR0(ULONG CR0Reg)
    31. {
    32.     __asm
    33.     {
    34.         mov eax, CR0Reg
    35.         mov cr0, eax
    36.         sti
    37.     }
    38.     return CR0Reg;
    39. }
    40.  
    41.  
    42.  
    43. NTSTATUS NewNtCreateThread(OUT PHANDLE ThreadHandle,
    44.                             IN ACCESS_MASK DesiredAccess,
    45.                             IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    46.                             IN HANDLE ProcessHandle,
    47.                             OUT PCLIENT_ID ClientId,
    48.                             IN PCONTEXT ThreadContext,
    49.                             IN PINITIAL_TEB UserStack,
    50.                             IN BOOLEAN CreateSuspended)
    51. {
    52.     DPRINT("PID = %d",ClientId->UniqueProcess);
    53.    
    54.     return TrueNtCreateThread(ThreadHandle,
    55.                               DesiredAccess,
    56.                               ObjectAttributes,
    57.                               ProcessHandle,
    58.                               ClientId,
    59.                               ThreadContext,
    60.                               UserStack,
    61.                               CreateSuspended);
    62. }
    63.  
    64. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    65. {
    66.     ULONG CR0Reg;
    67.     NTSTATUS Result;
    68.    
    69.     DPRINT("Driver Uploaded");
    70.  
    71.     CR0Reg = ResetCR0();
    72.     NTCALL(OpenProcId) = TrueNtCreateThread;
    73.  
    74.     RestoreCR0(CR0Reg);
    75.     return;
    76. }
    77.  
    78. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
    79. {
    80.     ULONG CR0Reg;
    81.     char buf1[65],buf2[65];
    82.  
    83.     DPRINT("Driver loaded");
    84.  
    85.     switch (*NtBuildNumber)
    86.     {
    87.     case 2195: //win 2k
    88.         OpenProcId = 0x02E;//NtCreateThread
    89.         break;
    90.     case 2600: //win xp
    91.         OpenProcId = 0x035;//NtCreateThread
    92.         break;
    93.     default:
    94.         return STATUS_NOT_IMPLEMENTED;
    95.         break;
    96.     }
    97.  
    98.     TrueNtCreateThread = NTCALL(OpenProcId);
    99.  
    100.  
    101.     CR0Reg = ResetCR0();
    102.     NTCALL(OpenProcId) = NewNtCreateThread;
    103.  
    104.     RestoreCR0(CR0Reg);
    105.  
    106.     DriverObject->DriverUnload = DriverUnload;
    107.     return STATUS_SUCCESS;
    108. }
    driver.h:
    Код (Text):
    1. #include <ntddk.h>
    2. #include <stdio.h>
    3.  
    4. #define DEBUG
    5.  
    6. #ifdef DEBUG
    7. #define DPRINT DbgPrint
    8. #else
    9. #define DPRINT
    10. #endif
    11.  
    12. typedef PVOID* PNTPROC;
    13. typedef DWORD (ULONG);
    14. typedef DWORD* PDWORD;
    15. typedef unsigned char (BYTE);
    16. typedef BYTE* PBYTE;
    17.  
    18. typedef struct _INITIAL_TEB
    19. {
    20.     PVOID PreviousStackBase;
    21.     PVOID PreviousStackLimit;
    22.     PVOID StackBase;
    23.     PVOID StackLimit;
    24.     PVOID AllocatedStackBase;
    25. } INITIAL_TEB, *PINITIAL_TEB;
    26.  
    27. typedef struct _SYSTEM_SERVICE_TABLE
    28. {
    29.     PNTPROC ServiceTable;
    30.     PDWORD  CounterTable;
    31.     ULONG   ServiceLimit;
    32.     PBYTE   ArgumentTable;
    33. }
    34. SYSTEM_SERVICE_TABLE ,
    35. * PSYSTEM_SERVICE_TABLE ,
    36. **PPSYSTEM_SERVICE_TABLE;
    37.  
    38. typedef struct _SERVICE_DESCRIPTOR_TABLE
    39. {
    40.     SYSTEM_SERVICE_TABLE ntoskrnl; //SST для ntoskrnl.exe
    41.     SYSTEM_SERVICE_TABLE win32k;   //SST для win32k.sys
    42.     SYSTEM_SERVICE_TABLE unused1;
    43.     SYSTEM_SERVICE_TABLE unused2;
    44. }
    45. SERVICE_DESCRIPTOR_TABLE ,
    46. * PSERVICE_DESCRIPTOR_TABLE ,
    47. **PPSERVICE_DESCRIPTOR_TABLE;
    48.  
    49. typedef struct THREAD_BASIC_INFORMATION
    50. {
    51.     NTSTATUSExitStatus;
    52.     PVOIDTebBaseAddress;
    53.     CLIENT_IDClientId;
    54.     KAFFINITYAffinityMask;
    55.     KPRIORITYPriority;
    56.     KPRIORITYBasePriority;
    57. } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
    58.  
    59. #define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function]
    60.  
    61. typedef NTSTATUS (*NtCreateThreadPointer)(OUT PHANDLE ThreadHandle,
    62.                                           IN ACCESS_MASK DesiredAccess,
    63.                                           IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    64.                                           IN HANDLE ProcessHandle,
    65.                                           OUT PCLIENT_ID ClientId,
    66.                                           IN PCONTEXT ThreadContext,
    67.                                           IN PINITIAL_TEB UserStack,
    68.                                           IN BOOLEAN CreateSuspended);
     
  11. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> не скажи) ты про ntdll или про ntoskrnl?
    я про таблицу системных сервисов))) хотя впринципе, да, если в этом конетксте, то правильнее об Nt говорить)
     
  12. foxhunter

    foxhunter New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    ну так вы мне ченибудь посоветуете?
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Поискать по форуму. Совсем недавно у WIN32 были проблемы со считыванием PEB'a. Тебе он и нужен. Поищи.