Привет, народ! Есть один известный способ убиения процесса через DbgUiDebugActiveProcess в Windows XP и выше. Вот код: Код (Text): BOOL KillInWinXP(HANDLE hProcess) { DWORD (WINAPI *DbgUiConnectToDbg)(); HINSTANCE hNtDll = GetModuleHandle("ntdll.dll"); *(FARPROC *)&DbgUiConnectToDbg = GetProcAddress(hNtDll, "DbgUiConnectToDbg"); if (DbgUiConnectToDbg) { if (DbgUiConnectToDbg() != 0) { return FALSE; } DWORD (WINAPI *DbgUiDebugActiveProcess)(HANDLE hProcess); *(FARPROC *)&DbgUiDebugActiveProcess = GetProcAddress(hNtDll, "DbgUiDebugActiveProcess"); if (DbgUiDebugActiveProcess) { if (DbgUiDebugActiveProcess(hProcess) != 0) { return FALSE; } PSYSTEM_HANDLE_INFORMATION_EX HandlesInfo = (PSYSTEM_HANDLE_INFORMATION_EX)GetInfoTable(16); if (!HandlesInfo) { return FALSE; } DWORD myPID = GetCurrentProcessId(); for (DWORD r = 0; r <= HandlesInfo->NumberOfHandles; r++) { if (HandlesInfo->Information[r].ProcessId == myPID && HandlesInfo->Information[r].ObjectTypeNumber == 8) { CloseHandle((HANDLE)HandlesInfo->Information[r].Handle); VirtualFree(HandlesInfo, 0, MEM_RELEASE); return TRUE; } } VirtualFree(HandlesInfo, 0, MEM_RELEASE); } } return FALSE; } Т.е., закрывая DebugObject, мы убиваем процесс, который отлаживали. Но проблема в том, что при повторном запуске данной функции DebugObject'а уже не существует. Можно, конечно, завершить программу, которая содержит в себе и вызывает KillInXP, затем запустить ее заново. И опять можно будет всего один раз вызвать KillInXP. Но хотелось бы без перезапусков. Тут уже затрагивали данную тему, и вот, что я нашел: "Невозможно создать DebugObject после его завершения. Т.е. объект создать можно - ZwCreateDebugObject, но подключить его нельзя". Может на самом деле есть способ подключить объект? Я нашел функцию NtSetInformationDebugObject. Возможно она поможет. Хотя не уверен. Вот прототип: Код (Text): NTSYSAPI NTSTATUS NTAPI NtSetInformationDebugObject( IN HANDLE DebugObject, IN DEBUGOBJECTINFOCLASS DebugObjectInformationClass, IN PVOID DebugInformation, IN ULONG DebugInformationLength, OUT PULONG ReturnLength OPTIONAL ); Но непонятно, как ей пользоваться. Может, кто знает?
Тут я поднял аналогичную тему. Х.з. в чем там дело. Может тебе стоит отключаться от системы отладки, а потом подключаться заново?