ОБФУСКАЦИЯ И ЕЕ ПРЕОДОЛЕНИЕ КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #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 Разумеется, все эти действия вносят побочные эффекты (как минимум, воздействуют на флаги), и обфускатору приходится выполнять множество дополнительных проверок, чтобы убедиться, что эти побочные действия не окажут рокового воздействия на защищаемую программу. Разработка качественного и надежного запутывателя — сложная инженерная задача, но потраченное время стоит того. Бесполезность «инструкций с нулевым эффектом» уже не распознается визуально, и обычный трассер тут ничем не поможет. Необходимо трассировать не только поток управления, но и поток данных, то есть отслеживать реальные изменения значений регистров/ячеек памяти, для чего обычно используются графы. Как только граф замыкается сам на себя, все «лишние» операции над данными удаляются и остается только суть. |