Техника снятия дампа с защищенных приложений


             

Механизмы динамической расшифровки - часть 2


Столкнувшись с "нашим" исключением, он попросту не будет знать, что с ним делать и с вероятностью близкой к единице, просто завершит приложение в аварийном режиме.

Теоретически, установку нового обработчика легко отследить, установив аппаратную точку останова по доступу к памяти на адрес FS:[00000000h]. Операционные системы семейства NT позволяют прикладным приложениям манипулировать с отладочными регистрами через контекст, причем, отладочный регистр действует лишь в рамках "своего" процесса, не мешая работать всем остальным, но 9x "забывает" сохранять отладочные регистры в контексте "своего" процесса и они приобретают глобальный характер, воздействующий на все процессы! Так что в ней этот трюк не проходит.

А вот другой способ: устанавливаем драйвер, перехватывающий исключения на уровне IDT и взаимодействующий со своим процессом либо через DeviceIoControl, либо через NtReadVirtualMemory/NtWriteVirtualMemory/KeDeattachProcess/KeAttachProcess. Это вполне надежно, однако, написание драйверов — занятие утомительное и совсем небезопасное в плане "голубых экранов смерти". К тому же, разработчику защиты придется либо наотрез отказываться от поддержки 9x (которая все еще жива!), либо реализовывать сразу два драйвера! Тем не менее, защиты такого типа все-таки встречаются.

Независимо от того, как происходит обработка исключения, сломать такую защиту очень просто! Читаем первую страницу, дожидаемся завершения расшифровки, сохраняем ее на диск, обращаемся к следующей странице и... действуем так до тех пор, пока в наших руках не окажется весь образ целиком. Стоит только внедрить код дампера в адресное пространство защищенного процесса и… протектору будет очень сложно отличить обращения самой программы от обращений дампера.

Последние версии протектора Armadillo, недавно переименованного в Software Passport, реализуют намного более надежный, хотя и чрезвычайно низко производительный механизм трассирующей расшифровки, при котором весь код программы зашифрован целиком.


Содержание  Назад  Вперед