ExRaiseHardError и Windows 7

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 30 апр 2009.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Я имею ввиду сервис UserpActivateDebugger для которого обработчик SrvActivateDebugger() создающий удалённый поток(..->DbgUiIssueRemoteBreakin()). Сервис BasepCreateThread, обработчик которого BaseSrvCreateThread(), юзающий экспортируемую CsrCreateThread() - это вызывает винапи для регистрации треда(наверно ты про это).
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А-а, ну можно и так.
     
  3. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Замучался уже(( , при созднии потока возникает сообщение с ошибкой ~ "calc.exe -ошибка C0000005 при инициализации приложения", создеёт его csrss.exe, и при этом NtCreateThread возвращает тру а поток создаётся и нормально отрабатывает.
    Если же создать поток в самом csrss.exe то получаю бсод.

    Вроде всё правильно?

    Код (Text):
    1. NTSTATUS XxCreateThread (
    2.                 PEPROCESS pProcess, PCLIENT_ID pClientId,
    3.                 PHANDLE  phThread, BOOLEAN Suspend,
    4.                 ULONG UsermodeAddress, ULONG UsermodeStack,
    5.                 )
    6. {
    7.     NTSTATUS    ns, CreatedStatus = STATUS_UNSUCCESSFUL;
    8.     HANDLE      hProcess;
    9.     PMDL        pMdlStack,pMdlCode;
    10.     KAPC_STATE  ApcState;
    11.     USER_STACK  UserStack;
    12.     CONTEXT     Context;
    13.     PMDL        CtxMdl;
    14.     PVOID       CtxMapped;
    15.    
    16.      
    17.     ns = ObOpenObjectByPointer( pProcess, OBJ_KERNEL_HANDLE,
    18.                                 NULL, 0, NULL,
    19.                                 KernelMode, &hProcess );
    20.                                
    21.    
    22.     if (!NT_SUCCESS(ns))
    23.     {
    24.         adddbg("ERROR: ObOpenObjectByPointer &hProcess return %p",ns);
    25.         return ns;
    26.     }
    27.  
    28.     UserStack.ExpandableStackBottom =
    29.     UserStack.ExpandableStackLimit = (PVOID) UsermodeStack;
    30.     UserStack.ExpandableStackBase = (PVOID)( (ULONG_PTR)UsermodeStack + 0x10000);
    31.    
    32.     RtlZeroMemory(&Context, sizeof(CONTEXT));
    33.     Context.ContextFlags = CONTEXT_FULL;
    34.    
    35.     Context.SegGs = 0;
    36.     Context.SegFs = 0x3B;
    37.     Context.SegEs = 0x23;
    38.     Context.SegDs = 0x23;
    39.     Context.SegSs = 0x23;
    40.     Context.SegCs = 0x1B;
    41.     Context.EFlags = 0x3000;
    42.     Context.Esp = (ULONG) UserStack.ExpandableStackBase - 4;
    43.     Context.Eip = (ULONG_PTR) UsermodeAddress;
    44.    
    45.     CtxMdl = IoAllocateMdl(&Context, sizeof(CONTEXT), 0, 0, 0);
    46.    
    47.     if( CtxMdl )
    48.     {
    49.         MmBuildMdlForNonPagedPool( CtxMdl );
    50.        
    51.         CtxMapped = MmMapLockedPagesSpecifyCache( CtxMdl, UserMode, MmCached,
    52.                                                    NULL ,0 ,NormalPagePriority );
    53.        
    54.         if (CtxMapped)
    55.         {
    56.        
    57.             if (NT_SUCCESS(ns))
    58.             {  
    59.                
    60.                 CreatedStatus = _NtCreateThread (
    61.                                        phThread,
    62.                                        THREAD_ALL_ACCESS,
    63.                                        NULL,
    64.                                        hProcess,
    65.                                        pClientId,
    66.                                        (PCONTEXT) CtxMapped,
    67.                                        &UserStack,
    68.                                        Suspend // TRUE suspend
    69.                 );
    70.                
    71.                 adddbg(" _NtCreateThread ns = %p", CreatedStatus);
    72.                
    73.                 MmUnmapLockedPages(CtxMapped, CtxMdl);
    74.                
    75.             } else {
    76.                 adddbg(" MmMapLockedPagesSpecifyCache failed");
    77.                 }
    78.            
    79.             IoFreeMdl(CtxMdl);
    80.            
    81.         } else {
    82.             adddbg(" IoAllocateMdl failed");       
    83.             }
    84.            
    85.     } else {
    86.         adddbg("ERROR: MmMapLockedPagesSpecifyCache failed");
    87.         }
    88.    
    89.    
    90.    
    91.     ZwClose(hProcess);
    92.    
    93.     return CreatedStatus;
    94. }
    95.  
    96.  
    97. #define MALIGN_DOWN(x, align)   (x & ~(align-1))           
    98. #define MALIGN_UP(x, align) ((x & (align-1)) ? MALIGN_DOWN(x,align)+align:x)   
    99.  
    100. BOOLEAN  XxInjectCodeToProcess (
    101.                 PEPROCESS pProcess, HANDLE hProcess,
    102.                 )
    103. {  
    104.     NTSTATUS    ns, retns = STATUS_UNSUCCESSFUL;
    105.     PUCHAR      pUserCode = NULL, pUserStack = NULL;
    106.     PUCHAR      pShellCode = (PUCHAR) sc;
    107.     ULONG       sizeCode = (ULONG)sc_end - (ULONG)sc;
    108.     ULONG       sizeMem =  MALIGN_UP(sizeCode, 0x1000) + 0x10000;
    109.     SIZE_T      sz = 0;
    110.     KAPC_STATE  ApcState;
    111.     CLIENT_ID   ClientId;
    112.     HANDLE      hThread;
    113.    
    114.     //alloc memory for code and stack
    115.     ns = ZwAllocateVirtualMemory(hProcess, &pUserCode, 0, &sizeMem, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    116.     adddbg("ZwAllocateVirtualMemory status %p", ns);
    117.     if (! NT_SUCCESS(ns)) return FALSE;
    118.    
    119.     pUserStack = pUserCode + MALIGN_UP(sizeCode, 0x1000);
    120.     sc_data = (PSC_DATA) pUserStack;
    121.  
    122.    
    123.     //attach to process address space and copy code
    124.     KeStackAttachProcess(pProcess, &ApcState);
    125.     memcpy(pUserCode, pShellCode, sizeCode);
    126.     //*pUserCode = 0xC3;
    127.     KeUnstackDetachProcess(&ApcState);
    128.    
    129.    
    130.     retns = XxCreateThread( pProcess,
    131.                          &ClientId,
    132.                          &hThread,
    133.                          TRUE,//FALSE
    134.                          (ULONG) pUserCode,
    135.                          (ULONG) pUserStack,
    136.     ); 
    137.     adddbg("XxCreateThread status %p", retns);
    138.    
    139.    
    140.     if (NT_SUCCESS(retns))
    141.     {
    142.         retns = _NtResumeThread(hThread, NULL);    
    143.         adddbg(" _NtResumeThread ns = %p",retns);
    144.        
    145.         ZwClose(hThread);
    146.     }
    147.    
    148.     //ns = ZwFreeVirtualMemory(hProcess, &pUserCode, &sz, MEM_RELEASE);
    149.     //adddbg("ZwFreeVirtualMemory status %p", ns);
    150.    
    151.     return NT_SUCCESS(retns);
    152.  
    153. }
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Обсуждалось уже не раз. Как правильно, см. здесь, там ещё и мой код есть по ссылке.