Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #90, ИЮНЬ 2006 г.

Полный ПИ

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

// Число объектов

Содержание  Вперед на стр. 090-082-2
Hosted by uCoz