1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| BOOL DebugActiveProcess(DWORD dwProcessId) { HANDLE hProcess; int status;
status = DbgUiConnectToDbg(); if ( status < 0 ) goto ERROR_HANDLE; hProcess = ProcessIdToHandle(dwProcessId); if ( !hProcess ) return 0; status = DbgUiDebugActiveProcess(hProcess); if ( status < 0 ) { NtClose(hProcess); ERROR_HANDLE: BaseSetLastNTError(status); return 0; } NtClose(hProcess); return 1; }
HANDLE ProcessIdToHandle(DWORD dwProcessId) { HANDLE ProcessId; NTSTATUS status; struct _CLIENT_ID ClientId; struct _OBJECT_ATTRIBUTES ObjectAttributes; void *ProcessHandle;
if ( dwProcessId == -1 ) ProcessId = CsrGetProcessId(); else ProcessId = (HANDLE)(int)dwProcessId; ProcessHandle = 0i64; ClientId.UniqueProcess = ProcessId; ClientId.UniqueThread = 0i64; memset(&ObjectAttributes.RootDirectory, 0, 20); ObjectAttributes.Length = 48; *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64; status = NtOpenProcess(&ProcessHandle, 0xC3Au, &ObjectAttributes, &ClientId); if ( status < 0 ) BaseSetLastNTError(status); return ProcessHandle; }
NTSTATUS DbgUiConnectToDbg() { NTSTATUS status; OBJECT_ATTRIBUTES ObjectAttributes;
status = 0; if ( !NtCurrentTeb()->DbgSsReserved[1] ) { memset(&ObjectAttributes.RootDirectory, 0, 20); *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64; ObjectAttributes.Length = 48; return NtCreateDebugObject(&NtCurrentTeb()->DbgSsReserved[1], 0x1F000Fu, &ObjectAttributes, 1u); } return status; }
NTSTATUS DbgUiDebugActiveProcess(HANDLE Process) { NTSTATUS status;
status = NtDebugActiveProcess(Process, NtCurrentTeb()->DbgSsReserved[1]); if ( status >= 0 ) { status = DbgUiIssueRemoteBreakin(Process); if ( status < 0 ) ZwRemoveProcessDebug(Process, NtCurrentTeb()->DbgSsReserved[1]); } return status; }
NTSTATUS DbgUiIssueRemoteBreakin(HANDLE Process) { NTSTATUS status; __int64 v3; _CLIENT_ID v4; HANDLE Handle; status = RtlpCreateUserThreadEx(Process, 0i64, 2u, 0, 0i64, 0x4000ui64, v3, DbgUiRemoteBreakin, 0i64, &Handle, &v4); if ( status >= 0 ) NtClose(Handle); return status; }
|