инжект из кернел мода

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

  1. qwqwqwqw

    qwqwqwqw New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2009
    Сообщения:
    54
    Clerk
    а на реализацию твоего метода можно глянуть?
    буду очень благодарен
    !!!!
     
  2. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    ну вот, скоро появится очередной пионерский гуано-зловред. мда...
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    qwqwqwqw
    Готового кода нет, нужно подумать.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    blast
    там есть точка KiIntSystemCall и механизм через int 2e.
    Кстати говоря, такая же есть и в win xp, но не используется.


    PS. А не проще ли контекст выполняющегося потока сменить?
     
  5. JCronos

    JCronos New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2009
    Сообщения:
    98
    А что происходит когда произвожу аттач из OllyDbg к процессу CSRSS, вся система намертво виснет и нет продолжения, только перезагрузка, вроди для отладки, OllyDbg
    включает отладочную привилегию и процессы даже системные должны отлаживаться?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    csrss это Win32 подсистема. олькой вряд ли тебе удастся ее отладить.
     
  7. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    JCronos
    SoftIce попробуй :) Старомодно, но работает
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    спорно)
     
  9. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    Народ! Исследую возможность инжекта с помощью модификации кода в EntryPoint PE-модуля из ядра. Суть метода в том, что с помощью MDL отображаю страницы, в которых располагаются данные PE-модуля, из user-mode в kernel-mode, после чего их лочу и модифицирую (по аналогии с методой обхода защиты от записи SSDT). Но появилась проблема: DOS_HEADER & NT_HEADER отображаются в ядро замечательно и поддаются модификации, а вот секции кода, данных - мапятся не понятно куда. У кого есть какие-либо соображения?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Есть соображение чтоб ты пояснил все подробнее. Не понятно куда - это как? Куда?

    Я уже раз 5 писал тут, что нельзя вид секции редактировать через MDL или CR0.WP=0
    Будешь писать напрямую в менеджер кэша для тех страниц, что еще не скопировать.
    Нужно сначала сделать ZwProtectVirtualMemory и весь образ поменять на PAGE_EXECUTE_READWRITE
     
  11. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    Код (Text):
    1. //
    2. ...
    3. // -2.2- получили хэндл процесса. Выделим память в процессе
    4.             __asm { int 3h }
    5.             ns = ZwAllocateVirtualMemory(pProcessInstance->hProcessHandle,
    6.                 &(pProcessInstance->pvInjectBaseVA),
    7.                 0,
    8.                 &(g_InjectModule.liRequiredSize.LowPart),
    9.                 MEM_COMMIT | MEM_RESERVE,
    10.                 PAGE_EXECUTE_READWRITE);
    11.  
    12.             // TODO
    13.             if (NT_SUCCESS(ns)) // если память выделена то копируем туда модуль
    14.             {
    15. #ifdef DBG_HOOK
    16.                 DbgPrint("[LoadImage] ST: VM allocate success %x %x\n", ProcessId, pProcessInstance->pvInjectBaseVA);
    17. #endif
    18.                 // -2.2.1- копирование внедряемого модуля
    19.                 UM_CopyModuleIntoBufferMem(g_InjectModule.pvAddrInSystemMemory, pProcessInstance->pvInjectBaseVA);
    20.  
    21.                 // -2.2.2- вычисляем адрес точки входа во внедряемом модуле
    22.                 pProcessInstance->pvInjectEntryVA = UM_GetModuleEntryPoint(pProcessInstance->pvInjectBaseVA);
    23. #ifdef DBG_HOOK
    24.                 DbgPrint("[LoadImage] ST: Inject entry point %x in process %x.\n",
    25.                     pProcessInstance->pvInjectEntryVA, ProcessId);
    26. #endif
    27.  
    28.                 // -2.2.3- сохраняем данные из точки входа основного модуля процесса
    29.                 KeAttachProcess(pProcessInstance->peProcess);
    30.  
    31.                 // -2.2.4- get PE header of main module for matching entry point
    32.                 pProcessInstance->pvInjectMdlUserInSystemVA =
    33.                     inj_MapUserVirtualMemoryIntoKernel(pProcessInstance->pvMainBaseVA,
    34.                                                        4096,
    35.                                                        &(pProcessInstance->pInjectMdl));
    36.  
    37. #ifdef DBG_HOOK
    38.                 DbgPrint("[LoadImage] ST: System VA of user PE-VA {%x}.\n",
    39.                     pProcessInstance->pvInjectMdlUserInSystemVA);
    40. #endif
    41.  
    42.                 if (pProcessInstance->pvInjectMdlUserInSystemVA != NULL)
    43.                 {
    44.                     // -2.2.4- match entry point for main PE-module in process.
    45.                     pProcessInstance->pvMainEntryVA = UM_GetModuleEntryPoint(pProcessInstance->pvMainBaseVA);
    46.                     pProcessInstance->pvMainSectionCodeVA = UM_GetBaseVAOfCodeSection(pProcessInstance->pvMainBaseVA);
    47.  
    48. #ifdef DBG_HOOK
    49.                     DbgPrint("[LoadImage] ST: entry point in main module {%x} code va: {%x}\n",
    50.                         pProcessInstance->pvMainEntryVA, pProcessInstance->pvMainSectionCodeVA);
    51. #endif
    52. /*
    53.                     // insert int 3
    54.                     inj_InsertDataToMapping(int3h, 2,
    55.                                             ((unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA) + 0,
    56.                                             &(pProcessInstance->pInjectMdl));
    57.                     // insert push i32
    58.                     inj_InsertDataToMapping(push_arg, 5,
    59.                                             (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2,
    60.                                             &(pProcessInstance->pInjectMdl));
    61.                     // insert push i32
    62.                     inj_InsertDataToMapping(push_arg, 5,
    63.                                             (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2 + 5,
    64.                                             &(pProcessInstance->pInjectMdl));
    65.                     // insert push i32
    66.                     inj_InsertDataToMapping(push_arg, 5,
    67.                                             (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2 + 5 + 5,
    68.                                             &(pProcessInstance->pInjectMdl));
    69.                     inj_InsertDataToMapping(call_delta, 5,
    70.                                             (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2 + 5 + 5 + 5,
    71.                                             &(pProcessInstance->pInjectMdl));
    72. */
    73.                     // unmap user VA from kernel mode VA
    74.                     inj_UnmapUserVirtualMemoryFromKernel(pProcessInstance->pvInjectMdlUserInSystemVA,
    75.                                             &(pProcessInstance->pInjectMdl));
    76.                 }
    77.  
    78.                 // map entry point of main module into kernel VA
    79.                 pProcessInstance->pvInjectMdlUserInSystemVA =
    80.                     inj_MapUserVirtualMemoryIntoKernel(pProcessInstance->pvMainSectionCodeVA,
    81.                                                     0x1000,
    82.                                                     &(pProcessInstance->pInjectMdl));
    83.                
    84.                 if (pProcessInstance->pvInjectMdlUserInSystemVA != NULL)
    85.                 {
    86.  
    87. #ifdef DBG_HOOK
    88.                     DbgPrint("[LoadImage] ST: data in code section before {%x}\n",
    89.                         *((unsigned int *)(pProcessInstance->pvMainSectionCodeVA)));
    90.                     DbgPrint("[LoadImage] TEST: user data {%x} kernel data {%x}\n",
    91.                         *((unsigned int *)(pProcessInstance->pvMainSectionCodeVA)),
    92.                         *((unsigned int *)(pProcessInstance->pvInjectMdlUserInSystemVA)));
    93. #endif     
    94. ...
    95. // eof
    Код inj_MapUserVirtualMemoryIntoKernel
    Код (Text):
    1. PVOID inj_MapUserVirtualMemoryIntoKernel(
    2.     IN PVOID pvAddressOfUserMemory,
    3.     IN ULONG ulSizeOfMapping,
    4.     IN OUT PMDL *ppTargetMdl)
    5. {
    6.     PVOID pvAddressOfKernelMap;
    7.  
    8.     PAGED_CODE();
    9.    
    10.     if ((pvAddressOfUserMemory == NULL) || ((ULONG_PTR)pvAddressOfUserMemory >= HighUserModeAddress))
    11.         return NULL;
    12.  
    13.     if (ulSizeOfMapping < 0x1000 )
    14.         return NULL;
    15.  
    16.     if ((ppTargetMdl == NULL) || ((ULONG_PTR)ppTargetMdl <= HighUserModeAddress))
    17.         return NULL;
    18.  
    19.     // create MDL for mapping of user memory into kernel adress space
    20.     *ppTargetMdl = MmCreateMdl(NULL, pvAddressOfUserMemory, ulSizeOfMapping);
    21.     if (*ppTargetMdl == NULL)
    22.         return NULL;
    23.  
    24.     // Set MDL for using with nonpaged pool
    25.     MmBuildMdlForNonPagedPool(*ppTargetMdl);
    26.  
    27.     // set flag that described the memory is mapped into kernel
    28.     (*ppTargetMdl)->MdlFlags = (*ppTargetMdl)->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    29.  
    30.     // Map pages into kernel mode
    31.     pvAddressOfKernelMap = MmMapLockedPages(*ppTargetMdl, KernelMode);
    32.    
    33.     if (pvAddressOfKernelMap == NULL)
    34.     {
    35.         IoFreeMdl(*ppTargetMdl);
    36.         *ppTargetMdl = NULL;
    37.         return NULL;
    38.     }
    39.     return pvAddressOfKernelMap;
    40. }
     
  12. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    тогда каким образом изменить код?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я не понимаю, зачем перемапировать в ядро?
    ZwProtectVirtualMemory и писать сразу в юзермод, чем не устраивает?
    Вот любители устроить себе приключений на свои вторые "девяносто"
     
  14. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    хочу отойти от использования ZwProtectVirtualMemory
     
  15. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    так вот трабл в том, что после
    Код (Text):
    1. // map entry point of main module into kernel VA
    2. pProcessInstance->pvInjectMdlUserInSystemVA =
    3.     inj_MapUserVirtualMemoryIntoKernel(pProcessInstance->pvMainSectionCodeVA,
    4.                         0x1000,
    5.                         &(pProcessInstance->pInjectMdl));
    данные в pProcessInstance->pvInjectMdlUserInSystemVA отличаются от данных в pProcessInstance->pvMainSectionCodeVA
     
  16. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    есть мылси поэтому поводу?
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    amisto0x07
    Без неё код будет ошибочен.
    Все-таки поясни, зачем тебе такой геморрой, котоырй еще и работать не будет принципиально.
     
  18. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    нужен RK. APC использовать желания нет.
    Great, по\сни, почему ты так считаешь: Все-таки поясни, зачем тебе такой геморрой, котоырй еще и работать не будет принципиально.
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Потому что я уже объяснил, что работать это не будет, ибо ты будешь писать напрямую в менеджер кэша и изменения будут скидываться на диск. Фактически, ты пропишешь все изменения на винте. При следующем запуске этот образ свалится.
    Чтобы выделить частную копию страницы есть документировання ф-я ZwProtectVirtualMemory
     
  20. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    удивительно, но он не свалился. поставил эксперимент: модифицировал MZ-сигнатуру - естественно загрузчик выдал ошибку, что невалидный PE-модуль. Но после перезапуска образа без модификации модуль загрузился нормально.