Распутывание кода
Как бы хакер не избегал анализа запутанного кода, рано или поздно он вляпается в ситуацию, когда полная реконструкция алгоритма будет действительно необходима! Сражение с обфускатором неизбежно! А раз так, к нему нужно подготовить себя заранее. Посмотрим, какие тузы у нас есть в рукавах и чем мы можем ему противостоять.
Начнем с того, что напишем трассер. Собственно говоря, написать его все равно придется, хотя бы уже затем, чтобы понять как работает отладчик. Лучше, если это будет "термоядерный" трассер, работающий на нулевом кольце и обходящий антиотладочные приемы, которые так любят использовать обфускаторы.
Протокол трассировки программы, уже знакомой нам по листингу2, будет выглядеть так (если трассер писать лень, можно использовать soft-ice, просто отключив окно кода командной WC, тогда результат трассировки командой T будет "вываливать" в нижнее окно, откуда его можно добыть сохранив историю команд в Symbol Loader'е: File-> Save Soft-Ice History As):
001B:00434001 E800000000 CALL 00434006
001B:00434006 5D POP EBP
001B:00434007 50 PUSH EAX
001B:00434008 51 PUSH ECX
001B:00434009 EB0F JMP 0043401A (JUMP v)
001B:0043401A F2EBF5 REPNZ JMP 00434012 (JUMP ^)
001B:00434012* EB0F JMP 00434023 (JUMP v)
001B:00434023 EBE9 JMP 0043400E (JUMP ^)
001B:0043400E B8EB07B9EB MOV EAX,EBB907EB
001B:00434013* 0F90EB SETO BL
001B:00434016* 08FD OR CH,BH
001B:00434018 EB0B JMP 00434025 (JUMP v)
001B:00434025 F3EBE4 REPZ JMP 0043400C (JUMP ^)
001B:0043400C EB0F JMP 0043401D (JUMP v)
001B:0043401D EBF6 JMP 00434015 (JUMP ^)
001B:00434015 EB08 JMP 0043401F (JUMP v)
001B:0043401F F2EB08 REPNZ JMP 0043402A (JUMP v)
001B:0043402A 59 POP ECX
001B:0043402B 58 POP EAX
001B:0043402C 50 PUSH EAX
001B:0043402D 51 PUSH ECX
001B:0043402E EB0F JMP 0043403F (JUMP v)
001B:0043403F F2EBF5 REPNZ JMP 00434037 (JUMP ^)
001B:00434037 EB0F JMP 00434048 (JUMP v)
001B:00434048 EBE9 JMP 00434033 (JUMP ^)
001B:00434033 B8EB07B9EB MOV EAX,EBB907EB
001B:00434038 0F90EB SETO BL
001B:0043403B 08FD OR CH,BH
001B:0043403D EB0B JMP 0043404A (JUMP v)
001B:0043404A F3EBE4 REPZ JMP 00434031 (JUMP ^)
001B:00434031 EB0F JMP 00434042 (JUMP v)
001B:00434042 EBF6 JMP 0043403A (JUMP ^)
001B:0043403A EB08 JMP 00434044 (JUMP v)
001B:00434044 F2EB08 REPNZ JMP 0043404F (JUMP v)
001B:0043404F 59 POP ECX
001B:00434050 58 POP EAX