ZwTerminateProcess глючит ?

Тема в разделе "WASM.NT.KERNEL", создана пользователем WIN32, 2 мар 2007.

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    В общем, перехватываю ZwTerminateProcess в ядре, код :
    Код (Text):
    1. NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)
    2. {  
    3.     NTSTATUS                            NZTP_STATUS = STATUS_SUCCESS;
    4.     struct _PROCESS_BASIC_INFORMATION   pProcessInformation;
    5.     struct _PEB                         *prev = NULL;
    6.     ANSI_STRING                         asProcessName;
    7.  
    8.     NZTP_STATUS = ZwQueryInformationProcess(ProcessHandle,ProcessBasicInformation,&pProcessInformation,sizeof(PROCESS_BASIC_INFORMATION),NULL);
    9.     if (NT_SUCCESS(NZTP_STATUS))
    10.     {
    11.         prev = pProcessInformation.PebBaseAddress;
    12.         RtlUnicodeStringToAnsiString(&asProcessName,&prev->ProcessParameters->ImagePathName,TRUE);
    13.         asProcessName.Buffer[asProcessName.Length] = 0x00;
    14.         switch (*NtBuildNumber)
    15.         {
    16.             case 2600:                  // win xp
    17.                 asProcessName.Buffer[asProcessName.Length] = 0x00;
    18.             break;
    19.         }
    20.         if(strstr( asProcessName.Buffer, HIDE_PROCESS_NAME ) != NULL)
    21.         {
    22.             DbgPrint("[unkill] %s , [ProcessName] : %s , [size of str] %d , [PEB] : 0x%X , Process %s , Pid 0x%d )",HIDE_PROCESS_NAME,asProcessName.Buffer,asProcessName.Length,pProcessInformation.PebBaseAddress,asProcessName.Buffer,pProcessInformation.UniqueProcessId);
    23.             NZTP_STATUS = STATUS_ACCESS_DENIED;
    24.             RtlFreeAnsiString(&asProcessName);
    25.             return NZTP_STATUS;
    26.         }   else    {
    27.             DbgPrint("[skip] %s , [ProcessName] : %s , [size of str] %d , [PEB] : 0x%X , Pid 0x%d )",HIDE_PROCESS_NAME,asProcessName.Buffer,asProcessName.Length,pProcessInformation.PebBaseAddress,pProcessInformation.UniqueProcessId);
    28.             NZTP_STATUS = OldZwTerminateProcess(ProcessHandle,ExitStatus);
    29.             RtlFreeAnsiString(&asProcessName);
    30.             return NZTP_STATUS;
    31.         }
    32.     }
    33.     NZTP_STATUS = OldZwTerminateProcess(ProcessHandle,ExitStatus);
    34.     return NZTP_STATUS;
    35.  
    36. }
    Так вот когда допустим закрываю notepad.exe через таск мэнэджер, то asProcessName.Buffer указывает на taskmgr.exe , хотя pProcessInformation.UniqueProcessId равен пиду notepad, в чём глюк ?
    DbgView
    Код (Text):
    1. [skip] notepad , [ProcessName] : C:\WINNT\system32\net1.exe , [size of str] 26 , [PEB] : 0x7FFDF000 , Pid 0x308 )
    2. [skip] notepad , [ProcessName] : C:\WINNT\system32\net.exe , [size of str] 25 , [PEB] : 0x7FFDF000 , Pid 0x352 )
    3. [skip] notepad , [ProcessName] : C:\WINNT\system32\taskmgr.exe , [size of str] 29 , [PEB] : 0x7FFDF000 , Pid 0x668 )
    4. [skip] notepad , [ProcessName] : C:\WINNT\system32\taskmgr.exe , [size of str] 29 , [PEB] : 0x7FFDF000 , Pid 0x860 ) /* тут notepad.exe */
    5. [skip] notepad , [ProcessName] : C:\WINNT\system32\taskmgr.exe , [size of str] 29 , [PEB] : 0x7FFDF000 , Pid 0x800 ) /* тут сам taskmgr */
     
  2. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Очень смешно ;) PEB который ты получил - это твой PEB, друг. А читаешь из памяти другого процесса ты каким образом? Присваиванием? =)
     
  3. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    prev = pProcessInformation.PebBaseAddress; мой пеб ? ...это как, как тогда получить...стой ко мне же передаёться Handle процесса который был получен ZwOpenProcessом , т.е. хэндл процесса который надо валить...кстати что значит "мой пеб"
     
  4. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    ааа всё понял =)
    это мне ещё повезло что PEBы совпались да ? =)
    Тогда как получить PEB по Handle ?
     
  5. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    deleted...
     
  6. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    И что? А адресное пространство тебе что тоже оптом отдают по хэндлу? У тебя в принте выводится нормально только та инфа, которая получена через QueryInformationProcess, а эта функция возвращает *указатель* на PEB, а не саму выделенную и готовую к употреблению структуру. Так как адреса пебов одинаковые у всех процессов, при твоем обращении ты попал сам в себя =)

    edit:

    О вижу ты вроде понял. Ничего такие ошибки бывают у всех =)
     
  7. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Тогда как получить PEB по Handle ? =)
    кстати, дайте ваше ICQ если можно %))
     
  8. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Зачем по хэндлу? Есть же pid, вот и открываем процесс, читаем из него peb, читаем из peb адрес строки с путем, читаем строку. ИМХО чего то это хреновая затея с именами процессов... Нельзя фильтровать не по строчкам, а по pid?

    icq, конечно, бы дал, если бы там сидел :)
     
  9. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Счастливый человек =)
    Т.е. я открываю процес с именем notepad.exe , беру Pid и сравниваю с pProcessInformation.UniqueProcessId ?
     
  10. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Может сразу перехватывать ZwOpenProcess ? +)
     
  11. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Хмм. Я так понимаю, это что-то типа защиты от снятия... И реализуется именно по имени процесса? QueryInformationProcess возвращает структуру с указателем на PEB. Сам PEB находится в другом процессе, в PEB валяется ProcessParameters в котором лежат всякие строчки. В юзер мод (лучше практиковаться тут, безопаснее) это выглядит так: открывается процесс по pid, читается peb через ZwReadVirtualMemory, читается строчка из ProcessParameters тоже через ZwReadVirtualMemory. Все, что тут непонятного?

    Если хукать ZwOpenProcess, тогда для полного счастья надо ещё ZwDuplicateObject, ZwOpenThread, ZwTerminateThread прикрывать. И то это поможет только от user mode.
     
  12. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    http://www.codeguru.com/forum/archive/index.php/t-315861.html
     
  13. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    ya-ya, примерно так =) вот очень грязный код из старого юзермод троя

    Код (Text):
    1. if ((_ZwQueryInformationProcess == NULL) ||
    2.         (_ZwReadVirtualMemory == NULL) ||
    3.         (_ZwClose == NULL)) return 0;
    4.     if ((cb == 0) && (uProcessId != NtHlpCurrentProcessId())) return 1;//invalid parameter
    5.    
    6.     HANDLE hProcess = NULL;
    7.     int rc = 0;
    8.  
    9.     hProcess = DoOpenProcess(uProcessId, PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0);
    10.     if (hProcess == NULL)
    11.     {
    12.         return 2;//open process fail
    13.     }
    14.     else
    15.     {
    16.         ULONG cbBuf1 = sizeof PROCESS_BASIC_INFORMATION;
    17.         PPROCESS_BASIC_INFORMATION ProcessInfo = (PPROCESS_BASIC_INFORMATION)LocalAlloc(LPTR, cbBuf1);
    18.         if (GetProcessInformation(hProcess, ProcessInfo, cbBuf1, ProcessBasicInformation) < 0)
    19.         {  
    20.             LocalFree(ProcessInfo);        
    21.             return 3;
    22.         }
    23.         PPEB peb = NULL;
    24.         PPROCESS_PARAMETERS proc_params = NULL;
    25.         PVOID UserPool = (PVOID)LocalAlloc(LPTR, 8192);
    26.         rc = _ZwReadVirtualMemory(
    27.                 hProcess,
    28.                 ProcessInfo->PebBaseAddress,
    29.                 UserPool,
    30.                 sizeof(PEB),
    31.                 NULL);
    32.         LocalFree(ProcessInfo);
    33.  
    34.         peb = (PPEB)UserPool;
    35.         rc = _ZwReadVirtualMemory(
    36.                 hProcess,
    37.                 peb->ProcessParameters,
    38.                 UserPool,
    39.                 sizeof(PROCESS_PARAMETERS),
    40.                 NULL);
    41.         proc_params = (PPROCESS_PARAMETERS)UserPool;
    42.        
    43.         ULONG uSize = 0;
    44.         LPVOID pBaseAddress = NULL;
    45.         switch (uFlags)
    46.         {
    47.             case 0: //process command line
    48.                 {
    49.                     uSize = proc_params->CommandLine.Length;
    50.                     pBaseAddress = proc_params->CommandLine.Buffer;
    51.                     break;
    52.                 }
    53.             case 1: //process image file name
    54.                 {
    55.                     uSize = proc_params->ImagePathName.Length;
    56.                     pBaseAddress = proc_params->ImagePathName.Buffer;              
    57.                     break;
    58.                 }
    59.             case 2: //process current directory
    60.                 {
    61.                     uSize = proc_params->CurrentDirectory.DosPath.Length;
    62.                     pBaseAddress = proc_params->CurrentDirectory.DosPath.Buffer;               
    63.                     break;
    64.                 }
    65.         }
    66.            
    67.         if ((uSize > cb) || (uSize <= 0))
    68.         {
    69.             _ZwClose(hProcess);
    70.             LocalFree(UserPool);
    71.             return 4;//memory buffer too small or nothing found
    72.         }
    73.         rc = _ZwReadVirtualMemory(
    74.                 hProcess,
    75.                 pBaseAddress,
    76.                 Buffer,
    77.                 uSize,
    78.                 NULL);
    79.         _ZwClose(hProcess);
    80.         LocalFree(UserPool);
    81.         return uSize;
    82.     }
    83. }
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. function NtQueryInformationProcess(hProcess: THandle; ProcessInfoClass: Integer; ProcessInfoBuffer: Pointer;
    2.  ProcessInfoBufferLength: Cardinal; BytesReturned: PCardinal): integer; stdcall; external 'ntdll.dll';
    3.  
    4. function GetCommandLine(pID: DWORD): PWChar;
    5. label err;
    6. var
    7.  pbi: array [0..5] of DWORD;
    8.  hProc: THandle;
    9.  pProcParams: DWORD;
    10.  wCmdLen: WORD;
    11.  pCmdLine: DWORD;
    12.  br: DWORD;
    13. begin
    14.  result := nil;
    15.  hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, pID);
    16.  if NtQueryInformationProcess(hProc, 0, @pbi, $18, nil) <> 0 then goto err;
    17.  if not ReadProcessMemory(hProc, Pointer(pbi[1] + $10), @pProcParams, 4, br) then goto err;
    18.  if not ReadProcessMemory(hProc, Pointer(pProcParams + $40), @wCmdLen, 2, br) then goto err;
    19.  if not ReadProcessMemory(hProc, Pointer(pProcParams + $44), @pCmdLine, 4, br) then goto err;
    20.  result := GetMemory(wCmdLen);
    21.  if result = nil then goto err;
    22.  if not ReadProcessMemory(hProc, Pointer(pCmdLine), result, wCmdLen, br) then
    23.   begin
    24.    FreeMemory(result);
    25.    result := nil;
    26.   end;
    27. err:
    28.  CloseHandle(hProc);
    29. end;
     
  15. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Искал ,искал так и не нашёл, что за фигня почему не компилиться ? что подключить ещё надо ?
    NZTP_STATUS = ZwReadVirtualMemory(remProcessHandle,remPebAddr,remUserPool, sizeof(prev),NULL);
    NTSYSAPI NTSTATUS NTAPI ZwReadVirtualMemory( IN HANDLE ProcessHandle,IN PVOID BaseAddress,OUT PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL);

    Код (Text):
    1. 1>errors in directory c:\driver
    2. 1>driver.obj : error LNK2019: unresolved external symbol __imp___ZwReadVirtualMe
    3. mory@20 referenced in function _NewZwTerminateProcess@8
    4. 1>objfre_w2k_x86\i386\driver.sys : error LNK1120: 1 unresolved externals
     
  16. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Товарищ WIN32, такой функции в ядре в экспортном виде нет. Её ручками обычно пишут =)
     
  17. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    балин как так нету, у Гэри Нэббета она описана почемуто
     
  18. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Потому что у него книжка про юзермод
     
  19. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Native Api Reference =) EP_XOFF вы чтото путаете.
    Ну пример хотя бы есть ?
     
  20. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    WIN32

    Native API есть как в кернел мод (ntoskrnl), так и в юзер(ntdll), так вот эта книжка как раз про усер мод =)

    Если не верим, идем вот сюда и ищем эту функцию http://jedi-apilib.sourceforge.net/native/NativeList.html только сначала почитайте, то что написано внизу про разную подсветку, зеленым там - ntdll

    KeAttachProcess, memcopy, KeDetachProcess