Полный ПИ GPcH (admin@vb-decompiler.org) Хакер, номер #090, стр. 090-082-1 Тонкости исследования команд p-кода виртуальной машины VB Куда только не несет девелоперское сознание в поисках защиты для своего кода. Навесные защиты, антиотладочные методы и даже... даже Visual Basic! Представь, писать программу на VB только ради того, чтобы ее не взломали. Жуть. А все из-за p-кода, в который так умело компилирует VB свои проргаммы. В отличие от стандартного машинного кода, исполняемого напрямую процессором, p-код - это набор мнемоник виртуальной машины, исполняемый движком msvbvmXX.dll. Olly - тут не большой помощник, а уж IDA - тем более. Однако, обладая терпением и информацией, изложенной в этой статье, ты сможешь разобраться с этой напастью и без сложных подручных средств. Немного о структурах Чтобы ломать... тьфу, я хотел сказать "реверсить" программы, скомпиилированные в p-код, этот p-код требуется сначала найти в дебрях exe-файла. Для этого придется разобраться хотя бы с частью структур Visual Basic'а, в большом количестве запихнутых в программу. Начнем мы, пожалуй, с рассмотрения оригинальной точки входа в программу. Чтобы на нее перейти, из HEX-редактора HIEW жми по очереди: Enter, Enter, F8, F5. push 0004042E8 ;'VB5!' call ThunRTMain ;MSVBVM60 --?2 Смысл этой невероятно сложной строки заключается в вызове функции ThunRTMain из MSVBVM60. В параметрах функции передается указатель на структуру VB Header. ThunRTMain из нее получает все необходимые данные и адреса структур, которые нужны для настройки и запуска EXE, а самое главное - адрес процедуры aSubMain, запускаемой при старте EXE. Если поле с адресом этой процедуры равно нулю, то ProcCallEngine грузит первую форму, и управление передается на функцию Form_Initialize, а если и она отсутствует, то - Form_Load. А уж если и этой функции нет, и в форме события не используются, то запускается цикл ожидания событий (WindowProc). Нам из этой структуры потребуются лишь aSubMain и структура ProjectInfo. Последняя имеет вид: Структура ProjectInfo lTemplateVersion Long Версия VB-совместимости aObjectTable Long Указатель на aObjectTable lNull1 Long aStartOfCode Long Начало кода (нам бесполезно) aEndOfCode Long Конец кода (нам бесполезно) lDataBufferSize Long Размер буфера для хранения различных данных aThreadSpace Long Пространство потока aVBAExceptionhandler Long Указатель на функцию обработки ошибок aNativeCode Long Если не равно нулю, то это Native Code, иначе P-Code uIncludeID 527 Byte aExternalTable Long Указатель на таблицу API-функций lExternalCount Long Число импортируемых API-функций Обозначенная таблица для нас как распутье. Продолжать далее имеет смысл, если только в aNativeCode стоит 0. Значит, функции на пикоде. Полезные нам данные мы получим из aObjectTable - это указатель на структуру объектов (форм модулей и так далее) среди прочих данных, в которых можно найти адреса процедур и событий. Структура ObjectTable lNull1 Long aExecProj Long aProjectInfo2 Long lConst1 Long lNull2 Long aProjectObject Long uuidObjectTable Long Flag2 Long Flag3 Long Flag4 Long fCompileType Integer // Число объектов |