Крутой протектор – не беда Ms-Rem (Ms-Rem@yandex.ru) Спецвыпуск: Хакер, номер #057, стр. 057-056-7 Во втором случае формируется код, который для выполнения каких-либо действий напрямую вызывает функцию ВМ. То есть mov eax, ebx/mov ecx, edx может превратиться в нечто подобное mov eax, 10h/call vm_mov/mov eax, 20h/call vm_mov. Трудно сказать, какой их этих типов ВМ сложнее для взлома, так как все зависит от конкретной реализации. Я считаю, что самой сложной будет комбинированная реализация, при которой часть кода полностью эмулируется ВМ, часть превращается в вызовы ее функций, а остаток подвергается метаморфному преобразованию. По общим методам анализа ВМ никаких рекомендаций тоже не дам, потому что все целиком и полностью зависит от ее реализации. Единственный метод взлома - долгая и упорная медитация над кодом машины и осмысление всего происходящего в ней. И большой запас терпения. Можешь попрактиковаться, например на VMProtect - простом протекторе. Если захочешь чего-нибудь посложнее, бери Star Force 3 Pro – защиту с ВМ комбинированного типа, которая к тому же работает и в ring3, и в ring0. Динамическая расшифровка кода Несомненно, самый старый, но до сих пор применяемый прием - это динамическая расшифровка кода. Его суть в том, что код защищаемой программы расшифровывается не сразу, а по мере его исполнения. Например, Armadillo со включенным CopyMem расшифрует только первую страницу программы и передаст ей управление. Когда та обратится к еще не расшифрованным данным, возникнет исключение, по которому протектор расшифрует еще часть кода, зашифровав старый. Таким образом, весь код программы никогда не присутствует в памяти, а значит, его нельзя сдампить. Для борьбы с армадилой многим приходилось реверсировать весь код протектора, чтобы заставить его расшифровывать защищенную программу полностью. Но это весьма долгий и тяжелый путь, поэтому я ломал армадилу по-другому. Если процесс нельзя сдампить снаружи, почему не сделать это изнутри? Для этого нужно записать код дампера в адресное пространство процесса с помощью WriteProcessMemory и выполнить его, перенаправив контекст одной из нитей процесса (с помощью SetThreadContext) на наш код. Дальше внедренный в защищаемую программу дампер должен просто пройтись по секции кода и сбросить ее на диск. На CopyMem можно смело забить болт, так как при отсутствии страницы в памяти протектор, думая, что к ней обратилась сама защищенная программа, будет вынужден расшифровать ее и отдать нашему дамперу в готовом виде, так что Armadillo is fucking yourself. К сожалению, не все протекторы ломаются так же просто, как армадилла. Например, ExtremeProtector расшифровывает код не по обращению к занимаемой им памяти, а по исполнению этого кода, что сильно затрудняет его нахождение. Здесь хочешь не хочешь, но приходится лезть в сам алгоритм работы протектора. Аппаратные ключи Существует определенный класс программных продуктов, предназначенных для узкого круга пользователей и при этом очень дорогих. Это, например, корпоративные системы для работы с базами данных, биллинговые системы для провайдеров, специфические программы, применяемые на заводах, в научных лабораториях и т.д. Эти программы стоят десятки или даже сотни тысяч долларов. Убытки автора обычных шароварок от взлома весьма велики. Но у этого класса программ круг пользователей настолько узок, что в условиях российского пиратства и при наличии крэков у авторов не было бы возможности продать даже одну копию. В таких случаях обычно прибегают к аппаратным ключам. Они обеспечивают привязку программы к специальному устройству, подключающемуся к USB или LPT, и при правильной реализации могут сильно усложнить взлом защиты. Несомненно, лидером продаж сейчас являются аппаратные ключи HASP. Фирма Aladdin Software Security выпускает целую линейку ключей, предназначенных как для USB, так и для LPT, и отличающихся принципами своей работы. |