запуск процесса из ядра

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

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да я думаю, не тебе одному надо)
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Брутально :)
    Может, было бы проще и надёжнее запатчить ntdll!KiFastSystemCall в каком-то пользовательском процессе переходом на шеллкод, а из самого шеллкода - восстановить оригинальный код и запустить что нужно? Тогда такой запуск процесса можно будет и на x64 использовать, где перехваты в ядре не желательны по причине наличия Patch Guard-а.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не тот кодес,перепутал названия)
    вот тот самый
    Код (Text):
    1. NTSTATUS
    2. InjectIntoStartedProcess(
    3.                          PEPROCESS Process,
    4.                          PUCHAR pModule,
    5.                          ULONG ModuleSize,
    6.                          BOOLEAN NativeThread,
    7.                          PVOID InjectData,
    8.                          SIZE_T InjectDataSize
    9.                          );
    10.  
    11. NTSTATUS
    12. NTAPI
    13. ZwQueryInformationThread (
    14.                           IN HANDLE           ThreadHandle,
    15.                           IN THREADINFOCLASS  ThreadInformationClass,
    16.                           OUT PVOID           ThreadInformation,
    17.                           IN ULONG            ThreadInformationLength,
    18.                           OUT PULONG          ReturnLength OPTIONAL
    19.                           )
    20. {
    21.   return ZwXXX (GetFunctionSdtNumber("NtQueryInformationThread"), ThreadHandle, ThreadInformationClass, ThreadInformation, ThreadInformationLength, ReturnLength);
    22. }
    23.  
    24. //
    25. // API numbers
    26. //
    27.  
    28. ULONG nNtCreateThread;
    29. ULONG nResumeThread;
    30.  
    31. //
    32. // Universal Shellcode Parameters.
    33. //
    34.  
    35. struct DRIVER_TO_SHELLCODE_PARAMETERS
    36. {
    37.   PVOID Ntdll;
    38.   PVOID Kernel32;
    39.   PVOID (NTAPI *LoadLibraryA)(PCHAR);
    40.   PVOID (NTAPI *GetProcAddress)(PVOID, PCHAR);
    41.   ULONG DataSize; // shellcode-specific parameter size
    42.   UCHAR Data[1]; // shellcode-specific parameters
    43. };
    44.  
    45. //
    46. // User-Mode shellcode
    47. //
    48. #pragma code_seg("USER1")
    49. #pragma optimize("y", off)
    50. #pragma warning(disable:4733)
    51. VOID UsermodeShellcode (DRIVER_TO_SHELLCODE_PARAMETERS *Params)
    52. {
    53.   char szNtTerminateThread[] = {'N', 't', 'T', 'e', 'r', 'm', 'i', 'n', 'a', 't', 'e', 'T', 'h', 'r', 'e', 'a', 'd', 0};
    54.   char szAllocConsole[] = {'A', 'l', 'l', 'o', 'c', 'C', 'o', 'n', 's', 'o', 'l', 'e', 0};
    55.     //char szAllocConsole[] = {'F', 'r', 'e', 'e', 'C', 'o', 'n', 's', 'o', 'l', 'e', 0};
    56.   NTSTATUS (NTAPI *pNtTerminateThread)(HANDLE, NTSTATUS);
    57.   BOOLEAN (NTAPI *pAllocConsole)();
    58.  
    59.   *(PVOID*)&pNtTerminateThread = Params->GetProcAddress(Params->Ntdll, szNtTerminateThread);
    60.   *(PVOID*)&pAllocConsole = Params->GetProcAddress(Params->Kernel32, szAllocConsole);
    61.  
    62.   //
    63.   // Unfortunately, Windows7 generates strange INT3s in AllocConsole.
    64.   // So, we have to setup SEH handler and ignore them.
    65.   //
    66.   __asm
    67.   {
    68.     call _1
    69. _1: pop eax
    70.     sub eax, _1
    71.     add eax, _handler
    72.     push eax
    73.     push dword ptr fs:[0]
    74.     mov fs:[0], esp
    75.   }
    76.  
    77.   pAllocConsole ();
    78.   char szWinInet[] = {'w', 'i', 'n', 'i', 'n', 'e', 't', '.', 'd', 'l', 'l', 0};
    79.   char szLoadLibraryExA[] = {'L', 'o', 'a', 'd', 'L', 'i', 'b', 'r', 'a', 'r', 'y', 'E', 'x', 'A', 0};
    80.   PVOID (NTAPI *pLoadLibraryExA)(PCHAR,PVOID,ULONG);
    81.   *(PVOID*)&pLoadLibraryExA = Params->GetProcAddress(Params->Kernel32, szLoadLibraryExA);
    82.  
    83.   PVOID wininet = 0;
    84.  
    85.   if (pLoadLibraryExA)
    86.     wininet = pLoadLibraryExA(szWinInet, NULL, 0);
    87.  
    88.   __asm
    89.   {
    90.     pop dword ptr fs:[0]
    91.   }
    92.  
    93.   pNtTerminateThread(0, (NTSTATUS)wininet);
    94.  
    95.   __asm
    96.   {
    97.     // Should not reach here..
    98.     ud2
    99.  
    100. _handler:
    101.     //
    102.     // SEH handler.
    103.     //
    104.     xor eax, eax ; eax = ExceptionContinueExecution
    105.     mov ecx, [esp + 4] ; exception record
    106.     mov ecx, [ecx] ; exception code
    107.     cmp ecx, 0x80000003
    108.     jz _int3
    109.  
    110.     // Not an INT3, pass down.
    111.     inc eax ; ExceptionContinueSearch
    112.     jmp _q
    113.  
    114. _int3:
    115.     // Int3, increment EIP and ignore this exception.
    116.     mov ecx, [esp + 12] ; CONTEXT
    117.     inc dword ptr [ecx + 0xb8] ; CONTEXT::Eip
    118.     // eax already contains ExceptionContinueExecution
    119.  
    120. _q:
    121.     retn
    122.   }
    123. }
    124. #pragma warning(default:4733)
    125. #pragma optimize("y", on)
    126. #pragma code_seg()
    127.  
    128. //
    129. // CSRSS notify parameters
    130. //
    131. struct CSRSS_NOTIFY_PARAMETERS
    132. {
    133.   HANDLE hThread;
    134.   CLIENT_ID ClientId;
    135. };
    136.  
    137. struct CSR_API_MSG
    138. {
    139.   UCHAR PortHeader[0x18];
    140.   PVOID CaptureBuffer; // 0x18
    141.   ULONG ApiNumber; // 0x1c
    142.   ULONG ReturnValue; // 0x20
    143.   ULONG Reserved; // 0x24
    144. }; // sizeof = 0x28
    145.  
    146. struct REG_THREAD_API_MSG
    147. {
    148.   CSR_API_MSG CsrHeader;
    149.   HANDLE hThread; // 0x28
    150.   CLIENT_ID ClientId; // 0x2c
    151. };
    152.  
    153. //
    154. // CSRSS shellcode
    155. //
    156. #pragma code_seg("USER2")
    157. #pragma optimize("y", off)
    158. VOID CsrShellcode (DRIVER_TO_SHELLCODE_PARAMETERS *Params)
    159. {
    160.   CSRSS_NOTIFY_PARAMETERS *p = (CSRSS_NOTIFY_PARAMETERS*) Params->Data;
    161.  
    162.   // csrsrv.dll functions
    163.   char szCsrsrvDll[] = {'c', 's', 'r', 's', 'r', 'v', '.', 'd', 'l', 'l', 0};
    164.   char szCsrCreateRemoteThread[] = {'C', 's', 'r', 'C', 'r', 'e', 'a', 't', 'e', 'R', 'e', 'm', 'o', 't', 'e', 'T', 'h', 'r', 'e', 'a', 'd', 0};
    165.  
    166.   // ntdll.dll functions
    167.   char szNtTerminateThread[] = {'N', 't', 'T', 'e', 'r', 'm', 'i', 'n', 'a', 't', 'e', 'T', 'h', 'r', 'e', 'a', 'd', 0};
    168.   char szNtOpenThread[] = {'N', 't', 'O', 'p', 'e', 'n', 'T', 'h', 'r', 'e', 'a', 'd', 0};
    169.   char szNtClose[] = {'N', 't', 'C', 'l', 'o', 's', 'e', 0};
    170.  
    171.   // pointers
    172.   PVOID csrsrv;
    173.   NTSTATUS Status;
    174.   NTSTATUS (NTAPI *pCsrCreateRemoteThread)(HANDLE hThread, PCLIENT_ID ClientId);
    175.   NTSTATUS (NTAPI *pNtOpenThread)(PHANDLE,ULONG,POBJECT_ATTRIBUTES,PCLIENT_ID);
    176.   NTSTATUS (NTAPI *pNtClose)(HANDLE);
    177.   NTSTATUS (NTAPI *pNtTerminateThread)(HANDLE, NTSTATUS);
    178.  
    179.   csrsrv = Params->LoadLibraryA(szCsrsrvDll);
    180.   if (csrsrv)
    181.   {
    182.     *(PVOID*)&pCsrCreateRemoteThread = Params->GetProcAddress(csrsrv, szCsrCreateRemoteThread);
    183.     *(PVOID*)&pNtOpenThread = Params->GetProcAddress(Params->Ntdll, szNtOpenThread);
    184.     *(PVOID*)&pNtClose = Params->GetProcAddress(Params->Ntdll, szNtClose);
    185.  
    186.     if (!(pCsrCreateRemoteThread && pNtOpenThread && pNtClose))
    187.     {
    188.       Status = 0xF0000003;
    189.     }
    190.     else
    191.     {
    192.       OBJECT_ATTRIBUTES Oa = STATIC_OBJECT_ATTRIBUTES(NULL, 0, 0, 0);
    193.       HANDLE hThread;
    194.       PVOID Process = 0;
    195.       CLIENT_ID ClientId = p->ClientId;
    196.  
    197.       Status = pNtOpenThread (&hThread, THREAD_ALL_ACCESS, &Oa, &ClientId);
    198.       if (NT_SUCCESS(Status))
    199.       {
    200.         Status = pCsrCreateRemoteThread (hThread, &ClientId);
    201.         pNtClose (hThread);
    202.       }      
    203.     }
    204.   }
    205.   else Status = 0xF0000001;
    206.  
    207.   *(PVOID*)&pNtTerminateThread = Params->GetProcAddress(Params->Ntdll, szNtTerminateThread);
    208.  
    209.   pNtTerminateThread(0, Status);
    210.  
    211.   for(;;);
    212. }
    213. #pragma optimize("y", on)
    214. #pragma code_seg()
    215.  
    216. NTSTATUS NotifyCsrss (HANDLE hThread, CLIENT_ID ClientId, ULONG SessionId)
    217. {
    218.   PVOID SelfBase = FindBase (NotifyCsrss);
    219.   PUCHAR SectionStart;
    220.   ULONG SectionSize;
    221.   NTSTATUS Status;
    222.  
    223.   Status = LocateSection (SelfBase, "USER2", &SectionStart, &SectionSize);
    224.   DbgPrint ("[csr] LocateSection(%p): %08x\n", SelfBase, Status);
    225.  
    226.   if (NT_SUCCESS(Status))
    227.   {
    228.     PEPROCESS Csrss = GetProcessByNameAndSessionId(L"csrss.exe", &SessionId, NULL);
    229.     DbgPrint ("[csr] Csrss = %p\n", Csrss);
    230.  
    231.     if (Csrss)
    232.     {
    233.       CSRSS_NOTIFY_PARAMETERS Params;
    234.       Params.ClientId = ClientId;
    235.       Params.hThread = hThread;
    236.  
    237.       Status = InjectIntoStartedProcess (
    238.         Csrss,
    239.         SectionStart,
    240.         SectionSize,
    241.         TRUE,
    242.         &Params,
    243.         sizeof(Params)
    244.         );
    245.  
    246.       DbgPrint ("[csr] InjectIntoStartedProcess = %x\n", Status);
    247.  
    248.       ObDereferenceObject (Csrss);
    249.     }
    250.   }
    251.  
    252.   return Status;
    253. }
    254.  
    255.  
    256. NTSTATUS
    257. InjectIntoStartedProcess(
    258.   PEPROCESS Process,
    259.   PUCHAR pModule,
    260.   ULONG ModuleSize,
    261.   BOOLEAN NativeThread,
    262.   PVOID InjectData,
    263.   SIZE_T InjectDataSize
    264.   )
    265. {
    266.   KAPC_STATE ApcState;
    267.   PVOID StackBase = 0;
    268.   ULONG StackSize = PAGE_SIZE*4;
    269.   INITIAL_TEB InitialTeb = {0};
    270.   HANDLE hProcess = 0;
    271.   CONTEXT Ctx = {CONTEXT_FULL};
    272.   NTSTATUS Status;
    273.   CLIENT_ID ClientId;
    274.   HANDLE hThread = 0;
    275.   OBJECT_ATTRIBUTES Oa = STATIC_OBJECT_ATTRIBUTES (NULL, OBJ_KERNEL_HANDLE, 0, 0);
    276.   PVOID UserModule;
    277.   BOOLEAN Success = FALSE;
    278.   PEPROCESS CsrProcess = 0;
    279.   PMDL Mdl = 0;
    280.   PVOID CsrInjectionMapping = 0;
    281.   SIZE_T SizeOfParameters = sizeof(DRIVER_TO_SHELLCODE_PARAMETERS) + InjectDataSize - 1;
    282.   ULONG AlignedSize = ALIGN_UP (ModuleSize + SizeOfParameters, PAGE_SIZE*16);
    283.   DRIVER_TO_SHELLCODE_PARAMETERS *Params;
    284.   ULONG Code = 0, Ret = 0;
    285.   THREAD_BASIC_INFORMATION Basic = {0};
    286.   PROCESS_SESSION_INFORMATION Session = {0};
    287.  
    288.   InjectDataSize = ALIGN_UP (InjectDataSize, sizeof(ULONG));
    289.  
    290.   do
    291.   {
    292.     // Open process
    293.     Status = ObOpenObjectByPointer (Process, OBJ_KERNEL_HANDLE, NULL, SYNCHRONIZE, *PsProcessType, KernelMode, &hProcess);
    294.     DbgPrint("ObOpenObjectByPointer completed with status %08x\n", Status);
    295.     if (!NT_SUCCESS(Status)) break;
    296.  
    297.     // Query session id
    298.     Status = ZwQueryInformationProcess (hProcess, ProcessSessionInformation, &Session, sizeof(Session), &Ret);
    299.     DbgPrint ("ZwQueryInformationProcess: %lx,  Process session: %d\n", Status, Session.SessionId);
    300.     if (!NT_SUCCESS(Status)) break;
    301.  
    302.     // Allocate space for our code and data
    303.     UserModule = xVirtualAllocEx(hProcess, NULL, AlignedSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    304.     DbgPrint ("UserModule = %p\n", UserModule);
    305.     if (UserModule == NULL) break;
    306.    
    307.     // Allocate stack
    308.     StackBase = xVirtualAllocEx (hProcess, NULL, StackSize, MEM_COMMIT, PAGE_READWRITE);
    309.     DbgPrint ("xVirtualAllocEx allocated memory at %p\n", StackBase);
    310.     if (StackBase == NULL) break;
    311.  
    312.     // Copy code
    313.     KeStackAttachProcess (&Process->Pcb, &ApcState);
    314.     {
    315.       // Copy section
    316.       memcpy (UserModule, pModule, ModuleSize);
    317.  
    318.       DbgPrint("Module copied.\n");
    319.  
    320.       // Get pointer to DRIVER_TO_SHELLCODE_PARAMETERS
    321.       Params = (DRIVER_TO_SHELLCODE_PARAMETERS*)( (PUCHAR)UserModule + AlignedSize - SizeOfParameters );
    322.       DbgPrint ("Params %p, sizeof data %d\n", Params, InjectDataSize);
    323.  
    324.       // Fill base addresses
    325.       Params->Ntdll = FindNtdll();
    326.       Params->Kernel32 = UserFindModule(L"kernel32.dll");
    327.       DbgPrint ("ntdll %p kernel32 %p\n", Params->Ntdll, Params->Kernel32);
    328.  
    329.       // Copy inject data
    330.       Params->DataSize = InjectDataSize;
    331.       if (InjectDataSize)
    332.         memcpy (Params->Data, InjectData, InjectDataSize);
    333.  
    334.       // Fill entry points
    335.       *(PVOID*)&Params->LoadLibraryA = GetProcedureAddressEx(Params->Kernel32, "LoadLibraryA", NULL);
    336.       *(PVOID*)&Params->GetProcAddress = GetProcedureAddressEx(Params->Kernel32, "GetProcAddress", NULL);
    337.       DbgPrint ("LLA %p GPA %p\n", Params->LoadLibraryA, Params->GetProcAddress);
    338.  
    339.       // Save pointer on the stack.
    340.       Ctx.Esp = (ULONG)StackBase + StackSize - 8;
    341.       *(PVOID*)(Ctx.Esp + 4) = Params;
    342.     }
    343.     KeUnstackDetachProcess (&ApcState);
    344.    
    345.     Ctx.SegCs = 0x1b;
    346.     Ctx.SegDs = 0x23;
    347.     Ctx.SegEs = 0x23;
    348.     Ctx.SegSs = 0x23;
    349.     Ctx.SegFs = 0x3b;
    350.     Ctx.EFlags = 0x202;
    351.     Ctx.Eip = (ULONG)UserModule;
    352.  
    353.     // Create thread
    354.     InitialTeb.StackTop = (PUCHAR) StackBase + StackSize;
    355.     InitialTeb.StackBase = StackBase;
    356.     Status = ZwXXX (nNtCreateThread, &hThread, THREAD_ALL_ACCESS, &Oa, hProcess, &ClientId, &Ctx, &InitialTeb, TRUE);
    357.     DbgPrint ("ZwCreateThread returned %08x, hThread = %x\n", Status, hThread);
    358.     if (!NT_SUCCESS(Status)) break;
    359.  
    360.     if (!NativeThread)
    361.     {
    362.       Status = NotifyCsrss (hThread, ClientId, Session.SessionId);
    363.       DbgPrint ("NotifyCsrss: %08x\n", Status);
    364.     }
    365.  
    366.     Status = ZwXXX (nResumeThread, hThread, NULL);
    367.     DbgPrint ("ZwResumeThread returned %08x\n", Status);
    368.  
    369.     DbgPrint ("Waiting for the thread...\n");
    370.  
    371.     Status = ZwWaitForSingleObject(hThread, FALSE, NULL);
    372.     DbgPrint ("Wait succeeded, status %08x\n", Status);
    373.  
    374.     Status = ZwQueryInformationThread (hThread, ThreadBasicInformation, &Basic, sizeof(Basic), &Ret);
    375.     DbgPrint ("ZwQueryInformationThread %lx  ExitStatus = %lx\n", Status, Basic.ExitStatus);
    376.  
    377.     Success = TRUE;
    378.     Status = Basic.ExitStatus;
    379.  
    380.   } while (FALSE);
    381.  
    382.   if (hProcess)
    383.     ZwClose (hProcess);
    384.  
    385.   if (hThread)
    386.     ZwClose (hThread);
    387.  
    388.   ZwFreeVirtualMemory(hProcess, &StackBase, &StackSize, MEM_RELEASE);
    389.   ZwFreeVirtualMemory(hProcess, &UserModule, &ModuleSize, MEM_RELEASE);
    390.  
    391.   return Status;
    392. }
    393.  
    394. UCHAR Module[200];
    395.  
    396.  
    397. // Driver entry point
    398. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    399. {
    400.   NTSTATUS Status;
    401.  
    402.     DbgPrint("[~] DriverEntry()\n");
    403.  
    404.   nNtCreateThread = GetFunctionSdtNumber("NtCreateThread");
    405.   nResumeThread = GetFunctionSdtNumber("NtResumeThread");
    406.   DbgPrint ("nNtCreateThread = %x  nResumeThread = %x\n", nNtCreateThread, nResumeThread);
    407.  
    408.   if (nNtCreateThread != -1 && nResumeThread != -1)
    409.   {
    410.     PVOID SelfBase = FindBase (DriverEntry);
    411.     DbgPrint ("SelfBase %p\n", SelfBase);
    412.  
    413.     PUCHAR SectionStart;
    414.     ULONG SectionSize;
    415.  
    416.     Status = LocateSection (SelfBase, "USER1", &SectionStart, &SectionSize);
    417.     DbgPrint ("LocateSection returned %08x, %p-%x\n", Status, SectionStart, SectionSize);
    418.  
    419.     if (NT_SUCCESS(Status))
    420.     {
    421.       ULONG SessionId;
    422.       PEPROCESS Explorer = GetProcessByNameAndSessionId(L"explorer.exe", NULL, &SessionId);
    423.       DbgPrint ("Explorer = %p, SessionId = %d\n", Explorer, SessionId);
    424.  
    425.       if (Explorer)
    426.       {
    427.         Status = InjectIntoStartedProcess (
    428.           Explorer,
    429.           SectionStart,
    430.           SectionSize,
    431.           FALSE,
    432.           "6789",
    433.           4
    434.           );
    435.  
    436.         DbgPrint ("InjectIntoStartedProcess = %x\n", Status);
    437.  
    438.         ObDereferenceObject (Explorer);
    439.       }
    440.     }
    441.   }
    442.  
    443.     DbgPrint("[+] Driver initialization successful\n");
    444.     return STATUS_UNSUCCESSFUL;
    445. }
     
  4. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
  5. x64

    x64 New Member

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

    Наверное, как обычно, разбором таблицы экспорта, не?

    У тебя в коде ошибка.
     
  6. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Неактуально
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ты бы всё же показал свой код для начала. Чудес ведь не бывает. Если все другие программы показывают, что в kernel32.dll на Windows 7 эти функции есть, значит они там таки есть, и значит тебе следует поискать ошибку в своём коде. Как модератор, прошу вынести исследование этой проблемы отдельной темой в разделе .WIN32, т.к. к созданию процесса из ядра всё это не имеет прямого отношения.
     
  8. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    поиск ведется из ядра, цель запустить процесс
    Код (Text):
    1.         xor     eax,eax                  
    2.         mov     Counter,eax      
    3.  
    4.         mov     esi,kernel              
    5.                                          
    6.         add     esi,3Ch
    7.         lodsw                          
    8.         add     eax,kernel          
    9.  
    10.         mov     esi,[eax+78h]          
    11.                                            
    12.         add     esi,kernel            
    13.                                            
    14.         add     esi,1Ch
    15.  
    16.         lodsd                                
    17.         add     eax,kernel          
    18.         mov     AddressTableVA,eax
    19.  
    20.         lodsd                                
    21.         add     eax,kernel              
    22.         push    eax                        
    23.  
    24.         lodsd                                  
    25.         add     eax,kernel              
    26.         mov     OrdinalTableVA,eax
    27.  
    28.         pop     esi                            
    29.  
    30.  p1:   push    esi                            
    31.         lodsd                                  
    32.         add     eax,kernel            
    33.         mov     esi,eax                      
    34.  
    35.     cmp         byte ptr [esi],'A'
    36.     jb      p3
    37.     cmp         byte ptr [esi],'z'
    38.     ja      p3
    39.  
    40.         call        print_name
    41.  
    42.         movzx   eax,word ptr Counter    
    43.         shl     eax,1                        
    44.         add     eax,OrdinalTableVA
    45.         xor     esi,esi                        
    46.         xchg    eax,esi                      
    47.         lodsw                                  
    48.         shl     eax,2                        
    49.         add     eax,AddressTableVA
    50.         mov     esi,eax                        
    51.         lodsd                                  
    52.         add     eax,kernel                
    53.      
    54.         call        print_offset
    55.        
    56.         pop     esi                            
    57.         add     esi,4                        
    58.         inc     Counter
    59.         jmp     p1    
    60.  p3:
    повторюсь, этот код под XP прекрасно пашет, находит WinExec.
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это одно дело. Но рассуждения на тему "почему не могу найти такой-то экспорт в таком-то модуле" имеют отношение разве что к формату PE-файлов, но никак не к "созданию процесса из ядра". Посему, ещё раз повторяю: господа, пожалуйста, будьте аккуратнее с выбором темы и не сваливайте всё в одну кучу. По проблеме посоветую переписать код на C и попробовать отладить его в приложении пользовательского режима. Или хотя бы найти аналогичные исходники и посмотреть, как реализовано там.
     
  10. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Неактуально
     
  11. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Появилось время заняться любимым делом, просмотрел коды и нашел ошибку, нижеследующий код возвращает ПРАВИЛЬНЫЙ адрес базы, и все что написано выше заработало.
    С наступающим Новым годом. :)

    Код (Text):
    1.                            
    2. if (!kernel)
    3. {
    4.     KeStackAttachProcess((PKPROCESS)pSystemProcess,&KapcState);
    5.     __asm
    6.     {
    7.         //pPEB  =   pSystemProcess -> Peb;
    8.         mov eax, pSystemProcess
    9.         mov ebx, [eax+0x1a8]   //PEB
    10.         mov edx,[ebx+0x0c]      //Ldr;
    11.         mov edx, [edx+0x14]      // get the first module from the InMemoryOrder module list
    12.         cld
    13.     next_mod:
    14.         mov esi, [edx+0x28]       // get pointer to modules name (unicode string)
    15.         mov ecx, 24                  // set ecx to this length for the loop
    16.         xor edi, edi                    // clear edi which will store the hash of the module name
    17.     loop_modname:
    18.         xor eax, eax              
    19.         lodsb                           // read in the next byte of the name
    20.         cmp al, 'a'                    // some versions of Windows use lower case module names
    21.         jl not_lowercase
    22.         sub al, 0x20                 // if so normalise to uppercase
    23.     not_lowercase:
    24.         ror edi, 13                    // rotate right our hash value
    25.         add edi, eax                 // add the next byte of the name to the hash
    26.         loop loop_modname       // loop until we have read enough
    27.         cmp edi, 0x6A4ABC5B    // compare the hash with that of KERNEL32.DLL
    28.         mov ebx, [edx+0x10]    // get this modules base address
    29.         mov edx, [edx]            // get the next module
    30.         jne next_mod              // if it doesn't match, process the next module
    31.         mov kernel,ebx
    32.     }
    33. }
     
  12. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    at0s
    А весь код можно? Чтобы хоть знать с чего начинать.
     
  13. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    _sheva740
    Там в 7 не kernelbase..
     
  14. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    проект kexec(запуск процесса из драйвера).
     
  15. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Рано обрадовался (((
    заработало частично
    1. адрес kernell32.dll нахожу (пост 51)
    2. получаемый адрес winexec совпадает с dependency walker
    3. дебаггер сам определяет адрес 76dee695 как offset kernel32!WinExec
    но explorer падает при запуске
    где искать ???

    Код (Text):
    1. kd> u 02b10940
    2. 02b10940 90               nop
    3. 02b10941 b895e6de76  mov     eax,offset kernel32!WinExec (76dee695) <------
    4. 02b10946 6a01               push    1
    5. 02b10948 685409b102      push    2B10954h
    6. 02b1094d ffd0                call    eax
    7. 02b1094f e99a010000       jmp     02b10aee
    8. .....
    9. 02b10aee 90                 nop
    10. 02b10aef c20c00             ret     0Ch
    11.  
    12. kd> dt -ca20 UCHAR 2B10954
    13. _ke_7!UCHAR
    14. [0] @ 02b10954 0x43 'C'
    15. [1] @ 02b10955 0x3a ':'
    16. [2] @ 02b10956 0x5c '\'
    17. [3] @ 02b10957 0x74 't'
    18. [4] @ 02b10958 0x65 'e'
    19. [5] @ 02b10959 0x6d 'm'
    20. [6] @ 02b1095a 0x70 'p'
    21. [7] @ 02b1095b 0x5c '\'
    22. [8] @ 02b1095c 0x63 'c'
    23. [9] @ 02b1095d 0x6d 'm'
    24. [10] @ 02b1095e 0x64 'd'
    25. [11] @ 02b1095f 0x2e '.'
    26. [12] @ 02b10960 0x65 'e'
    27. [13] @ 02b10961 0x78 'x'
    28. [14] @ 02b10962 0x65 'e'
    29. [15] @ 02b10963 0 ''
     
  16. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Народ !!!

    пройдемся еще раз
    - WIN 7.
    - находим explorer.exe
    - находим Alertable Thread
    - находим WINEXEC ( kernel32 )

    - pApc = ExAllocatePoolWithTag
    - pnMdl = IoAllocateMdl (ApcCreateProcess, dwsize, FALSE,FALSE,NULL);
    - KeStackAttachProcess(&(pTargetProcess->Pcb), &ApcState);
    - pMappedAddress = MmMapLockedPagesSpecifyCache(pnMdl,UserMode,MmCached,NULL,FALSE,NormalPagePriority);
    - туда пишем
    int 3
    mov eax,0x12345678 // winexec
    push 1
    push 0x90abcdef // name
    call eax
    jmp end

    - KeUnstackDetachProcess (&ApcState);
    - KeInitializeApc(pApc,pTargetThread,
    OriginalApcEnvironment,
    &ApcKernelRoutine,NULL,
    pMappedAddress, UserMode, (PVOID) NULL);
    - KeInsertQueueApc(pApc,0,NULL,0))
    - pTargetThread->ApcState.UserApcPending = TRUE;

    дело до int 3 не доходит, explorer падает, в чем может быть проблема ?
     
  17. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Так он и будет падать на int 3 без активного отладчика. Ты бы ещё DbgBreakPoint() вызвал в драйвере без подключённого отладчика ядра и удивлялся бы потом, чего это система падает. В любом случае, подключи отладчик к Проводнику и посмотри, где именно падает: запусти систему под отладкой, дальше найди ID процесса Проводника, дай команду !bpid <pid> и дождись подключения UM-отладчика. Когда Проводник навернётся, получишь управление прямо в WinDbg, затем kb ну и дальше анализ.
     
  18. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    так все дело в том что, windbg подключен, там куча int 3, и я, все ключевые моменты ( структуры и поля) проверяю в ручную.Когда падает explorer, windbg не получает управления, а ось предлагает перегрузить explorer и беззаботно живет дальше.
    Код (Text):
    1.   * * * * *  running C:\temp\myprog.exe
    2.  * * * * * RP -> TargetProcess :  0x85F9FB40  
    3.  * * * * * RP -> Thread:  0x85F9F858  Alertable:No
    4.  * * * * * RP -> Thread:  0x85FA3D48  Alertable:Yes
    5.  * * * * * RP -> Thread:  0x85FA8980  Alertable:No
    6.  * * * * * RP -> Thread:  0x85FA8490  Alertable:No
    7.  * * * * * RP -> Thread:  0x85FA7598  Alertable:No
    8.  * * * * * RP -> Thread:  0x85FA9C10  Alertable:No
    9.  * * * * * RP -> Thread:  0x85FC2D48  Alertable:Yes <------
    10.  * * * * * RP -> Thread:  0x85BE5030  Alertable:Yes
    11.  * * * * * RP -> Thread:  0x85BD1030  Alertable:Yes
    12.  * * * * * RP -> Thread:  0x85BE4030  Alertable:Yes
    13.  * * * * * RP -> Thread:  0x85BE3030  Alertable:Yes
    14.  * * * * * RP -> Thread:  0x85BDF030  Alertable:No
    15.  * * * * * RP -> Thread:  0x85BF3150  Alertable:Yes
    16.  * * * * * RP -> Thread:  0x85BF6150  Alertable:Yes
    17.  * * * * * RP -> Thread:  0x85BF2030  Alertable:No
    18.  * * * * * RP -> Thread:  0x85D79150  Alertable:Yes
    19.  * * * * * RP -> Thread:  0x85C31150  Alertable:Yes
    20. >> * * * * * kernel base  -> 76f30000
    21.  * * * * * KernelExec -> Targeted thread: 0x85FC2D48
    22. Break instruction exception - code 80000003 (first chance)
    23. _ke_7+0x35ff:
    24. 916ce5ff cc              int     3
    25. kd> !bpid 85F9FB40
    26. Finding wininit.exe (-1)...
    27. Waiting for wininit.exe to break.  This can take a couple of minutes...
    28.  
    29.  * * * * * KernelExec -> UserMode memory at address: 0x01AF08C0
    30. Break instruction exception - code 80000003 (first chance)
    31. Event occurred in wrong process
    32. kd> !bpid 85F9FB40
    33. Finding wininit.exe (-1)...
    34. Waiting for wininit.exe to break.  This can take a couple of minutes...
    35.  
    36.  * * * * * KernelExec -> ApcKernelRoutine called. Memory freed.
    37.  * * * * * KernelExec -> APC delivered
    38.  * * * * * KernelExec -> DONE
    39.  
    40. Break instruction exception - code 80000003 (first chance)
    41. Event occurred in wrong process
    42. kd> !bpid 85F9FB40
    43. Finding wininit.exe (-1)...
    44. Waiting for wininit.exe to break.  This can take a couple of minutes...
    45.  
    46.  Break instruction exception - code 80000003 (first chance)
    47. Break into process 85f9fb40 set.  The next break should be in the desired process.
    48.  
    49. explorer уже лежит
    50.  
    51. * * * * * MyWait: 77   tempcount : 1
    52. * * * * * RP -> INITIALIZATION   END
    Еще мысли есть ?
     
  19. x64

    x64 New Member

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

    Какие тут ещё могут быть мысли, если у тебя даже отладчик подключён? Там что, не видно где упало? Выложи дамп или сэмпл, посмотрим. Ещё могу посоветовать воспользоваться Application Verifier - неплохая штука, мне пару раз помогала (ну у меня heap corruption был, ничего особенного).
     
  20. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Ядерный