Созадать новый процесс из драйвера

Тема в разделе "WASM.NT.KERNEL", создана пользователем elimli, 6 мар 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Windows 2000 kernel32 source: http://gr8.cih.ms/uploads/win2k_kernel32_src.rar (445 kb)
    Windows NT4 kernel32 source: http://gr8.cih.ms/uploads/nt4_kernel32_src.rar (341 kb)
     
  2. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
  3. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    А может проще не дать закрыть главную программу?)
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кстати в сорсах лоадера, точнее в функции Phase1Initialization когда запускается процесс SMSS в пользовательском режиме, юзается функция PsCreateUserProcess (название не помню). Можете ее сорсы посмотреть.

    Кому надо, выложу сорсы загрузчика винды (NT 4)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вот кусок Phase1Initialization, запускающий Session Manager (Smss):

    Код (Text):
    1.     //
    2.     // Set up process parameters for the Session Manager Subsystem
    3.     //
    4.  
    5.     Size = sizeof( *ProcessParameters ) +
    6.            ((DOS_MAX_PATH_LENGTH * 4) * sizeof( WCHAR ));
    7.     ProcessParameters = NULL;
    8.     Status = ZwAllocateVirtualMemory( NtCurrentProcess(),
    9.                                       (PVOID *)&ProcessParameters,
    10.                                       0,
    11.                                       &Size,
    12.                                       MEM_COMMIT,
    13.                                       PAGE_READWRITE
    14.                                     );
    15.     if (!NT_SUCCESS( Status )) {
    16. #if DBG
    17.         sprintf(DebugBuffer,
    18.                 "INIT: Unable to allocate Process Parameters. 0x%lx\n",
    19.                 Status);
    20.  
    21.         RtlInitAnsiString(&AnsiDebugString, DebugBuffer);
    22.         if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeDebugString,
    23.                                               &AnsiDebugString,
    24.                                           TRUE)) == FALSE) {
    25.             KeBugCheck(SESSION1_INITIALIZATION_FAILED);
    26.         }
    27.         ZwDisplayString(&UnicodeDebugString);
    28. #endif // DBG
    29.         KeBugCheckEx(SESSION1_INITIALIZATION_FAILED,Status,0,0,0);
    30.     }
    31.  
    32.     ProcessParameters->Length = Size;
    33.     ProcessParameters->MaximumLength = Size;
    34.     //
    35.     // Reserve the low 1 MB of address space in the session manager.
    36.     // Setup gets started using a replacement for the session manager
    37.     // and that process needs to be able to use the vga driver on x86,
    38.     // which uses int10 and thus requires the low 1 meg to be reserved
    39.     // in the process. The cost is so low that we just do this all the
    40.     // time, even when setup isn't running.
    41.     //
    42.     ProcessParameters->Flags = RTL_USER_PROC_PARAMS_NORMALIZED | RTL_USER_PROC_RESERVE_1MB;
    43.  
    44.     Size = PAGE_SIZE;
    45.     Status = ZwAllocateVirtualMemory( NtCurrentProcess(),
    46.                                       (PVOID *)&ProcessParameters->Environment,
    47.                                       0,
    48.                                       &Size,
    49.                                       MEM_COMMIT,
    50.                                       PAGE_READWRITE
    51.                                     );
    52.     if (!NT_SUCCESS( Status )) {
    53. #if DBG
    54.         sprintf(DebugBuffer,
    55.                 "INIT: Unable to allocate Process Environment 0x%lx\n",
    56.                 Status);
    57.  
    58.         RtlInitAnsiString(&AnsiDebugString, DebugBuffer);
    59.         if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeDebugString,
    60.                                               &AnsiDebugString,
    61.                                           TRUE)) == FALSE) {
    62.             KeBugCheck(SESSION2_INITIALIZATION_FAILED);
    63.         }
    64.         ZwDisplayString(&UnicodeDebugString);
    65. #endif // DBG
    66.         KeBugCheckEx(SESSION2_INITIALIZATION_FAILED,Status,0,0,0);
    67.     }
    68.  
    69.     Dst = (PWSTR)(ProcessParameters + 1);
    70.     ProcessParameters->CurrentDirectory.DosPath.Buffer = Dst;
    71.     ProcessParameters->CurrentDirectory.DosPath.MaximumLength = DOS_MAX_PATH_LENGTH * sizeof( WCHAR );
    72.     RtlCopyUnicodeString( &ProcessParameters->CurrentDirectory.DosPath,
    73.                           &NtSystemRoot
    74.                         );
    75.  
    76.     Dst = (PWSTR)((PCHAR)ProcessParameters->CurrentDirectory.DosPath.Buffer +
    77.                   ProcessParameters->CurrentDirectory.DosPath.MaximumLength
    78.                  );
    79.     ProcessParameters->DllPath.Buffer = Dst;
    80.     ProcessParameters->DllPath.MaximumLength = DOS_MAX_PATH_LENGTH * sizeof( WCHAR );
    81.     RtlCopyUnicodeString( &ProcessParameters->DllPath,
    82.                           &ProcessParameters->CurrentDirectory.DosPath
    83.                         );
    84.     RtlAppendUnicodeToString( &ProcessParameters->DllPath, L"\\System32" );
    85.  
    86.     Dst = (PWSTR)((PCHAR)ProcessParameters->DllPath.Buffer +
    87.                   ProcessParameters->DllPath.MaximumLength
    88.                  );
    89.     ProcessParameters->ImagePathName.Buffer = Dst;
    90.     ProcessParameters->ImagePathName.MaximumLength = DOS_MAX_PATH_LENGTH * sizeof( WCHAR );
    91.     RtlAppendUnicodeToString( &ProcessParameters->ImagePathName,
    92.                               L"\\SystemRoot\\System32"
    93.                             );
    94.     RtlAppendUnicodeToString( &ProcessParameters->ImagePathName,
    95.                               L"\\smss.exe"
    96.                             );
    97.  
    98.     NullString.Buffer = L"";
    99.     NullString.Length = sizeof(WCHAR);
    100.     NullString.MaximumLength = sizeof(WCHAR);
    101.  
    102.     EnvString.Buffer = ProcessParameters->Environment;
    103.     EnvString.Length = 0;
    104.     EnvString.MaximumLength = (USHORT)Size;
    105.  
    106.     RtlAppendUnicodeToString( &EnvString, L"Path=" );
    107.     RtlAppendUnicodeStringToString( &EnvString, &ProcessParameters->DllPath );
    108.     RtlAppendUnicodeStringToString( &EnvString, &NullString );
    109.  
    110.     UnicodeSystemDriveString = NtSystemRoot;
    111.     UnicodeSystemDriveString.Length = 2 * sizeof( WCHAR );
    112.     RtlAppendUnicodeToString( &EnvString, L"SystemDrive=" );
    113.     RtlAppendUnicodeStringToString( &EnvString, &UnicodeSystemDriveString );
    114.     RtlAppendUnicodeStringToString( &EnvString, &NullString );
    115.  
    116.     RtlAppendUnicodeToString( &EnvString, L"SystemRoot=" );
    117.     RtlAppendUnicodeStringToString( &EnvString, &NtSystemRoot );
    118.     RtlAppendUnicodeStringToString( &EnvString, &NullString );
    119.  
    120.  
    121. #if 0
    122.     KdPrint(( "ProcessParameters at %lx\n", ProcessParameters ));
    123.     KdPrint(( "    CurDir:    %wZ\n", &ProcessParameters->CurrentDirectory.DosPath ));
    124.     KdPrint(( "    DllPath:   %wZ\n", &ProcessParameters->DllPath ));
    125.     KdPrint(( "    ImageFile: %wZ\n", &ProcessParameters->ImagePathName ));
    126.     KdPrint(( "    Environ:   %lx\n", ProcessParameters->Environment ));
    127.     Src = ProcessParameters->Environment;
    128.     while (*Src) {
    129.         KdPrint(( "        %ws\n", Src ));
    130.         while (*Src++) ;
    131.         }
    132.     }
    133. #endif
    134.  
    135.     ProcessParameters->CommandLine = ProcessParameters->ImagePathName;
    136.     SessionManager = ProcessParameters->ImagePathName;
    137.     Status = RtlCreateUserProcess(
    138.                 &SessionManager,
    139.                 OBJ_CASE_INSENSITIVE,
    140.                 RtlDeNormalizeProcessParams( ProcessParameters ),
    141.                 NULL,
    142.                 NULL,
    143.                 NULL,
    144.                 FALSE,
    145.                 NULL,
    146.                 NULL,
    147.                 &ProcessInformation
    148.                 );
    149.     if ( !NT_SUCCESS(Status) ) {
    150. #if DBG
    151.         sprintf(DebugBuffer,
    152.                 "INIT: Unable to create Session Manager. 0x%lx\n",
    153.                 Status);
    154.  
    155.         RtlInitAnsiString(&AnsiDebugString, DebugBuffer);
    156.         if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeDebugString,
    157.                                               &AnsiDebugString,
    158.                                           TRUE)) == FALSE) {
    159.             KeBugCheck(SESSION3_INITIALIZATION_FAILED);
    160.         }
    161.         ZwDisplayString(&UnicodeDebugString);
    162. #endif // DBG
    163.         KeBugCheckEx(SESSION3_INITIALIZATION_FAILED,Status,0,0,0);
    164.     }
    165.  
    166.     Status = ZwResumeThread(ProcessInformation.Thread,NULL);
    167.  
    168.     if ( !NT_SUCCESS(Status) ) {
    169. #if DBG
    170.         sprintf(DebugBuffer,
    171.                 "INIT: Unable to resume Session Manager. 0x%lx\n",
    172.                 Status);
    173.  
    174.         RtlInitAnsiString(&AnsiDebugString, DebugBuffer);
    175.         if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeDebugString,
    176.                                               &AnsiDebugString,
    177.                                           TRUE)) == FALSE) {
    178.             KeBugCheck(SESSION4_INITIALIZATION_FAILED);
    179.         }
    180.         ZwDisplayString(&UnicodeDebugString);
    181. #endif // DBG
    182.         KeBugCheckEx(SESSION4_INITIALIZATION_FAILED,Status,0,0,0);
    183.     }
    184.  
    185.     //
    186.     // Wait five seconds for the session manager to get started or
    187.     // terminate. If the wait times out, then the session manager
    188.     // is assumed to be healthy and the zero page thread is called.
    189.     //
    190.  
    191.     OldTime.QuadPart = Int32x32To64(5, -(10 * 1000 * 1000));
    192.     Status = ZwWaitForSingleObject(
    193.                 ProcessInformation.Process,
    194.                 FALSE,
    195.                 &OldTime
    196.                 );
    197.  
    198.     if (Status == STATUS_SUCCESS) {
    199.  
    200. #if DBG
    201.  
    202.         sprintf(DebugBuffer, "INIT: Session Manager terminated.\n");
    203.         RtlInitAnsiString(&AnsiDebugString, DebugBuffer);
    204.         RtlAnsiStringToUnicodeString(&UnicodeDebugString,
    205.                                      &AnsiDebugString,
    206.                                      TRUE);
    207.  
    208.         ZwDisplayString(&UnicodeDebugString);
    209.  
    210. #endif // DBG
    211.  
    212.         KeBugCheck(SESSION5_INITIALIZATION_FAILED);
    213.  
    214.     } else {
    215.         //
    216.         // Dont need these handles anymore.
    217.         //
    218.  
    219.         ZwClose( ProcessInformation.Thread );
    220.         ZwClose( ProcessInformation.Process );
    221.  
    222.         //
    223.         // Free up memory used to pass arguments to session manager.
    224.         //
    225.  
    226.         Size = 0;
    227.         Address = ProcessParameters->Environment;
    228.         ZwFreeVirtualMemory( NtCurrentProcess(),
    229.                              (PVOID *)&Address,
    230.                              &Size,
    231.                              MEM_RELEASE
    232.                            );
    233.  
    234.         Size = 0;
    235.         Address = ProcessParameters;
    236.         ZwFreeVirtualMemory( NtCurrentProcess(),
    237.                              (PVOID *)&Address,
    238.                              &Size,
    239.                              MEM_RELEASE
    240.                            );
    241.  
    242.         InitializationPhase += 1;
    243.         MmZeroPageThread();
    244.     }
    245. }
    246. // конец Phase1Initialization
    Винда создает Smss через RtlCreateUserProcess (хзчто такое, ни разу до этого не встречал её =\) и переходит в поток обнуления страниц (MmZeroPageThread)
     
  6. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    DoZENT
    А может проще не дать закрыть главную программу?
    К сожалению не проще. Есть масса методов закрыть процесс, и я не смог найти защиты против них..

    P.S В конце концов получилось запускать процесс из ядра, хоть и несколько кроссректально (зависит от конкретной верисии винды). А что это за RtlCreateUserProcess? Может ли эта ф-я запустиь процесс напрямую?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Сам хз=\ надо исходники дальше рыть. но судя по коду ее вызова, она это и делает..
     
  8. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Great
    Хмм, странно. Уж больно поросто. Зачем тогда огород городить с запуском через другой user mode процесс? Будет время - нужно будет попробовать.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    katrus
    только мне думается, что раз все так просто, значит, по закону подлости, она не экспортируется +)
    надо посмотреть
     
  10. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> А что это за RtlCreateUserProcess?
    хм, в DDK-шных хидерах не нашел её...
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    значит не экспортируется =\ тогда можно скопипастить сорс её себе в драйвер. или нагло найти среди вызовов в экспортируемых функциях
     
  12. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Как не экспортируется? Еще как экспортируется! По крайней мере в IDA эта ф-я в списке экспортируемых
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хехе, ты про ntdll?))
    ntdll и правда ее экспортирует
    а вот ядро - нет. придется мапить себе ntdll, искать ее вызов и посмотреть ее номер в SSDT
     
  14. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> придется мапить себе ntdll, искать ее вызов и посмотреть ее номер в SSDT
    причём тут системный вызов? это обёртка вокруг NtCreateProcess, итд.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Cr4sh
    хм и правда весь её код лежит в ntdll =\\ я думал, там просто mov eax, xx / SYSENTER
    а какже тогда ядро ее юзает.. наверное у него своя копия. вот ее и можно дернуть из драйвера
     
  16. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> а какже тогда ядро ее юзает..
    никак =)

    в kernel-mode нет простого и очевидного способа создания процесса... или писать свой аналог CreateProcess в драйвере, или внедрять шеллкод (который будет запускать новый процесс) в уже существующий
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    здрасте, приехали =)
    а как же код, что я постил? кусок Phase1Initialization, который вызывает RtlCreateUserProcess для запуска Smss ?
     
  18. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> а как же код, что я постил? кусок Phase1Initialization, который вызывает RtlCreateUserProcess для запуска Smss ?
    откуда именно был тот код?

    RtlCreateUserProcess я не нашел ни в импортах/ескпортах ни в символах ядра
     
  19. wasm_test

    wasm_test wasm test user

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

    ядро, nt4\private\ntos\init\init.c
    функция Phase1Initialization
     
  20. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    http://www.codeproject.com/useritems/KernelExec.asp