Вот решил сделать перехват на запуск новых процессов в Висте, может есть у кого параметры или описание? Прогуглился , прояндексился,прорамблелился - 0.
у кетайчегов есть немного. http://bbs.driverdevelop.com/simple/index.php?t98480.html Здесь его хук, правда только один параметр арсписан. http://sourceforge.net/project/showfiles.php?group_id=122629
Я сам нарыл, все что надо, ClientID и проч. DWORD newNtCreateUserProcess(PVOID pvP1,PVOID pvP2,PVOID pvP3,PVOID pvP4,PVOID pvP5,PVOID pvP6,PVOID pvP7,PVOID pvP8,PVOID pvP9,PVOID pvP10,PPROCESS_UNKNOWN ppuUnknown) typedef struct{ ULONG Length; ULONG Unknown1; ULONG Unknown2; PWSTR pwsImageFileName; ULONG Unknown4; ULONG Unknown5; ULONG Unknown6; PCLIENT_ID pcidClient; ULONG Unknown8; ULONG Unknown9; ULONG Unknown10; ULONG Unknown11; ULONG Unknown12; ULONG Unknown13; ULONG Unknown14; ULONG Unknown15; ULONG Unknown16; }PROCESS_UNKNOWN, *PPROCESS_UNKNOWN;
что то я вьехать немогу... китайцы пишут: Код (Text): NTSTATUS NTAPI NtCreateUserProcess( PHANDLE ProcessHandle, ULONG_PTR Parameter1, ULONG_PTR Parameter2, ULONG_PTR Parameter3, ULONG_PTR ProcessSecurityDescriptor, ULONG_PTR ThreadSecurityDescriptor, ULONG_PTR Parameter6, ULONG_PTR Parameter7, PRTL_USER_PROCESS_PARAMETERS ProcessParameters, ULONG_PTR Parameter9, ULONG_PTR Parameter10 ); 11 входных параметров. Из той проги, что n0name дал ссылку: Код (Text): NTSTATUS Hook_NtCreateUserProcess (PHANDLE ProcessHandle, PVOID arg2, PVOID arg3, PVOID arg4, PVOID arg5, PVOID arg6, PVOID arg7, PVOID arg8, PVOID arg9, PVOID arg10, PVOID arg11, PVOID arg12) 12 параметров. tylerdurden 17? параметров? теперь смотрю в отладчике: Код (Text): retn 2Ch 2C\4 = B насколько я помню. то есть 11 параметров. *пошел курить проблему*
всё вкурил tylerdurden сорри, ты всё правильно написал, то меня от долго-го сидения уже глючить начало. n0name там последний параметр указатель на структуру, которую tylerdurden написал.
Vova_B почему же, мне нужно было только кол-во параметров для реализации перехвата создаваемых процессов в Висте, мне помогли их найти, вот тема и заглохла.
Никто случайно не разобрался с этой ф-цией? да и вообще виста не совсем правильная ось ... сделали блин все через одно место)))
Вобщем RtlCreateUserProcess() юзает неэкспортируемую процедуру(пусть будет RtlCreateUserProcessEx), на которую две ссылки в ntdll из RtlCreateUserProcess() и RtlCloneUserProcess(). Первая известна. Прототип RtlCreateUserProcessEx: Код (Text): NTSTATUS RtlCreateUserProcessEx( IN PUNICODE_STRING ImagePath OPTIONAL, IN OUT PRTL_USER_PROCESS_PARAMETERS ProcessParameters OPTIONAL, IN PSECURITY_DESCRIPTOR ProcessSecurityDescriptor OPTIONAL, IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL, IN HANDLE ParentProcess OPTIONAL, IN ULONG InheritHandle, ;Original "IN BOOLEAN InheritHandle" IN BOOLEAN Unknown1, ;1, ??? IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL, OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation ); В этой функции копируются параметры и вызывается сервис. В ядре RVA_NtCreateUserProcess(6.0.6000.16386) = 0x210E79, большой кодес, без живого ядра долго реверсить придётсо, ну его.. Видимо первый параметр - указатель на структуру, ту которая передаётся в RtlCreateUserProcess(), но без первого поля: Код (Text): RTL_USER_PROCESS_INFORMATION2 struct Process HANDLE <> Thread HANDLE <> ClientId CLIENT_ID <> ImageInformation SECTION_IMAGE_INFORMATION <> RTL_USER_PROCESS_INFORMATION2 ends sambd Удачи..
угу пасиба .. буду реверсить, у них скоко ритуальных приседай при создании процеса что просто п***ц ... Ушел дебажыть ....
Код (Text): так теперь более новее)) signed int __cdecl NtCreateUserProcess(PHANDLE hProcess, unsigned int a2, int a3, int a4, int a5, int a6, int a7, int a8, RTL_USER_PROCESS_PARAMETERS *lpvUserProcessParameters, int a10, int a11) { char v11; // dl@1 int Param5; // ebx@1 int v13; // esi@1 int _hProcess; // eax@4 int v15; // ecx@6 int v16; // ebx@13 int v17; // ebx@14 signed int v18; // edi@17 signed int result; // eax@20 signed int v20; // ebx@25 signed int v21; // ST2C_4@38 int *v22; // ST30_4@38 int v23; // ST34_4@38 signed int current_eprocess3; // edi@54 signed int v25; // ebx@69 signed int v26; // eax@71 int v28; // eax@105 int cureenet_eprocess; // eax@1 signed int v30; // eax@25 NTSTATUS v31_status; // eax@27 NTSTATUS v32_status; // eax@34 NTSTATUS v33_status; // eax@40 NTSTATUS _section_result; // eax@42 NTSTATUS Ob_result; // eax@44 signed int v36; // eax@52 signed int v37; // eax@64 int v38; // eax@66 signed int v39; // eax@81 PHANDLE hProcess; // [sp+11Ch] [bp-47Ch]@1 unsigned int Param2; // [sp+128h] [bp-470h]@1 int Param5_1; // [sp+110h] [bp-488h]@1 int Param6; // [sp+108h] [bp-490h]@1 RTL_USER_PROCESS_PARAMETERS *ProcessParameters; // [sp+130h] [bp-468h]@1 int Param10; // [sp+F8h] [bp-4A0h]@1 int _some_struct; // [sp+12Ch] [bp-46Ch]@1 int v53; // [sp+10h] [bp-588h]@1 int v54; // [sp+14h] [bp-584h]@1 int v55; // [sp+18h] [bp-580h]@1 int v56; // [sp+1Ch] [bp-57Ch]@1 int v57; // [sp+20h] [bp-578h]@1 int v58; // [sp+150h] [bp-448h]@1 char v59; // [sp+154h] [bp-444h]@1 signed int current_eprocess2; // [sp+144h] [bp-454h]@1 int var_eprocess; // [sp+13Ch] [bp-45Ch]@1 int hProcessNew; // [sp+148h] [bp-450h]@1 int v63; // [sp+570h] [bp-28h]@3 char v64; // [sp+574h] [bp-24h]@3 CPPEH_RECORD ms_exc; // [sp+580h] [bp-18h]@3 int a13; // [sp+140h] [bp-458h]@17 int a3; // [sp+2Ch] [bp-56Ch]@21 HANDLE Handle; // [sp+74h] [bp-524h]@27 PVOID Object; // [sp+118h] [bp-480h]@27 int hObject; // [sp+138h] [bp-460h]@27 PVOID v71; // [sp+78h] [bp-520h]@28 char v72; // [sp+31h] [bp-567h]@30 //712 bytes allacate from stak OBJECT_ATTRIBUTES ObjectAttributes; // [sp+E0h] [bp-4B8h]@34 char ObjectName_cmd_line; // [sp+ACh] [bp-4ECh]@34 HANDLE FileHandle; // [sp+88h] [bp-510h]@34 int DesiredAccess; // [sp+84h] [bp-514h]@34 struct _IO_STATUS_BLOCK IoStatusBlock; // [sp+24h] [bp-574h]@34 int v78; // [sp+104h] [bp-494h]@40 int v79; // [sp+8Ch] [bp-50Ch]@40 HANDLE SectionHandle; // [sp+90h] [bp-508h]@42 int SectionHandleObject; // [sp+FCh] [bp-49Ch]@44 int SectionHandleObject1; // [sp+98h] [bp-500h]@44 unsigned __int8 v83; // [sp+30h] [bp-568h]@51 char v84; // [sp+137h] [bp-461h]@54 signed int v85; // [sp+200h] [bp-398h]@65 void *v86; // [sp+80h] [bp-518h]@66 int v87; // [sp+10Ch] [bp-48Ch]@66 int hSourceProcess; // [sp+14Ch] [bp-44Ch]@66 int v89; // [sp+44h] [bp-554h]@68 int v90; // [sp+4Ch] [bp-54Ch]@69 int v91; // [sp+124h] [bp-474h]@81 int v92; // [sp+48h] [bp-550h]@81 int a9; // [sp+50h] [bp-548h]@81 int a12; // [sp+120h] [bp-478h]@81 int a14; // [sp+41Ch] [bp-17Ch]@81 void *v96; // [sp+7Ch] [bp-51Ch]@98 int v97; // [sp+4CCh] [bp-CCh]@98 int v98; // [sp+38h] [bp-560h]@98 int v99; // [sp+34h] [bp-564h]@98 void *v100; // [sp+3Ch] [bp-55Ch]@106 void *hNewProcessHandle; // [sp+578h] [bp-20h]@108 int v102; // [sp+4C8h] [bp-D0h]@108 hProcess = hProcess; Param2 = a2; Param5 = a5; Param5_1 = a5; Param6 = a6; ProcessParameters = lpvUserProcessParameters; Param10 = a10; _some_struct = a11; v13 = 0; v53 = 0; v54 = 0; v55 = 0; v56 = 0; v57 = 0; v58 = 0; memset(&v59, 0, 712); cureenet_eprocess = *MK_FP(__FS__, 292); current_eprocess2 = *MK_FP(__FS__, 292); var_eprocess = *(_DWORD *)(cureenet_eprocess + 72); v11 = *(_BYTE *)(cureenet_eprocess + 231); LOBYTE(hProcessNew) = *(_BYTE *)(cureenet_eprocess + 231); if ( a7 & 0xFFFFFF38 || a8 & 0xFFFFFFFE ) { result = 0xC000000Du; } else { v63 = 0; v64 = v11; ms_exc.disabled = 0; if ( v11 ) { _hProcess = (int)hProcess; if ( (unsigned int)hProcess >= MmUserProbeAddress ) _hProcess = MmUserProbeAddress; *(_DWORD *)_hProcess = *(_DWORD *)_hProcess; v15 = Param2; if ( Param2 >= MmUserProbeAddress ) v15 = MmUserProbeAddress; *(_DWORD *)v15 = *(_DWORD *)v15; } if ( Param5 ) { if ( v11 ) { if ( Param5 & 3 ) { ExRaiseDatatypeMisalignment(); __asm { int 3 ; Trap to Debugger } } } v16 = *(_DWORD *)(Param5 + 12); if ( v11 ) v17 = v16 & 0x5F2; else v17 = v16 & 0x107F2; v63 = v17; } ms_exc.disabled = -2; a13 = a7 & 0x40; v18 = 2048; if ( !(a7 & 0x40) && *(_DWORD *)(var_eprocess + 548) & 0x800 && v11 ) return 0xC00000F5u; memset(&a3, 0, 180); if ( !_some_struct || (result = sub_600827((int *)_some_struct, hProcessNew, 0, (int)&a3), result >= 0) ) { if ( a3 & 0x800 && !(a7 & 4) ) goto LABEL_114; v30 = sub_5CB95B(hProcessNew, &a3); v20 = v30; if ( v30 >= 0 ) { if ( !(a3 & 1) ) { hObject = var_eprocess; goto LABEL_30; } v31_status = ObReferenceObjectByHandle(Handle, 0x80u, PsProcessType, hProcessNew, &Object, 0); hObject = (int)Object; v20 = v31_status; if ( v31_status >= 0 ) { v71 = Object; LABEL_30: if ( (v72 & 0xC) != 4 || hObject == var_eprocess && var_eprocess != PsInitialSystemProcess ) { if ( a3 & 0x20 ) { ObjectAttributes.Length = 24; ObjectAttributes.RootDirectory = 0; ObjectAttributes.Attributes = ((-((_BYTE)hProcessNew != 1) & 0xFFFFFC00) + 1024) | 0x240; ObjectAttributes.ObjectName = (PUNICODE_STRING)&ObjectName_cmd_line; ObjectAttributes.SecurityDescriptor = 0; ObjectAttributes.SecurityQualityOfService = 0; v32_status = ZwOpenFile( &FileHandle, DesiredAccess | 0x100020, &ObjectAttributes, &IoStatusBlock, 5u, 0x60u); v20 = v32_status; if ( v32_status < 0 ) { if ( DesiredAccess ) v20 = ZwOpenFile(&FileHandle, 0x100020u, &ObjectAttributes, &IoStatusBlock, 5u, 0x60u); if ( v20 < 0 ) { FileHandle = 0; v23 = 0; v22 = &a3; v21 = 1; LABEL_39: sub_5C95AF(v21, v22, v23); goto LABEL_115; } } v33_status = ObReferenceObjectByHandle(FileHandle, 0x100020u, IoFileObjectType, 0, (PVOID *)&v78, 0); v79 = v78; v20 = v33_status; if ( v33_status < 0 ) { v79 = 0; goto LABEL_115; } ObjectAttributes.ObjectName = 0; _section_result = ZwCreateSection( &SectionHandle, 0xF001Fu, &ObjectAttributes, 0, 0x10u, (-(a13 != 0) & 0x1000000) + 0x1000000, FileHandle); v20 = _section_result; v23 = 0; if ( _section_result < 0 ) { SectionHandle = 0; v22 = &a3; v21 = 2; goto LABEL_39; } Ob_result = ObReferenceObjectByHandle( SectionHandle, 8u, MmSectionObjectType, 0, (PVOID *)&SectionHandleObject, 0); SectionHandleObject1 = SectionHandleObject; v20 = Ob_result; if ( Ob_result < 0 ) { SectionHandleObject1 = 0; goto LABEL_115; } v18 = 2048; } if ( SectionHandleObject1 ) { if ( !(v18 & *(_DWORD *)(var_eprocess + 548)) ) { if ( a13 ) { if ( (_BYTE)hProcessNew ) v83 |= 8u; } } v36 = sub_5C9A13(hProcessNew, ProcessParameters, (int)&a3); v20 = v36; if ( v36 < 0 ) { v83 &= 0xFDu; goto LABEL_115; } a13 = (int)&v84; current_eprocess3 = current_eprocess2; LABEL_66: v38 = sub_5C6A0D( hObject, hProcessNew, Param5_1, SectionHandleObject1, v86, a7, (int)&a3, (int)&v87, (int)&hSourceProcess); v20 = v38; if ( v38 >= 0 ) { if ( SectionHandleObject1 ) sub_5FFE52(v89, *(_DWORD *)(hSourceProcess + 392)); ObfReferenceObject(hSourceProcess); v25 = v90; if ( (unsigned int)v90 < 0x40000 ) v25 = 262144; current_eprocess2 = 0; v26 = 0; if ( a8 & 1 ) v26 = 1; if ( a8 & 2 ) v26 |= 2u; if ( a8 & 4 ) v26 |= 4u; if ( a8 & 8 ) v26 |= 8u; if ( v87 ) { current_eprocess2 = 2; v26 |= 0x20u; } v91 = v26 | 0x10; v39 = PspCreateThread_5fee32( hSourceProcess, (POBJECT_ATTRIBUTES)Param6, hProcessNew, (int)&v58, (int)&v53, 0, 0, v92, a9, v25, (int)&v91, (int)&a12, a13, (int)&a14); v20 = v39; if ( v39 >= 0 ) { if ( (_BYTE)hProcessNew == 1 ) { if ( !(*(_DWORD *)(var_eprocess + 548) & 0x800) ) { if ( *(_DWORD *)(hSourceProcess + 548) & 0x800 ) { if ( a3 & 0x2000000 ) a3 = a3 & 0xFDFFFFFF | 0x101801; if ( a4 & 0x2000000 ) a4 = a4 & 0xFDFFFFFF | 0x100C02; } } } current_eprocess2 = sub_5C7E82(hObject, a3, a7, 0, v96, current_eprocess2, (int)&v97); v20 = sub_5FF71B(a12, hSourceProcess, (int)&v53, (int)&v91, a4, a13, (int)&a3, (int)&a14, v98, v99); ++*(_WORD *)(current_eprocess3 + 128); if ( !*(_WORD *)(current_eprocess3 + 128) ) { if ( *(_DWORD *)(current_eprocess3 + 56) != current_eprocess3 + 56 ) { if ( !*(_WORD *)(current_eprocess3 + 130) ) KiCheckForKernelApcDelivery(); } } if ( current_eprocess2 >= 0 ) { if ( v20 >= 0 ) { v28 = sub_5FFDC8(hSourceProcess, PsProcessType); v20 = v28; if ( v28 >= 0 ) { if ( v100 ) { memcpy(v100, &v89, 0x30u); v13 = 0; } *hProcess = hNewProcessHandle; *(_DWORD *)Param2 = v102; ms_exc.disabled = -2; if ( v28 >= v13 ) v20 = sub_5C95AF(6, &a3, hSourceProcess); } } SeDeleteAccessState(&v97); if ( v20 < v13 ) sub_694D71(v20); } else { sub_694B1C(); v20 = current_eprocess2; } ObfDereferenceObject(a12); } else { _EAX = -1; _EDX = hSourceProcess + 128; __asm { lock xadd [edx], eax } if ( _EAX & 2 ) { if ( !(_EAX & 4) ) ExfTryToWakePushLock(); } ++*(_WORD *)(current_eprocess3 + 128); if ( !*(_WORD *)(current_eprocess3 + 128) ) { if ( *(_DWORD *)(current_eprocess3 + 56) != current_eprocess3 + 56 ) { if ( !*(_WORD *)(current_eprocess3 + 130) ) KiCheckForKernelApcDelivery(); } } if ( *(_DWORD *)(hSourceProcess + 220) ) sub_694B1C(); } ObfDereferenceObject(hSourceProcess); } goto LABEL_115; } if ( hObject == var_eprocess && (_BYTE)hProcessNew && !ProcessParameters && !(v72 & 0xC) && !(a3 & 0x80) && !(v83 & 0x10) ) { v83 &= 0xFDu; if ( !(v18 & *(_DWORD *)(hObject + 548)) && a13 ) { v20 = 0xC0000022u; goto LABEL_115; } v58 = 65559; current_eprocess3 = current_eprocess2; v37 = sub_5FFEAE(current_eprocess2, (int)&v58, 0, 1, 1); v20 = v37; if ( v37 < 0 ) goto LABEL_115; v85 = 297; a13 = 0; goto LABEL_66; } } LABEL_114: v20 = 0xC000000Du; goto LABEL_115; } } LABEL_115: sub_600E14((int)&a3); return v20; } } return result; } вот пока что нарыто с помощью ИДЫ и хрени к ней))) нрод нужна помощь, смогу залить .idc ядра версия Код (Text): Windows Server 2008 Kernel Version 6001 (Service Pack 1) MP (1 procs) Free x86 compatible Product: WinNt, suite: TerminalServer SingleUserTS Built by: 6001.18000.x86fre.longhorn_rtm.080118-1840 Kernel base = 0x81812000 PsLoadedModuleList = 0x8191f930
.idc база от IDA с отреверсеным файлом а что юзаем? может и я заюзаю .... а то у меня токо ИДА и WinDBG и виста под виртуалкой ... ядро дебажить там жесть ... бряку не поставишь токо ида спасает а плане просмотра