Great Я имею ввиду сервис UserpActivateDebugger для которого обработчик SrvActivateDebugger() создающий удалённый поток(..->DbgUiIssueRemoteBreakin()). Сервис BasepCreateThread, обработчик которого BaseSrvCreateThread(), юзающий экспортируемую CsrCreateThread() - это вызывает винапи для регистрации треда(наверно ты про это).
Замучался уже(( , при созднии потока возникает сообщение с ошибкой ~ "calc.exe -ошибка C0000005 при инициализации приложения", создеёт его csrss.exe, и при этом NtCreateThread возвращает тру а поток создаётся и нормально отрабатывает. Если же создать поток в самом csrss.exe то получаю бсод. Вроде всё правильно? Код (Text): NTSTATUS XxCreateThread ( PEPROCESS pProcess, PCLIENT_ID pClientId, PHANDLE phThread, BOOLEAN Suspend, ULONG UsermodeAddress, ULONG UsermodeStack, ) { NTSTATUS ns, CreatedStatus = STATUS_UNSUCCESSFUL; HANDLE hProcess; PMDL pMdlStack,pMdlCode; KAPC_STATE ApcState; USER_STACK UserStack; CONTEXT Context; PMDL CtxMdl; PVOID CtxMapped; ns = ObOpenObjectByPointer( pProcess, OBJ_KERNEL_HANDLE, NULL, 0, NULL, KernelMode, &hProcess ); if (!NT_SUCCESS(ns)) { adddbg("ERROR: ObOpenObjectByPointer &hProcess return %p",ns); return ns; } UserStack.ExpandableStackBottom = UserStack.ExpandableStackLimit = (PVOID) UsermodeStack; UserStack.ExpandableStackBase = (PVOID)( (ULONG_PTR)UsermodeStack + 0x10000); RtlZeroMemory(&Context, sizeof(CONTEXT)); Context.ContextFlags = CONTEXT_FULL; Context.SegGs = 0; Context.SegFs = 0x3B; Context.SegEs = 0x23; Context.SegDs = 0x23; Context.SegSs = 0x23; Context.SegCs = 0x1B; Context.EFlags = 0x3000; Context.Esp = (ULONG) UserStack.ExpandableStackBase - 4; Context.Eip = (ULONG_PTR) UsermodeAddress; CtxMdl = IoAllocateMdl(&Context, sizeof(CONTEXT), 0, 0, 0); if( CtxMdl ) { MmBuildMdlForNonPagedPool( CtxMdl ); CtxMapped = MmMapLockedPagesSpecifyCache( CtxMdl, UserMode, MmCached, NULL ,0 ,NormalPagePriority ); if (CtxMapped) { if (NT_SUCCESS(ns)) { CreatedStatus = _NtCreateThread ( phThread, THREAD_ALL_ACCESS, NULL, hProcess, pClientId, (PCONTEXT) CtxMapped, &UserStack, Suspend // TRUE suspend ); adddbg(" _NtCreateThread ns = %p", CreatedStatus); MmUnmapLockedPages(CtxMapped, CtxMdl); } else { adddbg(" MmMapLockedPagesSpecifyCache failed"); } IoFreeMdl(CtxMdl); } else { adddbg(" IoAllocateMdl failed"); } } else { adddbg("ERROR: MmMapLockedPagesSpecifyCache failed"); } ZwClose(hProcess); return CreatedStatus; } #define MALIGN_DOWN(x, align) (x & ~(align-1)) #define MALIGN_UP(x, align) ((x & (align-1)) ? MALIGN_DOWN(x,align)+align:x) BOOLEAN XxInjectCodeToProcess ( PEPROCESS pProcess, HANDLE hProcess, ) { NTSTATUS ns, retns = STATUS_UNSUCCESSFUL; PUCHAR pUserCode = NULL, pUserStack = NULL; PUCHAR pShellCode = (PUCHAR) sc; ULONG sizeCode = (ULONG)sc_end - (ULONG)sc; ULONG sizeMem = MALIGN_UP(sizeCode, 0x1000) + 0x10000; SIZE_T sz = 0; KAPC_STATE ApcState; CLIENT_ID ClientId; HANDLE hThread; //alloc memory for code and stack ns = ZwAllocateVirtualMemory(hProcess, &pUserCode, 0, &sizeMem, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); adddbg("ZwAllocateVirtualMemory status %p", ns); if (! NT_SUCCESS(ns)) return FALSE; pUserStack = pUserCode + MALIGN_UP(sizeCode, 0x1000); sc_data = (PSC_DATA) pUserStack; //attach to process address space and copy code KeStackAttachProcess(pProcess, &ApcState); memcpy(pUserCode, pShellCode, sizeCode); //*pUserCode = 0xC3; KeUnstackDetachProcess(&ApcState); retns = XxCreateThread( pProcess, &ClientId, &hThread, TRUE,//FALSE (ULONG) pUserCode, (ULONG) pUserStack, ); adddbg("XxCreateThread status %p", retns); if (NT_SUCCESS(retns)) { retns = _NtResumeThread(hThread, NULL); adddbg(" _NtResumeThread ns = %p",retns); ZwClose(hThread); } //ns = ZwFreeVirtualMemory(hProcess, &pUserCode, &sz, MEM_RELEASE); //adddbg("ZwFreeVirtualMemory status %p", ns); return NT_SUCCESS(retns); }