Здрасте. Задача следующая. Имеется мутирующий код(не содержащий данных), тоесть никакие переменные в нём находиться не могут. Код исполняется на всех процессорах. Необходима ссылка для адресации всех переменных. Где её можно хранить, при условии что код исполняется на любом IRQL ? Обычно я использовал страницу с PCR, доставляя IPI и загружая линк в конец страницы.
Clerk если надо хранить только ссылку (это же 4\8 байт) - возможно использовать один из доступных MSR регистров (хотя это конечно очень зависимо от проца). Собственно на ум приходит только часть ядра которая доступна всем процессорам. Найти там область свободную (благо она небольшая) и там хранить данные. К примеру в образе nt kernel`а , который с проецирован в память. Это я назвал только то, что первое пришло на ум. Файлы\файловые потоки (вы сами сказали любой IRQL).
TermoSINteZ Для прогрузки мср нужно также IPI использовать. Хранить в модулях - нужен быстрый доступ к переменным, тогда где хранить смещение переменной в модуле.. можно конечно свободное пространство использовать, но его может и не быть. google Обьекты слишком медленно.
а чобы не хранить в самом конце после отмутированого кода я ж так понимаю результирующий размер известен
sl0n Нельзя это сделать. Код не сосредоточен в виде процедуры в некотором регионе памяти. Более того, может применяться динамический морфинг, когда на лету в памяти код меняется, это делает не возможным использование переменных в коде.
ну а как чтобы двиг формировал псевдо инструкции ну для 32-х бит к примеру такую mov eax,adress_ ну и как нить её пометить и вшить в рандомное место морфируемого кода
А да и оффтоп есть ли у кого семплы диких зверей один баянистый полиморф из текущего года и такой же пермутирующий
sl0n Не. Модель должна быть стандартной, так как заранее двиг, который будет исполнять морфинг не известный. Есть идея задать фиксированный адрес для блока, расположив его в конце пользовательского ап, или в начале системного. Так как лимиты дескрипторов ограничены MmHighestUserAddress, то выполнить доступ к этой странице из U-mode не удастся. Снизу она будет ограничена страницей NOACCESS, сверху тоже.
ну ещё как вариант хмм регистр попользовать но система сама их юзоет .. сброситься .. . хз кароче как по уму сделать - остается тока вариант ага в ядре де нить хронить .. ну не обязательно в ядре в какой нить памяти с спец характеристиками
sl0n MSR, NPX и прочие блоки локальны для процессора. С таким же успехом можно использовать TSS. У меня текущее решение следующее(без IPI): Код (Text): ; + ; Поиск переменной KiAbiosGdt. ; xQueryKiAbiosGdt proc uses ebx esi edi NtImageBase:PVOID, pKiAbiosGdt:PVOID, pKeNumberProcessors:PVOID Local ImageHeader:PIMAGE_NT_HEADERS Local Fn[3*4]:PVOID Call SEH_Epilog_Reference Call SEH_Prolog invoke LdrImageNtHeader, NtImageBase, addr ImageHeader test eax,eax mov Fn[0],0D259263FH ; HASH("KeI386AllocateGdtSelectors") mov Fn[4],08B4DB3F5H ; HASH("KeNumberProcessors") mov Fn[2*4],eax jnz Exit invoke LdrEncodeEntriesList, NtImageBase, 0, addr Fn test eax,eax mov esi,Fn[0] ; KeI386AllocateGdtSelectors mov edi,pKiAbiosGdt jnz Exit lea ebx,[esi + 74H] Step: movzx eax,word ptr [esi] ; 2B15 XXXXXXXX sub edx,dword ptr ds:[_KiAbiosGdt] cmp al,2BH ; 2B /r sub r32,r/m32 jne Next mov al,ah ; ModR/M test ah,MODRM_MOD_MASK jnz Next and al,MODRM_RM_MASK shr ah,3 cmp al,101B jne Next cmp ah,2 ja Next mov ecx,dword ptr [esi + 2] ; _KiAbiosGdt mov edx,Fn[4] ; KeNumberProcessors mov ebx,pKeNumberProcessors xor eax,eax mov dword ptr [edi],ecx mov dword ptr [ebx],edx jmp Exit Next: Call VirXasm32 add esi,eax cmp ebx,esi ja Step mov eax,STATUS_NOT_FOUND jmp Exit SEH_Epilog_Reference: %GET_CURRENT_GRAPH_ENTRY Exit: Call SEH_Epilog ret xQueryKiAbiosGdt endp ; + ; Загрузка переменной в KPCR всех процессоров. ; o Disp < X86_PAGE_SIZE ; o Адресация переменной посредством FS:[Disp]. ; xLoadVariableInPcrs proc uses ebx esi edi pKiAbiosGdt:PVOID, NumberProcessors:ULONG, Variable:PVOID, Disp:ULONG Call SEH_Epilog_Reference Call SEH_Prolog mov edi,pKiAbiosGdt cmp NumberProcessors,32 mov eax,1 ja Error cmp NumberProcessors,0 jne @f cpuid shr ebx,16 mov byte ptr [NumberProcessors],bl @@: mov esi,dword ptr [edi] ; PKGDT xor eax,eax xor ecx,ecx xor edx,edx xor ebx,ebx lock cmpxchg8b qword ptr [esi + KGDT_R0_PCR] ; -> Edx:Eax mov ecx,edx btr edx,8 ; A mov ebx,Variable cmp dh,10010010B ; P:1, DPL:0, S:1, Type:001(DATA, RW) jne Error cmp ax,1 ; Limit mov ecx,edx jne Error shr ecx,8 and ch,11001111B mov al,dl ; Base: 23%16 cmp ch,11000000B ; G:1, ; D:1 jne Error and edx,0FF000000H ; Base: 31%24 ror eax,16 mov ecx,Disp or eax,edx ; PKPCR mov dword ptr [eax + ecx],ebx add edi,4 dec NumberProcessors jnz @b xor eax,eax jmp Exit Error: mov eax,STATUS_UNSUCCESSFUL jmp Exit SEH_Epilog_Reference: %GET_CURRENT_GRAPH_ENTRY Exit: Call SEH_Epilog ret xLoadVariableInPcrs endp
Clerk Базу ядра на момент инициализации морфера можно 1 раз вычислить и хранить а в какой нибудь области кода морфера (можно даже неявно). Все-же база - это 4\8 байт. Не много.
TermoSINteZ Именно в этом и вопрос. Хранить в коде нельзя. Просто потому, что нет нормального способа это сделать.
ну а как дебильный вариант пронюхать место в ядре статик ... на разных осях и его по бычьи пробить .. ну с новым сп всё перепроверить придёцо