Завершение процесса с помощью DebugObject

Тема в разделе "WASM.WIN32", создана пользователем Crash, 16 июл 2006.

  1. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Привет, народ!

    Есть один известный способ убиения процесса через DbgUiDebugActiveProcess в Windows XP и выше. Вот код:

    Код (Text):
    1. BOOL KillInWinXP(HANDLE hProcess) {
    2.     DWORD (WINAPI *DbgUiConnectToDbg)();
    3.     HINSTANCE hNtDll = GetModuleHandle("ntdll.dll");
    4.  
    5.     *(FARPROC *)&DbgUiConnectToDbg = GetProcAddress(hNtDll, "DbgUiConnectToDbg");
    6.     if (DbgUiConnectToDbg) {
    7.         if (DbgUiConnectToDbg() != 0) {
    8.             return FALSE;
    9.         }
    10.  
    11.         DWORD (WINAPI *DbgUiDebugActiveProcess)(HANDLE hProcess);
    12.  
    13.         *(FARPROC *)&DbgUiDebugActiveProcess = GetProcAddress(hNtDll, "DbgUiDebugActiveProcess");
    14.         if (DbgUiDebugActiveProcess) {
    15.             if (DbgUiDebugActiveProcess(hProcess) != 0) {
    16.                 return FALSE;
    17.             }
    18.             PSYSTEM_HANDLE_INFORMATION_EX HandlesInfo = (PSYSTEM_HANDLE_INFORMATION_EX)GetInfoTable(16);
    19.  
    20.             if (!HandlesInfo) {
    21.                 return FALSE;
    22.             }
    23.  
    24.             DWORD myPID = GetCurrentProcessId();
    25.  
    26.             for (DWORD r = 0; r <= HandlesInfo->NumberOfHandles; r++) {
    27.                 if (HandlesInfo->Information[r].ProcessId == myPID && HandlesInfo->Information[r].ObjectTypeNumber == 8) {
    28.                     CloseHandle((HANDLE)HandlesInfo->Information[r].Handle);
    29.                     VirtualFree(HandlesInfo, 0, MEM_RELEASE);
    30.                     return TRUE;
    31.                 }
    32.             }
    33.             VirtualFree(HandlesInfo, 0, MEM_RELEASE);
    34.         }
    35.     }
    36.     return FALSE;
    37. }
    Т.е., закрывая DebugObject, мы убиваем процесс, который отлаживали.
    Но проблема в том, что при повторном запуске данной функции DebugObject'а уже не
    существует. Можно, конечно, завершить программу, которая содержит в себе и вызывает KillInXP, затем запустить ее заново. И опять можно будет всего один раз вызвать KillInXP. Но хотелось бы без перезапусков.

    Тут уже затрагивали данную тему, и вот, что я нашел:
    "Невозможно создать DebugObject после его завершения. Т.е. объект создать можно -
    ZwCreateDebugObject, но подключить его нельзя".

    Может на самом деле есть способ подключить объект?

    Я нашел функцию NtSetInformationDebugObject. Возможно она поможет. Хотя не уверен. Вот
    прототип:

    Код (Text):
    1. NTSYSAPI
    2. NTSTATUS
    3. NTAPI
    4. NtSetInformationDebugObject(
    5.     IN HANDLE DebugObject,
    6.     IN DEBUGOBJECTINFOCLASS DebugObjectInformationClass,
    7.     IN PVOID DebugInformation,
    8.     IN ULONG DebugInformationLength,
    9.     OUT PULONG ReturnLength OPTIONAL
    10.     );
    Но непонятно, как ей пользоваться. Может, кто знает?
     
  2. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Тут я поднял аналогичную тему. Х.з. в чем там дело. Может тебе стоит отключаться от системы отладки, а потом подключаться заново?