blast там есть точка KiIntSystemCall и механизм через int 2e. Кстати говоря, такая же есть и в win xp, но не используется. PS. А не проще ли контекст выполняющегося потока сменить?
А что происходит когда произвожу аттач из OllyDbg к процессу CSRSS, вся система намертво виснет и нет продолжения, только перезагрузка, вроди для отладки, OllyDbg включает отладочную привилегию и процессы даже системные должны отлаживаться?
Народ! Исследую возможность инжекта с помощью модификации кода в EntryPoint PE-модуля из ядра. Суть метода в том, что с помощью MDL отображаю страницы, в которых располагаются данные PE-модуля, из user-mode в kernel-mode, после чего их лочу и модифицирую (по аналогии с методой обхода защиты от записи SSDT). Но появилась проблема: DOS_HEADER & NT_HEADER отображаются в ядро замечательно и поддаются модификации, а вот секции кода, данных - мапятся не понятно куда. У кого есть какие-либо соображения?
Есть соображение чтоб ты пояснил все подробнее. Не понятно куда - это как? Куда? Я уже раз 5 писал тут, что нельзя вид секции редактировать через MDL или CR0.WP=0 Будешь писать напрямую в менеджер кэша для тех страниц, что еще не скопировать. Нужно сначала сделать ZwProtectVirtualMemory и весь образ поменять на PAGE_EXECUTE_READWRITE
Код (Text): // ... // -2.2- получили хэндл процесса. Выделим память в процессе __asm { int 3h } ns = ZwAllocateVirtualMemory(pProcessInstance->hProcessHandle, &(pProcessInstance->pvInjectBaseVA), 0, &(g_InjectModule.liRequiredSize.LowPart), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); // TODO if (NT_SUCCESS(ns)) // если память выделена то копируем туда модуль { #ifdef DBG_HOOK DbgPrint("[LoadImage] ST: VM allocate success %x %x\n", ProcessId, pProcessInstance->pvInjectBaseVA); #endif // -2.2.1- копирование внедряемого модуля UM_CopyModuleIntoBufferMem(g_InjectModule.pvAddrInSystemMemory, pProcessInstance->pvInjectBaseVA); // -2.2.2- вычисляем адрес точки входа во внедряемом модуле pProcessInstance->pvInjectEntryVA = UM_GetModuleEntryPoint(pProcessInstance->pvInjectBaseVA); #ifdef DBG_HOOK DbgPrint("[LoadImage] ST: Inject entry point %x in process %x.\n", pProcessInstance->pvInjectEntryVA, ProcessId); #endif // -2.2.3- сохраняем данные из точки входа основного модуля процесса KeAttachProcess(pProcessInstance->peProcess); // -2.2.4- get PE header of main module for matching entry point pProcessInstance->pvInjectMdlUserInSystemVA = inj_MapUserVirtualMemoryIntoKernel(pProcessInstance->pvMainBaseVA, 4096, &(pProcessInstance->pInjectMdl)); #ifdef DBG_HOOK DbgPrint("[LoadImage] ST: System VA of user PE-VA {%x}.\n", pProcessInstance->pvInjectMdlUserInSystemVA); #endif if (pProcessInstance->pvInjectMdlUserInSystemVA != NULL) { // -2.2.4- match entry point for main PE-module in process. pProcessInstance->pvMainEntryVA = UM_GetModuleEntryPoint(pProcessInstance->pvMainBaseVA); pProcessInstance->pvMainSectionCodeVA = UM_GetBaseVAOfCodeSection(pProcessInstance->pvMainBaseVA); #ifdef DBG_HOOK DbgPrint("[LoadImage] ST: entry point in main module {%x} code va: {%x}\n", pProcessInstance->pvMainEntryVA, pProcessInstance->pvMainSectionCodeVA); #endif /* // insert int 3 inj_InsertDataToMapping(int3h, 2, ((unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA) + 0, &(pProcessInstance->pInjectMdl)); // insert push i32 inj_InsertDataToMapping(push_arg, 5, (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2, &(pProcessInstance->pInjectMdl)); // insert push i32 inj_InsertDataToMapping(push_arg, 5, (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2 + 5, &(pProcessInstance->pInjectMdl)); // insert push i32 inj_InsertDataToMapping(push_arg, 5, (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2 + 5 + 5, &(pProcessInstance->pInjectMdl)); inj_InsertDataToMapping(call_delta, 5, (unsigned char*)pProcessInstance->pvInjectMdlUserInSystemVA + 2 + 5 + 5 + 5, &(pProcessInstance->pInjectMdl)); */ // unmap user VA from kernel mode VA inj_UnmapUserVirtualMemoryFromKernel(pProcessInstance->pvInjectMdlUserInSystemVA, &(pProcessInstance->pInjectMdl)); } // map entry point of main module into kernel VA pProcessInstance->pvInjectMdlUserInSystemVA = inj_MapUserVirtualMemoryIntoKernel(pProcessInstance->pvMainSectionCodeVA, 0x1000, &(pProcessInstance->pInjectMdl)); if (pProcessInstance->pvInjectMdlUserInSystemVA != NULL) { #ifdef DBG_HOOK DbgPrint("[LoadImage] ST: data in code section before {%x}\n", *((unsigned int *)(pProcessInstance->pvMainSectionCodeVA))); DbgPrint("[LoadImage] TEST: user data {%x} kernel data {%x}\n", *((unsigned int *)(pProcessInstance->pvMainSectionCodeVA)), *((unsigned int *)(pProcessInstance->pvInjectMdlUserInSystemVA))); #endif ... // eof Код inj_MapUserVirtualMemoryIntoKernel Код (Text): PVOID inj_MapUserVirtualMemoryIntoKernel( IN PVOID pvAddressOfUserMemory, IN ULONG ulSizeOfMapping, IN OUT PMDL *ppTargetMdl) { PVOID pvAddressOfKernelMap; PAGED_CODE(); if ((pvAddressOfUserMemory == NULL) || ((ULONG_PTR)pvAddressOfUserMemory >= HighUserModeAddress)) return NULL; if (ulSizeOfMapping < 0x1000 ) return NULL; if ((ppTargetMdl == NULL) || ((ULONG_PTR)ppTargetMdl <= HighUserModeAddress)) return NULL; // create MDL for mapping of user memory into kernel adress space *ppTargetMdl = MmCreateMdl(NULL, pvAddressOfUserMemory, ulSizeOfMapping); if (*ppTargetMdl == NULL) return NULL; // Set MDL for using with nonpaged pool MmBuildMdlForNonPagedPool(*ppTargetMdl); // set flag that described the memory is mapped into kernel (*ppTargetMdl)->MdlFlags = (*ppTargetMdl)->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; // Map pages into kernel mode pvAddressOfKernelMap = MmMapLockedPages(*ppTargetMdl, KernelMode); if (pvAddressOfKernelMap == NULL) { IoFreeMdl(*ppTargetMdl); *ppTargetMdl = NULL; return NULL; } return pvAddressOfKernelMap; }
Я не понимаю, зачем перемапировать в ядро? ZwProtectVirtualMemory и писать сразу в юзермод, чем не устраивает? Вот любители устроить себе приключений на свои вторые "девяносто"
так вот трабл в том, что после Код (Text): // map entry point of main module into kernel VA pProcessInstance->pvInjectMdlUserInSystemVA = inj_MapUserVirtualMemoryIntoKernel(pProcessInstance->pvMainSectionCodeVA, 0x1000, &(pProcessInstance->pInjectMdl)); данные в pProcessInstance->pvInjectMdlUserInSystemVA отличаются от данных в pProcessInstance->pvMainSectionCodeVA
amisto0x07 Без неё код будет ошибочен. Все-таки поясни, зачем тебе такой геморрой, котоырй еще и работать не будет принципиально.
нужен RK. APC использовать желания нет. Great, по\сни, почему ты так считаешь: Все-таки поясни, зачем тебе такой геморрой, котоырй еще и работать не будет принципиально.
Потому что я уже объяснил, что работать это не будет, ибо ты будешь писать напрямую в менеджер кэша и изменения будут скидываться на диск. Фактически, ты пропишешь все изменения на винте. При следующем запуске этот образ свалится. Чтобы выделить частную копию страницы есть документировання ф-я ZwProtectVirtualMemory
удивительно, но он не свалился. поставил эксперимент: модифицировал MZ-сигнатуру - естественно загрузчик выдал ошибку, что невалидный PE-модуль. Но после перезапуска образа без модификации модуль загрузился нормально.