Полный ПИ 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: |