Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

ОБФУСКАЦИЯ И ЕЕ ПРЕОДОЛЕНИЕ

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #066, стр. 066-008-4


Код после обфускации

push eax ; последнее значимое обращение к eax

xor eax,eax ; мусор

l1:

inc eax ; мусор

jz l2 ; мусор

cmp eax, ebx ; мусор

jnz l1 ; мусор

cmp eax, ecx ; мусор

jge l1 ; мусор

l2:

sub eax, 666h ; мусор

shl eax, 1 ; мусор

mov eax, ebx ; значимая реиницилизация eax

Также обфускаторы могут временно сохранять регистр на стеке, а затем, вволю «поизмывавшись» над ним, восстанавливать прежнее значение.

временное сохранение регистров на стеке с последующим восстановлением

001B:0043402C 50 PUSH EAX ; сохраняем eax

001B:0043402D 51 PUSH ECX ; сохраняем ecx

001B:0043402E EB0F JMP 0043403F

001B:0043403F F2EBF5 REPNZ JMP 00434037

001B:00434037 EB0F JMP 00434048

001B:00434048 EBE9 JMP 00434033

001B:00434033 B8EB07B9EB MOV EAX,EBB907EB ; «гадим» в eax

001B:0043403B 08FD OR CH,BH ; «гадим» в ch

001B:0043403D EB0B JMP 0043404A

001B:0043404A F3EBE4 REPZ JMP 00434031

001B:00434031 EB0F JMP 00434042

001B:00434042 EBF6 JMP 0043403A

001B:0043403A EB08 JMP 00434044

001B:00434044 F2EB08 REPNZ JMP 0043404F

001B:0043404F 59 POP ECX ; восстанавливаем ecx

001B:00434050 58 POP EAX ; восстанавливаем eax

Команда MOV EAX,EBB907EBh на первый взгляд выглядит «значимой», но на самом деле это «мусор», нейтрализуемый командами push eax/pop eax. По сути, весь этот конгломерат производит нулевой эффект, то есть является совершенно бездействующим кодом. Так что делать вывод о «значимости» команд нужно с очень большой осторожностью. Пока не будет доказано, что данный кусок кода действительно имеет какой-то эффект, он должен считаться «мусором» по умолчанию.

[некоторые обфускаторы] любят внедрять подложные расшифровщики, которые расшифровывают и тут же зашифровывают произвольные фрагменты памяти.

«подложный» расшифровщик, внедренный обфускатором

00434105 83ED 06 SUB EBP,6

00434108 B8 3B010000 MOV EAX,13B

0043410D 03C5 ADD EAX,EBP

0043410F 33DB XOR EBX,EBX

00434111 81C3 01010101 ADD EBX,1010101

00434117 3118 XOR DWORD PTR DS:[EAX],EBX ; расшифровываем

00434119 8138 78540000 CMP DWORD PTR DS:[EAX],5478

0043411F 74 04 JE SHORT app_test.00434125

00434121 3118 XOR DWORD PTR DS:[EAX],EBX ; зашифровываем

00434123 ^EB EC JMP SHORT app_test.00434111

Разумеется, все эти действия вносят побочные эффекты (как минимум, воздействуют на флаги), и обфускатору приходится выполнять множество дополнительных проверок, чтобы убедиться, что эти побочные действия не окажут рокового воздействия на защищаемую программу. Разработка качественного и надежного запутывателя — сложная инженерная задача, но потраченное время стоит того. Бесполезность «инструкций с нулевым эффектом» уже не распознается визуально, и обычный трассер тут ничем не поможет. Необходимо трассировать не только поток управления, но и поток данных, то есть отслеживать реальные изменения значений регистров/ячеек памяти, для чего обычно используются графы. Как только граф замыкается сам на себя, все «лишние» операции над данными удаляются и остается только суть.

Назад на стр. 066-008-3  Содержание  Вперед на стр. 066-008-5