Как правильно использовать ZwOpenProcess/ZwTerminateProcess для завершение процесса?

Тема в разделе "WASM.BEGINNERS", создана пользователем Rihter, 14 мар 2006.

  1. Rihter

    Rihter New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2006
    Сообщения:
    76
    Вот так я делаю, но нечего не пройсходит :dntknw:


    Код (Text):
    1. DrTerminateProcess proc pid:DWORD
    2.     LOCAL oa            :OBJECT_ATTRIBUTES
    3.     LOCAL cid           :CLIENT_ID
    4.    
    5.     InitializeObjectAttributes addr oa, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL
    6.     push    pid
    7.     pop     hProcess
    8.     mov     cid.UniqueProcess,0
    9.     invoke  ZwOpenProcess, addr hProcess, 2035711, addr oa, addr cid
    10.     push eax
    11.     pop hProcess
    12.     invoke ZwTerminateProcess, hProcess, 0
    13.     ret
    14. DrTerminateProcess endp
     
  2. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Что такое mov cid.UniqueProcess,0 ?!?!?! Здесь должен быть PID процесса



    ЗЫ. Перед тем как кодить, нужно функции смотреть.



    NTSYSAPI

    NTSTATUS

    NTAPI

    NtOpenProcess(



    OUT PHANDLE ProcessHandle,

    IN ACCESS_MASK AccessMask,

    IN POBJECT_ATTRIBUTES ObjectAttributes,

    IN PCLIENT_ID ClientId );
     
  3. Rihter

    Rihter New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2006
    Сообщения:
    76
    MegaZu

    Помоги мне пожалуйста сформулировать ф-цию :)
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Rihter

    Уж нет ... я тебе сказал что не так ... думай сам, или ищи в гугле. Это не потому что я злой или еще что-то, а потому что ты сам нифига не делаешь, а только просишь сурсы. Может тогда ты посмотришь на описуху ...



    ЗЫ. Как я понял ф-ция не твоя :)
     
  5. Rihter

    Rihter New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2006
    Сообщения:
    76
    MegaZu Что жалко? Помочь?

    Знал бы, я бы не спрашивал бы,

    я только начинаю.



    Вот так правельно?



    DrTerminateProcess proc pid:lol: WORD

    LOCAL oa :OBJECT_ATTRIBUTES

    LOCAL cid :CLIENT_ID

    InitializeObjectAttributes addr oa, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL

    push pid

    pop edx

    mov cid.UniqueProcess, edx

    invoke ZwOpenProcess, addr hProcess, PROCESS_ALL_ACCESS, addr oa, addr cid

    .if (eax==STATUS_SUCCESS)

    invoke ZwTerminateProcess, hProcess, 0

    .endif

    ret

    DrTerminateProcess endp





    Если да. То она не работает :dntknw:



    Да не моя... Все, как и я пользуются тем что другие

    списали, у других. А с самого начало это Microsoft :) ;)
     
  6. OlegA11

    OlegA11 New Member

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


    Слабо? Самому разобраться?



    Таким образом, ты так инчему и не научишься.
     
  7. Rihter

    Rihter New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2006
    Сообщения:
    76
    OlegA11

    Если сравнить с API ф-ями

    все должно пройти на ура

    а здесь я даже без силен :dntknw:



    Вот откопал из исходнико "ntoskrnl.c"


    Код (Text):
    1. [i] NTSTATUS STDCALL [b]NtTerminateProcess[/b](IN HANDLE ProcessHandle  OPTIONAL,
    2.                     IN NTSTATUS ExitStatus)
    3.  {
    4.      NTSTATUS Status;
    5.      PEPROCESS Process;
    6.      PETHREAD CurrentThread;
    7.      BOOLEAN KillByHandle;
    8.  
    9.      PAGED_CODE();
    10.  
    11.      KillByHandle = (ProcessHandle != NULL);
    12.  
    13.      Status = ObReferenceObjectByHandle((KillByHandle ? ProcessHandle : NtCurrentProcess()),
    14.                                        PROCESS_TERMINATE,
    15.                                        PsProcessType,
    16.                                        KeGetPreviousMode(),
    17.                                        (PVOID*)&Process,
    18.                                         NULL);
    19.      if (!NT_SUCCESS(Status)) {
    20.          return(Status);
    21.      }
    22.  
    23.      CurrentThread = PsGetCurrentThread();
    24.      PsLockProcess(Process, FALSE);
    25.  
    26.      if(Process->ExitTime.QuadPart != 0)
    27.      {
    28.        PsUnlockProcess(Process);
    29.        ObDereferenceObject(Process);
    30.        return STATUS_PROCESS_IS_TERMINATING;
    31.     }
    32.  
    33.      PspTerminateProcessThreads(Process, ExitStatus);
    34.  
    35.      if (KillByHandle) {
    36.  
    37.          KeQuerySystemTime(&Process->ExitTime);
    38.          Process->ExitStatus = ExitStatus;
    39.  
    40.          if (CurrentThread->ThreadsProcess == Process) {
    41.  
    42.          CurrentThread->Terminated = TRUE;
    43.          PsUnlockProcess(Process);
    44.              ObDereferenceObject(Process);
    45.  
    46.              PspExitThread(ExitStatus);
    47.              KEBUGCHECK(0);
    48.          }
    49.     }
    50.  
    51.      PsUnlockProcess(Process);
    52.     ObDereferenceObject(Process);
    53.      return(STATUS_SUCCESS);
    54. }
    55.  
    56.  
    57.  
    58.  
    59.  
    60. VOID STDCALL [b]PspDeleteProcess[/b](PVOID ObjectBody)
    61. {
    62.      PEPROCESS Process = (PEPROCESS)ObjectBody;
    63.      ExAcquireFastMutex(&PspActiveProcessMutex);
    64.      RemoveEntryList(&Process->ActiveProcessLinks);
    65.      ExReleaseFastMutex(&PspActiveProcessMutex);
    66.      if(Process->UniqueProcessId)
    67.     {
    68.         ExDestroyHandle(PspCidTable, Process->UniqueProcessId);
    69.     }
    70.     KDB_DELETEPROCESS_HOOK(Process);
    71.     SeDeassignPrimaryToken(Process);
    72.     MmReleaseMmInfo(Process);
    73.      if(Process->Win32Process != NULL) ExFreePool(Process->Win32Process);
    74.  }[/i]






    Меня зайнтересовало, вторая ф-ция

    Она действительно, уничтожает процесс

    со всеми её данными?