Виртуальная машина на страже порядка

GPcH

Хакер, номер #077, стр. 077-106-1

(admin@dotfix.net, www.dotfix.net)

Защити программу с помощью собственного интерпретатора кода

Крэкер скачал новую программу, у которой без регистрации все функции заблокированы. “Ну, не в первой”, - подумал крэкер и полез за дизассемблером. Минут 10 исследовав программу он не нашел ни одной строчки понятного кода. “Может, программа упакована?” – предположил крэкер. Но нет, код на точке входа стандартный, созданный компилятором, следов упаковщиков не видно. Только после долгого и изнурительного исследования кода до крэкера, наконец, дошло, что дело он имеет не с каким-нибудь фиговым протектом, а с защитой виртуальной машиной.

Что же такое виртуальная машина, спросишь ты. Фактически, виртуальная машина (VM) – это интерпретатор, задача которого - перевод понятного ему промежуточного кода по установленным правилам в машинный native-код и его выполнение. Зачем такое может понадобиться? Ну, изначально промежуточный код и виртуальные машины планировались как еще один уровень независимости от оборудования. Ведь ты знаешь, что программа созданная для MacOS под виндами и на стандартном x86-камне работать не будет, так как она напичкана маковским native-кодом. А вот если бы программа компилировалась в промежуточный код, а на виндах стояла специальная виртуальная машина – никаких проблем бы не было. На этом принципе, “виртуальные машины + промежуточный код”, основан, например, язык Java. Все программы созданные на нем компилируются в код, который впоследствии должен выполняться на виртуальной машине. Так как VM понаделали под все существующие платформы, Java-программы могут работать везде. Хочешь - на маке, хочешь – на Виндах под x86, хочешь – на твоей любимой мобиле.

Как ты понимаешь, обычные дизассемблеры, рассчитанные на native-код, промежуточного кода не могут понять в принципе. Отсюда и популярность в отличной от портирования приложений области. Метод интерпретации стали использовать авторы профессиональных защит для затруднения исследования и взлома программ крэкерами. Думаешь, почему программы, написанные на Visual Basic, так сложно ломаются, и кряки к ним выходят не сразу? Вся фишка в том, что VB умеет компилировать программы не только в машинный код, но и в интерпретируемый p-код, который выполняется виртуальной машиной MSVBVM60.DLL, без которой, как это не печально, не запустится ни одна VB программа. С другими языками программирования до недавнего времени об использовании виртуальных машин не было и речи, но теперь есть софт для перевода кода, созданного компиляторами Delphi и СC++, из машинного в интерпретируемый для усложнения исследования кода. Программы могут стать почти не взламываемыми. Но, обо всем по порядку.

[виртуальная машина VB 6.0]

Как я уже говорил, Visual Basic 6.0 имеет собственную виртуальную машину, так называемую Microsoft Visual Basic Virtual Machine 6.0 (MSVBVM60.DLL). Движок интерпретатора содержится в секции Engine этой библиотеки и работает только в том случае, если ты компилируешь программу в p-код. По умолчанию VB создает native-код, чтобы включить компиляцию в интерпретируемый код нужно в среде программирования зайти в меню «Project» -> «Properties». Далее на вкладке «Compiler» поставить радиокнопку в положение «Compile to p-code» и нажать «OK». Теперь программа будет компилироваться в интерпретируемый код, и взломать ее будет в разы сложней. Хотя если у крэкера есть декомпилятор p-кода, то он сможет увидеть чуть ли не исходник твоей проги.

Содержание  Вперед на стр. 077-106-2
ttfb: 32.099008560181 ms