Проблема c RtlCreateUserProcess

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 27 фев 2009.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Точнее проблема в том что RtlCreateUserProcess возвращает успешно, а процесс нормально так и не создается.. Лишь ошибки The application failed initialized property (0xс000000d) и (0xс0000005)

    Вот код:
    Код (Text):
    1. .code
    2. start proc
    3. Local ClientId:CLIENT_ID, ThreadHandle:HANDLE
    4. Local Context:CONTEXT, Responce:ULONG
    5. local ProcessInformation:RTL_USER_PROCESS_INFORMATION
    6. local ProcessParameters:RTL_USER_PROCESS_PARAMETERS
    7. local ImagePath:UNICODE_STRING
    8.  
    9.        invoke RtlInitUnicodeString,addr ImagePath,$CTW0("\\SystemRoot\\System32\\calc.exe")
    10.        invoke RtlCreateProcessParameters,addr ProcessParameters,addr ImagePath,0,0,0,0,0,0,0,0
    11.         .if eax == 0
    12.            invoke RtlCreateUserProcess,addr ImagePath,OBJ_CASE_INSENSITIVE,addr ProcessParameters,0,0,0,0,0,0,addr ProcessInformation
    13.            invoke ZwResumeThread,ProcessInformation.Thread,0
    14.            invoke ZwWaitForSingleObject,ProcessInformation.Thread,0,0
    15.            invoke RtlDestroyProcessParameters,addr ProcessParameters
    16.         .endif
    17.      
    18.       invoke ExitProcess,0
    19. start endp
    20. end start
    Могет что неправильно делаю?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    чото типа
    CsrClientCallServer(..BasepCreateProcess..)
    надо перед ZwResumeThread
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Стырнул процедуру InformCsrss из кода Four-F.
    Код (Text):
    1. InformCsrss proc hProcess:HANDLE, hThread:HANDLE, pid:DWORD, tid:DWORD
    2.    local csrmsg:CSRMSG
    3.     invoke RtlZeroMemory, addr csrmsg, sizeof csrmsg
    4.     lea eax, csrmsg
    5.     assume eax:ptr CSRMSG
    6.     m2m [eax].ProcessInformation.hProcess, hProcess
    7.     m2m [eax].ProcessInformation.hThread, hThread
    8.     m2m [eax].ProcessInformation.dwProcessId, pid
    9.     m2m [eax].ProcessInformation.dwThreadId, tid
    10.     assume eax:nothing
    11.     invoke CsrClientCallServer, eax, 0, 10000h, 28h
    12.     ret
    13. InformCsrss endp
    Суравно не помогло..
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в RtlCreateUserProcess где HANDLE ParentProcess надо передавать NtCurrentProcess() а не NULL имхо.

    #define NtCurrentProcess() ((HANDLE)(LONG_PTR)-1)
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Так и так RtlCreateUserProcess нуль возвращает..
    Замена 0 на -1 ничего не изменило :P
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А где тогда c0000005 и c000000d ?
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    csrsrv.dll
    Код (Text):
    1. ▓.75B458B3: 8D8538FDFFFF                3lea         eax,[ebp][-000002C8]
    2. ▓.75B458B9: 50                           push        eax
    3. ▓.75B458BA: 56                           push        esi
    4. ▓.75B458BB: 56                           push        esi
    5. ▓.75B458BC: 56                           push        esi
    6. ▓.75B458BD: FFB5F4FDFFFF                 push        d,[ebp][-0000020C]
    7. ▓.75B458C3: 8D85D4FDFFFF                 lea         eax,[ebp][-0000022C]
    8. ▓.75B458C9: 56                           push        esi
    9. ▓.75B458CA: 56                           push        esi
    10. ▓.75B458CB: FFB5F0FDFFFF                 push        d,[ebp][-00000210]
    11. ▓.75B458D1: C78538FDFFFF44000000         mov         d,[ebp][-000002C8],000000044 ;'   D'
    12. ▓.75B458DB: 6A40                         push        000000040 ;'@'
    13. ▓.75B458DD: 50                           push        eax
    14. ▓.75B458DE: FF155411B475                 call        RtlCreateUserProcess ;ntdll
    За деталями -- в отладчик
     
  8. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Great, эти ошибки высвечиваются в созданном прилажении после ZwResumeThread
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Не верные параметры, впрочем этот статус и возвращен.
    Второй параметр:
    Код (Text):
    1. IN POBJECT_ATTRIBUTES ObjectAttributes
    В добавок к тому это натив, и следовательно имена должны быть соответствующие:
    Код (Text):
    1. "\??\SystemRoot\System32\calc.exe"
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Flasher
    А кто же мешает взять отладчик в зубы и подцепится к процессу до ZwResumeThread ?
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Great, были бы зубы, сам бы разобрался :)
    ObjectAttributes проблему не решает.

    Код (Text):
    1. start proc
    2. Local ClientId:CLIENT_ID, ThreadHandle:HANDLE
    3. Local Context:CONTEXT, Responce:ULONG
    4. local ProcessInformation:RTL_USER_PROCESS_INFORMATION
    5. local ProcessParameters:RTL_USER_PROCESS_PARAMETERS
    6. local ImagePath:UNICODE_STRING
    7. local oa:POBJECT_ATTRIBUTES
    8. local buffer[256]:byte
    9.  
    10.        invoke RtlInitUnicodeString,addr ImagePath,$CTW0("\\??\\C:\\Windows\\System32\\calc.exe")
    11.        invoke RtlCreateProcessParameters,addr ProcessParameters,addr ImagePath,0,0,0,0,0,0,0,0
    12.         .if eax == 0
    13.            invoke RtlCreateUserProcess,addr ImagePath,addr oa,addr ProcessParameters,0,0,0,-1,0,0,addr ProcessInformation
    14.             .if eax == 0
    15.                push eax
    16.                invoke InformCsrss,ProcessInformation.Process,ProcessInformation.Thread, ProcessInformation.ClientId.UniqueProcess, ProcessInformation.ClientId.UniqueThread
    17.                invoke ZwResumeThread,ProcessInformation.Thread,0
    18.                invoke ZwWaitForSingleObject,ProcessInformation.Thread,0,0
    19.                pop eax
    20.             .endif
    21.            invoke wsprintfA,addr buffer,$CTA0("0%08xh"),eax
    22.            invoke MessageBox,0,addr buffer,addr buffer,0
    23.            invoke RtlDestroyProcessParameters,addr ProcessParameters
    24.         .endif
    25.      
    26.       invoke ExitProcess,0
    27. start endp
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну что ж вы как маленькие.Все надо разжевать и в рот положить)
    Берешь отладчик, например WinDbg, аттачишься к процессу и потом делаешь ZwResumeThread у себя в процессе-родителе. И смотришь где какое исключение.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вылетает не на исключении, а при загрузке kernel32.dll, видимо переменная(путь) задан не верно.
     
  14. wasm_test

    wasm_test wasm test user

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

    __try
    {
    LdrpInitializeBlabla()...
    }
    __except (..)
    {
    ZwRaiseHardError (..)
    }

    это если сильно упрощенно. Судя по коду c0000005 и типу ошибки я могу предположить, что это исключение. Access violation
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Нее.. Там другое, я не то написал, мне казалось что ObjectAttributes опциональный(исправил), нужно явно задать, при доступе к нему и вылетает исключение. В загрузчике я имел ввиду что процесс создаётся и уже в нём выводится сообщение об ошибке STATUS_DLL_INIT_FAILED(0xC0000142).
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я понял, что мы друг друга не поняли =)
     
  17. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Перед RtlCreateUserProcess обнуление OBJECT_ATTRIBUTES
    Код (Text):
    1.            mov oa.uLength,sizeof OBJECT_ATTRIBUTES
    2.            mov oa.hRootDirectory,eax
    3.            mov oa.pSecurityDescriptor,eax
    4.            mov oa.pSecurityQualityOfService,eax
    5.            mov oa.pObjectName,eax
    6.            mov oa.uAttributes,OBJ_INHERIT or OBJ_CASE_INSENSITIVE
    тож результатов не дало.
    Тут написано
    Про другие параметры в структуре OBJECT_ATTRIBUTES ничего не говорится..

    А еще там-же написано
    Почему слешки в другую сторону ? :)
    Когда у себя сделал так, RtlCreateUserProcess возвратил 0C000003Bh - STATUS_OBJECT_PATH_SYNTAX_BAD
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    В твоем коде есть ошибка, связанная с ProcessParameters.

    Функция RtlCreateProcessParameters в качестве первого параметра хочет получить адрес переменной (размером с указатель, а не с RTL_USER_PROCESS_PARAMETERS) в которую она запишет адрес. Тут твой код работоспособен, но не совсем корректен.

    Функция RtlCreateUserProcess в качестве третьего параметра хочет получать адрес, по которому расположена структура, а ты передаешь адрес адреса. Т.е. addr надо убрать.

    С функцией RtlDestroyProcessParameters так же, как и с предыдущей - addr надо убрать.

    Конвертировать "человеческое" имя программы в "ядерное", например, можно при помощи RtlDosPathNameToNtPathName_U.

    В аттаче src + bin (по мотивам твоих #1 и #11).
    Под wxpprosp2ru calc, noptepad и mspaint стартуют, правда, calc почему-то черно-белый.
     
  19. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    q_q дело не в чёрноболости, какимто раком не инициализируется манифест.
     
  20. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    > Под wxpprosp2ru calc, noptepad и mspaint стартуют, правда, calc почему-то черно-белый.
    XPprofSP3, Vista Interp, 2008 Serv тоже работает и тоже черно-белый.