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

Полный ПИ

GPcH (admin@vb-decompiler.org)

Хакер, номер #090, стр. 090-082-2


iObjectsCount Integer

iCompiledObjects Integer

iObjectsInUse Integer

// Указатель на массив объектов (единственное, что для нас в этой структуре важно, помимо iObjectsCount)

aObjectsArray Long

lNull3 Long

lNull4 Long

lNull5 Long

aNTSProjectName Long

lLcID1 Long

lLcID2 Long

lNull6 Long

lTemplateVersion Long

Теперь, когда мы определились с таблицей объектов, давай посмотрим поподробнее на их массив. ObjectsArray - это массив структур TObject. Число элементов массива определяется полем iObjectsCount. Рассмотрим-ка получше структуру TObject и производную от нее TObjectInfo.

Структура TObject

// Указатель на структуру ObjectInfo

aObjectInfo Long

lConst1 Long

// Указатель на массив публичных переменных

aPublicBytes Long

// Указатель на массив статических переменных

aStaticBytes Long

// Указатель на публичные переменные

aModulePublic Long

// Указатель на статические переменные

aModuleStatic Long

// Указатель на имя объекта

aNTSObjectName Long

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

lMethodCount Long

// Указатель на массив адресов функций

aMethodNameTable Long

// Смещение на переменные из aModuleStatic

oStaticVars Long

// Тип объекта

lObjectType Long

lNull2 Long

Как видишь, эта структура уже поинтереснее. Поле aNTSObjectName означает модуль. Если поле содержит адрес на frmRegister, то это говорит нам, что функции, находящиеся в массиве из следующей структуры, отвечают за процесс проверки серийника.

Структура TObjectInfo

iConst1 Integer

// Индекс объекта

iObjectIndex Integer

// Указатель на таблицу объектов (требуется для разбора форм и объектов, лежащих на них)

aObjectTable Long

lNull1 Long

aObjectDescriptor Long

lConst2 Long

lNull2 Long

// Указатель на ObjectHeader

aObjectHeader Long

// Указатель на ObjectData

aObjectData Long

// Следующие члены валидны, если только программа скомпилирована в p-код:

// Число методов

iMethodCount Integer

iNull3 Integer

// Указатель на массив указателей на методы

aMethodTable Long

// Число констант

iConstantsCount Integer

// Максимально возможное число констант

iMaxConstants Integer

lNull4 Long

lFlag1 Long

// Указатель на массив указателей на константы

aConstantTable Long

Если не брать во внимание ивенты объектов на форме, а только созданные пользователем функции, то все их адреса можно найти в таблице, на которую указывает aMethodTable. Таблица для каждого модуля или формы, конечно, своя - это логично. Чтобы получить доступ ко всем функциям, необходимо перебрать все формы и модули, а также классмодули, юзерконтролы и т.д. Что же там по адресам из таблицы методов? Там очередная структура, которыми любит нас потчевать микрософт.

Структура ProcDscInfo

ProcTable Long

field_4 Integer

FrameSize Integer

ProcSize Integer

...

Я преднамеренно урезал эту структуру, так как нам из нее потребуется только ProcSize и адрес на таблицу ProcTable. Из таблицы ProcTable нам потребуется только адрес на блок данных. Об этом блоке данных, думаю, надо поговорить поподробнее. Все опкоды пикода, которые так или иначе оперируют с данными (будь то строки, API функции и так далее) ссылаются на них не по абсолютному, а по относительному адресу. Относительный адрес идет от начала блока данных. Так что, не зная адреса на блок данных, мы, по сути, не сможем ничего декомпилировать. Отсюда рассмотрим следующую структуру, расположенную по адресу ProcTable:

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