Точнее проблема в том что RtlCreateUserProcess возвращает успешно, а процесс нормально так и не создается.. Лишь ошибки The application failed initialized property (0xс000000d) и (0xс0000005) Вот код: Код (Text): .code start proc Local ClientId:CLIENT_ID, ThreadHandle:HANDLE Local Context:CONTEXT, Responce:ULONG local ProcessInformation:RTL_USER_PROCESS_INFORMATION local ProcessParameters:RTL_USER_PROCESS_PARAMETERS local ImagePath:UNICODE_STRING invoke RtlInitUnicodeString,addr ImagePath,$CTW0("\\SystemRoot\\System32\\calc.exe") invoke RtlCreateProcessParameters,addr ProcessParameters,addr ImagePath,0,0,0,0,0,0,0,0 .if eax == 0 invoke RtlCreateUserProcess,addr ImagePath,OBJ_CASE_INSENSITIVE,addr ProcessParameters,0,0,0,0,0,0,addr ProcessInformation invoke ZwResumeThread,ProcessInformation.Thread,0 invoke ZwWaitForSingleObject,ProcessInformation.Thread,0,0 invoke RtlDestroyProcessParameters,addr ProcessParameters .endif invoke ExitProcess,0 start endp end start Могет что неправильно делаю?
Стырнул процедуру InformCsrss из кода Four-F. Код (Text): InformCsrss proc hProcess:HANDLE, hThread:HANDLE, pid:DWORD, tid:DWORD local csrmsg:CSRMSG invoke RtlZeroMemory, addr csrmsg, sizeof csrmsg lea eax, csrmsg assume eax:ptr CSRMSG m2m [eax].ProcessInformation.hProcess, hProcess m2m [eax].ProcessInformation.hThread, hThread m2m [eax].ProcessInformation.dwProcessId, pid m2m [eax].ProcessInformation.dwThreadId, tid assume eax:nothing invoke CsrClientCallServer, eax, 0, 10000h, 28h ret InformCsrss endp Суравно не помогло..
в RtlCreateUserProcess где HANDLE ParentProcess надо передавать NtCurrentProcess() а не NULL имхо. #define NtCurrentProcess() ((HANDLE)(LONG_PTR)-1)
csrsrv.dll Код (Text): ▓.75B458B3: 8D8538FDFFFF 3lea eax,[ebp][-000002C8] ▓.75B458B9: 50 push eax ▓.75B458BA: 56 push esi ▓.75B458BB: 56 push esi ▓.75B458BC: 56 push esi ▓.75B458BD: FFB5F4FDFFFF push d,[ebp][-0000020C] ▓.75B458C3: 8D85D4FDFFFF lea eax,[ebp][-0000022C] ▓.75B458C9: 56 push esi ▓.75B458CA: 56 push esi ▓.75B458CB: FFB5F0FDFFFF push d,[ebp][-00000210] ▓.75B458D1: C78538FDFFFF44000000 mov d,[ebp][-000002C8],000000044 ;' D' ▓.75B458DB: 6A40 push 000000040 ;'@' ▓.75B458DD: 50 push eax ▓.75B458DE: FF155411B475 call RtlCreateUserProcess ;ntdll За деталями -- в отладчик
Flasher Не верные параметры, впрочем этот статус и возвращен. Второй параметр: Код (Text): IN POBJECT_ATTRIBUTES ObjectAttributes В добавок к тому это натив, и следовательно имена должны быть соответствующие: Код (Text): "\??\SystemRoot\System32\calc.exe"
Great, были бы зубы, сам бы разобрался ObjectAttributes проблему не решает. Код (Text): start proc Local ClientId:CLIENT_ID, ThreadHandle:HANDLE Local Context:CONTEXT, Responce:ULONG local ProcessInformation:RTL_USER_PROCESS_INFORMATION local ProcessParameters:RTL_USER_PROCESS_PARAMETERS local ImagePath:UNICODE_STRING local oa:POBJECT_ATTRIBUTES local buffer[256]:byte invoke RtlInitUnicodeString,addr ImagePath,$CTW0("\\??\\C:\\Windows\\System32\\calc.exe") invoke RtlCreateProcessParameters,addr ProcessParameters,addr ImagePath,0,0,0,0,0,0,0,0 .if eax == 0 invoke RtlCreateUserProcess,addr ImagePath,addr oa,addr ProcessParameters,0,0,0,-1,0,0,addr ProcessInformation .if eax == 0 push eax invoke InformCsrss,ProcessInformation.Process,ProcessInformation.Thread, ProcessInformation.ClientId.UniqueProcess, ProcessInformation.ClientId.UniqueThread invoke ZwResumeThread,ProcessInformation.Thread,0 invoke ZwWaitForSingleObject,ProcessInformation.Thread,0,0 pop eax .endif invoke wsprintfA,addr buffer,$CTA0("0%08xh"),eax invoke MessageBox,0,addr buffer,addr buffer,0 invoke RtlDestroyProcessParameters,addr ProcessParameters .endif invoke ExitProcess,0 start endp
Ну что ж вы как маленькие.Все надо разжевать и в рот положить) Берешь отладчик, например WinDbg, аттачишься к процессу и потом делаешь ZwResumeThread у себя в процессе-родителе. И смотришь где какое исключение.
там есть следующий код: __try { LdrpInitializeBlabla()... } __except (..) { ZwRaiseHardError (..) } это если сильно упрощенно. Судя по коду c0000005 и типу ошибки я могу предположить, что это исключение. Access violation
Great Нее.. Там другое, я не то написал, мне казалось что ObjectAttributes опциональный(исправил), нужно явно задать, при доступе к нему и вылетает исключение. В загрузчике я имел ввиду что процесс создаётся и уже в нём выводится сообщение об ошибке STATUS_DLL_INIT_FAILED(0xC0000142).
Перед RtlCreateUserProcess обнуление OBJECT_ATTRIBUTES Код (Text): mov oa.uLength,sizeof OBJECT_ATTRIBUTES mov oa.hRootDirectory,eax mov oa.pSecurityDescriptor,eax mov oa.pSecurityQualityOfService,eax mov oa.pObjectName,eax mov oa.uAttributes,OBJ_INHERIT or OBJ_CASE_INSENSITIVE тож результатов не дало. Тут написано Про другие параметры в структуре OBJECT_ATTRIBUTES ничего не говорится.. А еще там-же написано Почему слешки в другую сторону ? Когда у себя сделал так, RtlCreateUserProcess возвратил 0C000003Bh - STATUS_OBJECT_PATH_SYNTAX_BAD
Flasher В твоем коде есть ошибка, связанная с ProcessParameters. Функция RtlCreateProcessParameters в качестве первого параметра хочет получить адрес переменной (размером с указатель, а не с RTL_USER_PROCESS_PARAMETERS) в которую она запишет адрес. Тут твой код работоспособен, но не совсем корректен. Функция RtlCreateUserProcess в качестве третьего параметра хочет получать адрес, по которому расположена структура, а ты передаешь адрес адреса. Т.е. addr надо убрать. С функцией RtlDestroyProcessParameters так же, как и с предыдущей - addr надо убрать. Конвертировать "человеческое" имя программы в "ядерное", например, можно при помощи RtlDosPathNameToNtPathName_U. В аттаче src + bin (по мотивам твоих #1 и #11). Под wxpprosp2ru calc, noptepad и mspaint стартуют, правда, calc почему-то черно-белый.
> Под wxpprosp2ru calc, noptepad и mspaint стартуют, правда, calc почему-то черно-белый. XPprofSP3, Vista Interp, 2008 Serv тоже работает и тоже черно-белый.