ZwTerminateProcess глючит ?

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

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Ладно спасибо , будем пробовать =) кстати
    IRQL_NOT_LESS_OR_EQUAL что за ошибка ?
    Код (Text):
    1. PPEB    remPeb = NULL;
    2. remPeb  = pProcessInformation.PebBaseAddress;
    3.    
    4. __try
    5. {
    6.     KeAttachProcess(remPeb);
    7.     RtlUnicodeStringToAnsiString(&asProcessName,&remPeb->ProcessParameters->ImagePathName,TRUE);
    8.     asProcessName.Buffer[asProcessName.Length] = 0x00;
    9.     DbgPrint("%s",asProcessName.Buffer);
    10.     RtlFreeAnsiString(&asProcessName);         
    11.     KeDetachProcess();
    12. }
    13. __except(EXCEPTION_EXECUTE_HANDLER)
    14. {
    15.     DbgPrint("KeAttachProcess 0x%X",&remPeb);
    16. }
     
  2. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    В KeAttachProcess должен отправляться не PEB, а EPROCESS процесса.
     
  3. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    http://www.windowsitlibrary.com/Content/356/04/7.html
    а почему там KeAttachProcess(Peb); ?
    И потом в DDK написано что
    VOID
    KeStackAttachProcess (
    IN PKPROCESS Process,
    OUT PRKAPC_STATE ApcState
    );
    Parameters
    Process
    Pointer to the target process object. This parameter can be a PEPROCESS pointer returned by IoGetCurrentProcess or PsGetCurrentProcess.
    ApcState
    Pointer to a variable that receives an opaque pointer to a KAPC_STATE structure. The caller must allocate storage for this structure either from nonpaged pool or from the caller's own thread stack.

    А я получаю так :
    Код (Text):
    1.     PEPROCESS       GetProcessByHandle(HANDLE hndl)
    2.     {
    3.         PVOID                    NZTP_OBJ;
    4.         ObReferenceObjectByHandle(hndl,0,0,KernelMode,&NZTP_OBJ,NULL);
    5.         return NZTP_OBJ;
    6.     }
    7. ...
    8. struct _EPROCESS    *remPeprocess;
    9. remPeprocess = (PEPROCESS)GetProcessByHandle(ProcessHandle);
    10.             remPeb  = pProcessInformation.PebBaseAddress;
    11.             __try
    12.             {
    13.                 KeAttachProcess(remPeprocess);
    14.                 DbgPrint("%ws",remPeb->ProcessParameters->ImagePathName);
    15.                 KeDetachProcess();
    16.             }
    17.             __except(EXCEPTION_EXECUTE_HANDLER)
    18.             {
    19.                 DbgPrint("KeAttachProcess 0x%X",&remPeb);
    20.             }
    А если укажу *PEB то выходит синий экран, блин =(
     
  4. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Есть совет - выкинуть левые примеры и посмотреть на реализацию функций ядра. Вот описание функций, которые тебе нужны.

    Код (Text):
    1. VOID
    2. __stdcall
    3. KeAttachProcess (
    4.     IN PEPROCESS Process
    5. );
    6.  
    7. VOID
    8. __stdcall
    9. KeDetachProcess (
    10.     VOID
    11. );
    А уж как получить EPROCESS это сам подумай. Никаких peb'ов в эти функции передаваться не должно и в помине. Вообще, прежде чем лезть в ядро, неплохо бы ознакомиться с его устройством хотя бы поверхностно.
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    http://forum.shelek.com/index.php?action=printpage;topic=3464.0
    http://www.wasm.ru/forum/viewtopic.php?pid=139225

    почитай ка это
     
  6. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Спасибо !
    Будет сделано :)
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ты обращаешься к подкачиваемой и выгруженной в данный момент памяти (то есть вызываешь ошибку страницы) при высоком IRQL (высоким считается IRQL >= DISPATCH_LEVEL).
    Надеюсь, что такое IRQL ты знаешь..
     
  8. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Great спасибо.
    Уровень приоритеа выполнения.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не совсем. Interrupt Request Level - уровень запроса на прерывание. Но по смыслу ты прав, он определяет, что может делать текущий поток, а что нет. Например, при IRQL >= DISPATCH_LEVEL планировщик не переключает потоки и диспетчер памяти не подгружает выгруженные подкачиваемые страницы. То есть если заставить планировщик переключить потоки или вызвать ошибку страницы, будет немедленно IRQL_NOT_LESS_OR_EQUAL
    Для IRQ IRQL является маской для прерываний. IRQL от 3 до 30 определяет приоритет аппаратных прерываний. При выполнении ISR (Interrupt Service Routine) ядро ставит IRQL, соответствующий этому IRQ. Таким образом маскируются все IRQ уровня текущего, или ниже. То есть если поставлен IRQL = 4 (соотв. IRQ номер 2), то маскируются прерывания, IRQL которых <=4. Специальный IRQL номер 31 (HIGH_LEVEL) определяет такое состояние процессора, когда замаскированы все прерывания.
    Пример использования HIGH_LEVEL: показ синего экрана смерти. Винда ставит IRQL на HIGH_LEVEL, сбрасывает бит Interrupt в EFLAGS через команду CLI, после чего уходит в бесконечный цикл. Оказываются запрещенными и замаскированными все прерывания, продолжить работу невозможно никаким образом. Только ребутнуться, получив на шину сигнал #RESET

    ЗЫ. блин, вот понесло то меня... ))
     
  10. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Значит так =) вот что у нас имееться...
    Код (Text):
    1.     NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)
    2.     {  
    3.         NTSTATUS                            NZTP_STATUS = STATUS_SUCCESS;
    4.         PROCESS_BASIC_INFORMATION           pProcessInformation;
    5.  
    6.         // Параметры процесса который нужно завалить
    7.         PEPROCESS                           remEprocess = 0;
    8.         CLIENT_ID                           remClientId;
    9.         PPEB                                remPeb;
    10.        
    11.         NZTP_STATUS = ZwQueryInformationProcess(ProcessHandle,ProcessBasicInformation,&pProcessInformation,sizeof(PROCESS_BASIC_INFORMATION),NULL);
    12.         if (NT_SUCCESS(NZTP_STATUS))
    13.         {
    14.             remClientId.UniqueProcess   = (HANDLE)pProcessInformation.UniqueProcessId;
    15.             remClientId.UniqueThread    = 0;
    16.             remPeb                      = pProcessInformation.PebBaseAddress;
    17.             NZTP_STATUS = PsLookupProcessByProcessId(remClientId.UniqueProcess,&remEprocess);
    18.  
    19.             __try
    20.             {
    21.                 KeAttachProcess(remEprocess);
    22.                 DbgPrint("%ws",remPeb->ProcessParameters->ImagePathName);
    23.                 KeDetachProcess();
    24.             }
    25.             __except(EXCEPTION_EXECUTE_HANDLER)
    26.             {
    27.                 DbgPrint("KeAttachProcess 0x%X",&remEprocess);
    28.             }
    29.             ObDereferenceObject(remEprocess);
    30.  
    31.         }
    32.         NZTP_STATUS = OldZwTerminateProcess(ProcessHandle,ExitStatus);
    33.         return NZTP_STATUS;
    34.  
    35.     }
    Но почему-то DbgPrint показывает какую-то хрень =)
     
  11. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Да я понимаю что у меня адрес remPeb это адрес в том пространстве, но ведь структура одинаковая, почему выводиться чёрт знает что.
     
  12. WIN32

    WIN32 Member

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

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Код (Text):
    1. DbgPrint("%ws",remPeb->ProcessParameters->ImagePathName.Buffer);
    Признаюсь поспешил
     
  14. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Тема закрыта =)