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

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

  1. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    просматривал проект kexec(запуск процесса из драйвера). драйвер прекрасно работает. Процесс запускает explorer.exe, попробовал изменить на winlogon.exe: процесс запускается с username == System, но ничего не делает, не отображается. Запускаемый процесс - обычная окошка. В чем может быть причина?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    так винлогон или "обычная окошка"?
     
  3. brainFucker

    brainFucker New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2009
    Сообщения:
    16
    kexec твой проект и Cr4sh. explorer.exe заменил на winlogon.exe
    winlogon.exe запускает окошку, в смысле windows application.
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Может быть winlogon запускает эту... окошку на другом десктопе?
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Запросто может быть такое.
     
  6. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Ну не может быть, а точно. ;) Winlogon "висит" на своем, созданным им же десктопе.
     
  7. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    1.
    У меня не работает ( XP SP2), kexec() ERROR. Трассировкой показала где, см код
    Код (Text):
    1. if (KeInsertQueueApc(pApc, (PVOID)((ULONG)pMappedAddress + SizeOfCode), NULL, 0))
    2. {
    3.     *((unsigned char *)pThread + ET_pending) = 1;
    4.     timeout.QuadPart = -(10 * 10000000);
    5.     if (KeWaitForSingleObject(Event, Executive, KernelMode, FALSE,  &timeout)!=                 STATUS_TIMEOUT)
    6.     {
    7.         PsLookupProcessByProcessId((HANDLE)sc_data->dwProcId, &pRetProcess);
    8.         DbgMsg("Process %d created; EPROCESS: 0x%.8x\n", sc_data->dwProcId,  pRetProcess);
    9.     } else
    10.     {
    11.         DbgMsg("KeWaitForSingleObject() timeout\n");    <- Сюда попадаем
    12.     }
    13. }
    Подскажите в чем может быть проблема
    2.
    я правильно понял, что
    ET_pending это KernelApcPending из struct _ETHREAD (kd> dt -v -r nt!_ETHREAD)
    потому что, alertable один, а pending-ов несколько, спрашиваюб т.к. хочу перенести под VISTA
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проблма может быть в оффсетах - ты уверен, что у тебя такие же?

    UserApcPending. юзермодная апц доставляется ведь
     
  9. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    спасибо Great
    +0x034 ApcState : struct _KAPC_STATE, 5 elements, 0x18 bytes
    +0x000 ApcListHead : [2] struct _LIST_ENTRY, 2 elements, 0x8 bytes
    +0x010 Process : Ptr32 to struct _KPROCESS, 29 elements, 0x6c bytes
    +0x014 KernelApcInProgress : UChar
    +0x015 KernelApcPending : UChar
    +0x016 UserApcPending : UChar +34h = 4ah
    +0x164 Alertable : UChar
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Дабы нормальным образом запустить процесс необходимо вызвать в юзермоде kernel32!CreateProcessInternalA(). Чтоб её вызвать нужен процесс и пользовательский поток в нём. Так как создавать потоки палево, поэтому следует использовать уже имеющиеся. Тоесть нужно выполнить наш код в контексте какогото потока. Так как некоторые потоки могут простаивать, например находясь в ожидании какихто событий, то следует использовать несколько потоков. Нам нужно какимто образом перечислить потоки и изменить их контекст. Для этого нам нужно добраться до трап-фрейма. Тоесть поток должен поменять кпл на ноль, сохранить хардварный контекст, после чего мы должны перехватить поток. Тут три пути есть.
    o Исполнить код в контексте целевого потока, тоесть он является текущим.
    - Использовать прерывания.
    - Исключения.
    - Сискалы.
    Тут вариантов стопяцот, следует взять что удобно. Мне нравяться сепшены. Выполняем манипуляции с памятью процесса и вызывается наш обработчик. Из него имеем контекст. Или например запускаем профилирование и регаем ISR. Рано или поздно хэндлер вызовется в контексте нужного треда. Тут главное IRQL. Нужны низкие, ибо придётся обращаться к пользовательской памяти, в частности к стеку.
    o Выполнить манипуляции с его контекстом удалённо(из другого потока).
    Это требует синхронизацию. Нужно какимто образом обождать формирование трап-фрейма для потока, либо инициировать это. Когда происходит смена кпл на нулевое, то формируется трап-фрейм, а исполнение этого треда отлагается планировщиком, либо наш второй тред исполняется на другом процессоре. Вот тут мы поимеем контекст из другого потока. Вручную взяв из описателя обьекта. Либо используя ядерную апк, которая доставляется при возврате из прерываний. Это может быть наша апк, которую мы сами поставим в очередь(что приведёт к исполнению нашего кода в контексте целевого потока), либо используя системные апк. Это гетконтекст- и суспенд- апк. Первая используется функой PsGetContextThread(), вторая PsSuspendThread(). Лучше взять вторую, тогда будет синхронно. Походу найдётся есчо и PsGetNextProcessThread() для перечисления потоков.
    o Исполнить код прямо в юзермоде, не выполняя телодвижений в ядре(сюда относится и пользовательские апк). Зарегав для этой цели какойто системный калбэк, ктото юзал шадова калбэки, ктото иные, это не важно. Просто регаем его записью в память и ждём пока вызовется.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    btw, последнее самое простое в реализации.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Еще четвертый вариант в догонку: создать процесс как обычно. NtCreateProcess + NtCreateThread, а зарегистрировать через вызов csrsrv!CsrCreateRemoteThread внутри Native-потока, который необходимо создать внутри csrss.exe ну или любым другим способом исполнив этот код в контексте csrss.exe в юзермоде

    Код (Text):
    1. VOID CsrShellcode (DRIVER_TO_SHELLCODE_PARAMETERS *Params)
    2. {
    3.   CSRSS_NOTIFY_PARAMETERS *p = (CSRSS_NOTIFY_PARAMETERS*) Params->Data;
    4.  
    5.   // csrsrv.dll functions
    6.   char szCsrsrvDll[] = {'c', 's', 'r', 's', 'r', 'v', '.', 'd', 'l', 'l', 0};
    7.   char szCsrCreateRemoteThread[] = {'C', 's', 'r', 'C', 'r', 'e', 'a', 't', 'e', 'R', 'e', 'm', 'o', 't', 'e', 'T', 'h', 'r', 'e', 'a', 'd', 0};
    8.  
    9.   // ntdll.dll functions
    10.   char szNtTerminateThread[] = {'N', 't', 'T', 'e', 'r', 'm', 'i', 'n', 'a', 't', 'e', 'T', 'h', 'r', 'e', 'a', 'd', 0};
    11.   char szNtOpenThread[] = {'N', 't', 'O', 'p', 'e', 'n', 'T', 'h', 'r', 'e', 'a', 'd', 0};
    12.   char szNtClose[] = {'N', 't', 'C', 'l', 'o', 's', 'e', 0};
    13.  
    14.   // pointers
    15.   PVOID csrsrv;
    16.   NTSTATUS Status;
    17.   NTSTATUS (NTAPI *pCsrCreateRemoteThread)(HANDLE hThread, PCLIENT_ID ClientId);
    18.   NTSTATUS (NTAPI *pNtOpenThread)(PHANDLE,ULONG,POBJECT_ATTRIBUTES,PCLIENT_ID);
    19.   NTSTATUS (NTAPI *pNtClose)(HANDLE);
    20.   NTSTATUS (NTAPI *pNtTerminateThread)(HANDLE, NTSTATUS);
    21.  
    22.   csrsrv = Params->LoadLibraryA(szCsrsrvDll);
    23.   if (csrsrv)
    24.   {
    25.     *(PVOID*)&pCsrCreateRemoteThread = Params->GetProcAddress(csrsrv, szCsrCreateRemoteThread);
    26.     *(PVOID*)&pNtOpenThread = Params->GetProcAddress(Params->Ntdll, szNtOpenThread);
    27.     *(PVOID*)&pNtClose = Params->GetProcAddress(Params->Ntdll, szNtClose);
    28.  
    29.     if (!(pCsrCreateRemoteThread && pNtOpenThread && pNtClose))
    30.     {
    31.       Status = 0xF0000003;
    32.     }
    33.     else
    34.     {
    35.       OBJECT_ATTRIBUTES Oa = STATIC_OBJECT_ATTRIBUTES(NULL, 0, 0, 0);
    36.       HANDLE hThread;
    37.       PVOID Process = 0;
    38.       CLIENT_ID ClientId = p->ClientId;
    39.  
    40.       Status = pNtOpenThread (&hThread, THREAD_ALL_ACCESS, &Oa, &ClientId);
    41.       if (NT_SUCCESS(Status))
    42.       {
    43.         Status = pCsrCreateRemoteThread (hThread, &ClientId);
    44.         pNtClose (hThread);
    45.       }      
    46.     }
    47.   }
    48.   else Status = 0xF0000001;
    49.  
    50.   *(PVOID*)&pNtTerminateThread = Params->GetProcAddress(Params->Ntdll, szNtTerminateThread);
    51.  
    52.   pNtTerminateThread(0, Status);
    53. }
    Работоспособность гарантируется)

    PS. Закрепил тему, чтобы больше не спрашивали
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Ну тогда до кучи Sb-сервис(откопал у себя старинный кодес):
    Код (Text):
    1. ; Запуск нативного приложения посредством сервиса порта \SbApiPort
    2. ; (OPTIONAL_HEADER.Subsystem = IMAGE_SUBSYSTEM_NATIVE).
    3.  
    4. SB_CREATE_PROCESS   equ 3
    5.  
    6. PORT_MESSAGE struct
    7. DataSize        USHORT ?    ;+0
    8. MessageSize     USHORT ?    ;+2
    9. MessageType     USHORT ?    ;+4
    10. VirtualRangesOffset USHORT ?    ;+6
    11. ClientId        CLIENT_ID <>    ;+8
    12. MessageId       ULONG ?     ;+10
    13. SectionSize     ULONG ?     ;+14
    14. PORT_MESSAGE ends
    15.  
    16. SB_PROCESS_PATHS struct
    17. ImageFileName       UNICODE_STRING <>
    18. CurrentDirectory    UNICODE_STRING <>
    19. CommandLine     UNICODE_STRING <>
    20. DefaultLibPath      UNICODE_STRING <>
    21. SB_PROCESS_PATHS ends
    22. PSB_PROCESS_PATHS typedef ptr SB_PROCESS_PATHS
    23.  
    24. SB_PORT_MESSAGE struct
    25. Header          PORT_MESSAGE <>
    26. Service         ULONG ?     ; 3
    27. Status          NTSTATUS ?
    28. ImageFileName       PUNICODE_STRING ?
    29. CurrentDirectory    PUNICODE_STRING ?
    30. CommandLine     PUNICODE_STRING ?
    31. DefaultLibPath      PUNICODE_STRING ?
    32. DebugFlags      ULONG ?
    33. ProcessParameters   PRTL_USER_PROCESS_PARAMETERS ?
    34. SB_PORT_MESSAGE ends
    35. PSB_PORT_MESSAGE typedef ptr SB_PORT_MESSAGE
    36.  
    37. PORT_CONNECT equ 1
    38.  
    39. ;"\Windows\SbApiPort"
    40. align 4
    41. SbPortNameW WCHAR "\","W","i","n","d","o","w","s","\","S","b","A","p","i","P","o","r","t",0
    42. SbPortNameU UNICODE_STRING <sizeof SbPortNameW - 2, sizeof SbPortNameW, offset SbPortNameW>
    43.  
    44. $ProcessName        WCHAR "\","?","?","\","c",":","\","n","t","s","b",".","e","x","e",0
    45. $CurrentDirectory   WCHAR "\","?","?","\","d",":","\","w","i","n","d","o","w","s",0
    46. $CommandLine        WCHAR ".",0
    47.  
    48. InitializeProcessParametersInternal proc uses ebx esi edi ProcessParameters:PVOID
    49.     mov edi,ProcessParameters
    50.     cld
    51.     mov ebx,edi
    52.     assume ebx:PSB_PROCESS_PATHS
    53.     lea edi,[edi + sizeof(SB_PROCESS_PATHS)]
    54.    
    55.     lea esi,$ProcessName
    56.     mov ecx,(sizeof $ProcessName)/2
    57.     mov [ebx].ImageFileName.Buffer,edi
    58.     mov [ebx].ImageFileName._Length,sizeof($ProcessName - 2)
    59.     mov [ebx].ImageFileName.MaximumLength,sizeof($ProcessName)
    60.     rep movsw
    61.     add edi,3
    62.     and edi,Not(3)
    63.    
    64.     lea esi,$CurrentDirectory
    65.     mov ecx,(sizeof $CurrentDirectory - 2)/2
    66.     mov [ebx].CurrentDirectory.Buffer,edi
    67.     mov [ebx].CurrentDirectory._Length,sizeof($CurrentDirectory - 2)
    68.     mov [ebx].CurrentDirectory.MaximumLength,sizeof($CurrentDirectory)
    69.     rep movsw
    70.     add edi,3
    71.     and edi,Not(3)
    72.    
    73.     lea esi,$CommandLine
    74.     mov ecx,(sizeof $CommandLine - 2)/2
    75.     mov [ebx].CommandLine.Buffer,edi
    76.     mov [ebx].CommandLine._Length,sizeof($CommandLine - 2)
    77.     mov [ebx].CommandLine.MaximumLength,sizeof($CommandLine)
    78.     rep movsw
    79.     ret
    80. InitializeProcessParametersInternal endp
    81.  
    82. _imp__PsGetProcessInheritedFromUniqueProcessId proto :dword
    83.  
    84. SbCreateProcess proc uses ebx esi edi
    85. Local PortObject:PVOID      ;PLPCP_PORT_OBJECT
    86. Local ProcessObject:PVOID   ;PEPROCESS
    87. Local OldProcessId:HANDLE
    88. Local RegionAddress:PVOID, RegionSize:ULONG
    89. Local RequestMessage:SB_PORT_MESSAGE
    90.     invoke ObReferenceObjectByName, addr SbPortNameU, 0, NULL, PORT_CONNECT, LpcPortObjectType, KernelMode, NULL, addr PortObject
    91.     test eax,eax
    92.     jnz err_obj_
    93.     lea ecx,ProcessObject
    94.     mov ebx,PortObject
    95.    
    96.     push ecx
    97.     push dword ptr [ebx + 4*6]  ;LPCP_PORT_OBJECT.Creator.UniqueProcess, csrss.
    98.     Call PsLookupProcessByProcessId
    99.     test eax,eax
    100.     jnz err_ps_
    101.    
    102.     mov RegionSize,PAGE_SIZE
    103.     mov RegionAddress,NULL
    104.  
    105.     invoke ZwAllocateVirtualMemory, NtCurrentProcess, addr RegionAddress, 0, addr RegionSize, MEM_COMMIT, PAGE_READWRITE
    106.     test eax,eax
    107.     jnz err_alloc_
    108.  
    109.     invoke InitializeProcessParametersInternal, RegionAddress
    110.  
    111.     invoke PsGetCurrentProcessId
    112.  
    113. ; Сервер открывает процесс родитель csrss и читает оттуда параметры.
    114. ; Определяется через NtQueryInformationProcess(ProcessBasicInformation).
    115. ; Перед вызовом заменяем PID родителя.
    116. ; Для Win7 смещение PsGetProcessInheritedFromUniqueProcessId также 0xA.
    117. ; Для висты код иной.
    118.     mov ebx,ProcessObject      
    119.     mov ecx,dword ptr [_imp__PsGetProcessInheritedFromUniqueProcessId]
    120.     add ebx,dword ptr [ecx + 0Ah]   ;EPROCESS.InheritedFromUniqueProcessId
    121.     lock xchg dword ptr [ebx],eax
    122.     mov OldProcessId,eax
    123.  
    124.     xor ecx,ecx
    125.     mov esi,RegionAddress
    126.     mov dword ptr [RequestMessage + 4],ecx
    127.     mov dword ptr [RequestMessage + 8],ecx
    128.     mov dword ptr [RequestMessage + 0Ch],ecx
    129.     mov dword ptr [RequestMessage + 10h],ecx
    130.     mov dword ptr [RequestMessage + 14h],ecx
    131.     mov RequestMessage.Service,SB_CREATE_PROCESS
    132.    
    133.     mov edx,RegionAddress  
    134.     mov RequestMessage.Header.DataSize,sizeof(SB_PORT_MESSAGE) - sizeof(PORT_MESSAGE)
    135.     mov RequestMessage.Header.MessageSize,sizeof(SB_PORT_MESSAGE)
    136.  
    137.     mov RequestMessage.ImageFileName,edx
    138.     add edx,UNICODE_STRING
    139.     mov RequestMessage.CurrentDirectory,edx
    140.     add edx,UNICODE_STRING
    141.     mov RequestMessage.CommandLine,edx
    142.    
    143.     mov RequestMessage.DefaultLibPath,NULL 
    144.     mov RequestMessage.ProcessParameters,NULL
    145.     mov RequestMessage.DebugFlags,0
    146.    
    147. ;Синхронно, ожидает завершения процесса.
    148.     invoke LpcRequestWaitReplyPort, PortObject, addr RequestMessage, addr RequestMessage
    149.    
    150.     ;RequestMessage.Status:NTSTATUS from csrss.
    151.     ;RequestMessage.Status:STATUS_INVALID_HANDLE
    152.     ;DBG: 'CSRSS: CsrSrvCreateProcess: NtDuplicateObject failed for process - Status = STATUS_INVALID_HANDLE'
    153.     ;..PID 
    154.    
    155. ;Восстанавливаем PID smss.
    156.     mov ecx,OldProcessId
    157.     lock xchg dword ptr [ebx],ecx
    158.  
    159.     push eax
    160.     invoke ZwFreeVirtualMemory, NtCurrentProcess, addr RegionAddress, addr RegionSize, MEM_RELEASE
    161.     pop eax
    162. err_alloc_:
    163.     push eax
    164.     invoke ObDereferenceObject, ProcessObject
    165.     pop eax
    166. err_ps_:
    167.     push eax
    168.     invoke ObDereferenceObject, PortObject
    169.     pop eax
    170. err_obj_:
    171.     ret
    172. SbCreateProcess endp
     
  14. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    помогите разобраться, что не так в этом коде
    Win7 либо выводит сообщение , что explorer накрылся и предлагает отладить/перезагрузить или никак не реагирует, мол ничего не произошло
    pTargetThread и pTargetProcess правильные, проверенно


    Код (Text):
    1. NTSTATUS
    2. InstallUserModeApc(LPSTR lpProcess, PKTHREAD pTargetThread, PEPROCESS pTargetProcess)
    3. {
    4.     PRKAPC pApc = NULL; //Our APC
    5.     PVOID pMappedAddress = NULL; //This is where the UserMode routine's code will be placed at
    6.     ULONG dwSize = 0; //Size of code to be executed in Explorer's address space
    7.     KAPC_STATE ApcState; // Needed for KeStackAttachProcess
    8.     ULONG *data_addr=0; //just a helper to change the address of the 'push' instruction in the ApcCreateProcess routine
    9.     ULONG dwMappedAddress = 0; //same as above
    10.    
    11.     NTSTATUS Status = STATUS_UNSUCCESSFUL;
    12. //__asm int 3;
    13.     if (!pTargetThread || !pTargetProcess)
    14.         return STATUS_UNSUCCESSFUL;
    15.  
    16.     //Allocate memory for our APC
    17.     pApc = ExAllocatePool (NonPagedPool,sizeof (KAPC));
    18.     if (!pApc)
    19.     {
    20.         DbgPrint(" * * * * * KernelExec -> Failed to allocate memory for the APC structure\n");
    21.         return STATUS_INSUFFICIENT_RESOURCES;
    22.     }
    23.  
    24.     //Get the size of our UserMode code
    25.     dwSize = (unsigned char*)ApcCreateProcessEnd-(unsigned char*)ApcCreateProcess;
    26.    
    27.     //Allocate an MDL describing our ApcCreateProcess' memory
    28.     pMdl = IoAllocateMdl (ApcCreateProcess, dwSize, FALSE,FALSE,NULL);
    29.     if (!pMdl)
    30.     {
    31.         DbgPrint(" * * * * * KernelExec -> Failed to allocate MDL\n");
    32.         ExFreePool (pApc);
    33.         return STATUS_INSUFFICIENT_RESOURCES;
    34.     }
    35.    
    36.     __try
    37.     {
    38.         //Probe the pages for Write access and make them memory resident
    39.         MmProbeAndLockPages (pMdl,KernelMode,IoWriteAccess);
    40.     }
    41.     __except (EXCEPTION_EXECUTE_HANDLER)
    42.     {
    43.         DbgPrint(" * * * * * KernelExec -> Exception during MmProbeAndLockPages\n");
    44.         IoFreeMdl (pMdl);
    45.         ExFreePool (pApc);
    46.         return STATUS_UNSUCCESSFUL;
    47.     }
    48.    
    49.     //Attach to the Explorer's address space
    50.     KeStackAttachProcess( pTargetProcess,&ApcState);
    51.  
    52.     //Now map the physical pages (our code) described by 'pMdl'
    53.     pMappedAddress = MmMapLockedPagesSpecifyCache (pMdl,UserMode,MmCached,NULL,FALSE,NormalPagePriority);
    54.     if (!pMappedAddress)
    55.     {
    56.         DbgPrint(" * * * * * KernelExec -> Cannot map address\n");
    57.         KeUnstackDetachProcess (&ApcState);
    58.         IoFreeMdl (pMdl);
    59.         ExFreePool (pApc);
    60.         return STATUS_UNSUCCESSFUL;
    61.     }
    62.     else   DbgPrint(" * * * * * KernelExec -> UserMode memory at address: 0x%p\n",pMappedAddress);
    63.  
    64.     dwMappedAddress = (ULONG)pMappedAddress;
    65.    
    66.     memset ((unsigned char*)pMappedAddress + 0x14, 0, 300);//zero everything out ecxept our assembler code
    67.         memcpy ((unsigned char*)pMappedAddress + 0x14, lpProcess,strlen (lpProcess)); //copy the path to the executable
    68.  
    69.     data_addr = (ULONG*)((char*)pMappedAddress+0x9); //address pushed on the stack (originaly 0xabcd)...
    70.     *data_addr = dwMappedAddress+0x14; //..gets changed to point to our exe's path
    71.    
    72.     //all done, detach now
    73.     KeUnstackDetachProcess (&ApcState);
    74.    
    75.     //Initialize the APC...
    76.     KeInitializeApc(pApc,pTargetThread,
    77.         OriginalApcEnvironment,
    78.         &ApcKernelRoutine,NULL,
    79.         pMappedAddress, UserMode, (PVOID) NULL);
    80.    
    81.     //...and queue it
    82.     if (!KeInsertQueueApc(pApc,0,NULL,0))
    83.     {
    84.         DbgPrint(" * * * * * KernelExec -> Failed to insert APC\n");
    85.         MmUnlockPages(pMdl);
    86.         IoFreeMdl (pMdl);
    87.         ExFreePool (pApc);
    88.         return STATUS_UNSUCCESSFUL;
    89.     }
    90.     else
    91.     {
    92.         DbgPrint(" * * * * * KernelExec -> APC delivered\n");
    93.     }
    94.    
    95.     if(!pTargetThread->ApcState.UserApcPending)  //is this a non-alertable  //if yes then alert it
    96.         pTargetThread->ApcState.UserApcPending = TRUE;
    97.  
    98.     return 0;
    99. }
    100. //-------------
    101. __declspec(naked) void ApcCreateProcess(PVOID NormalContext, PVOID  SystemArgument1, PVOID SystemArgument2)
    102. {
    103.     __asm
    104.     {
    105.         mov eax, 0x75e9e695  //win7  ,     0x7C86114D xp sp2 //  WinExec
    106.         push 1
    107.         nop
    108.         push 0xabcdef01// <- pMappedAddress + 9
    109.         call eax
    110.         jmp end      
    111.                 много nop-ов / <- pMappedAddress + 0x14
     
  15. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    для полноты приведу сообщения дебагера
    * * * * * RP -> TargetProcess : 0x840CB030 -> explorer.exe
    * * * * * RP -> Thread: 0x843ED030 Alertable:No
    * * * * * RP -> Thread: 0x84314358 Alertable:Yes
    ............
    Tcb.Alertable == 0x03c & 0x20
    *((unsigned char *)pTargetThread + /*ET_pending*/ 0x56) = 1;
    .........
    * * * * * InstallUserModeApc
    * * * * * KernelExec -> Targeted thread: 0x84314358
    * * * * * KernelExec -> UserMode memory at address: 0x01ED0670
    * * * * * KernelExec -> APC delivered

    это выводит дебагер на виртуалке
    Unhandled exception at 0x036e0660 in explorer.exe: 0xC0000005: Access violation.

    0x01ED0670 : -> mov eax, 0x75e9e695 // WinExec
    т.е. 1-ая команда

    вроде все правильно, что это может быть ?
     
  16. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Вопрос про этот же код, под Win2003 SP2 нет никакой реакции на АРС, все успешно, ни БСОДов, не ошибок, ничего, все тихо
     
  17. dfrsa

    dfrsa New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    88
    смотри http://www.rsdn.ru/article/baseserv/InjectDll.xml , а именно "заключение". расширь с висты на 2003 sp2; win7 не тестировал, но думаю что аналогично.
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    0xFox
    Я же выше написал рабочий способ без всяких кривых апц. Регистрация через экспортируемые сервисы csrsrv. Вы бы еще код 10летней давности взяли
     
  19. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    На сколько я понял уважаемый dfrsa предполажил что система х64, или я что то не совсем понял....
    Или имелось в виду раздел "Форсированная доставка АРС"? Система х86, поэтому вроде как должно все работать, но почему то не работает...

    Подскажите пожалуйста
     
  20. dfrsa

    dfrsa New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    88
    Нет. Читай внимательно.

    >>>В качестве ограничений предложенного способа можно выделить следующие:
    * Внедрение DLL невозможно в защищенные процессы в Windows Vista(из моих личных исследований, 2003 sp2 - точно ). Однако, поскольку для реализации предложенного способа используется драйвер режима ядра, то в дальнейшем данное ограничение может быть устранено путем модификации структур режима ядря процесса.

    В случае не защищенных процессов, инжект должен отрабатывать на ура. Метод для обхода защиты системных процессов существует, там достаточно просто все.