Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

имплантанты пышных формы

GPCH (ADMIN@VB-DECOMPILER.ORG)

Спецвыпуск: Хакер, номер #066, стр. 066-040-2


un2 Long Неиспользуемый DWORD

Таких структур столько же, сколько форм в проекте, и они идут одна за другой. Чтобы получить адрес начала формы, к aFormPointer прибавляем 93. Этот адрес должен указывать на длину информации о форме. Есть небольшая хитрость: адрес может занимать 2 либо 4 байта. Если считанный DWORD от_AND’ить с &H80000000, то мы определим число байт информации. Если DWORD содержит флаг &H80000000, то длина записана в 4 байта. В противном случае — в два. После длины идет собственно описание формы и лежащих на ней контролов. Вот оно! Как раз то, что искали! Теперь настало время разобраться с бинарным форматом форм и контролов.

ИСПОЛЬЗУЯ ИНФОРМАЦИЮ ИЗ ЭТОЙ СТАТЬИ, ТЫ БЕЗ ТРУДА НАПИШЕШЬ СВОЙ RESOURSEHACKER ДЛЯ VISUAL BASIC, АНАЛОГОВ КОТОРОМУ НА СЕГОДНЯШНИЙ ДЕНЬ НЕ СУЩЕСТВУЕТ

[бинарный формат формы] Когда-то, во времена VB 1.0 for DOS, все формы сохранялись по умолчанию в бинарном формате и это считалось нормальным. Современные же люди, привыкшие редактировать frm-файлы прямо в блокноте, с трудом представляют себе, что те же формы можно представить в упакованном бинарном формате. Почему упакованном? Потому что узнавать информацию о последнем контроле на форме нужно после того, как последовательно пропарсишь все предыдущие контролы. Значит, для добавления нового свойства контролу придется перепаковать всю структуру: сначала декомпилировать ее, потом изменить и снова скомпилировать, как это делает VB. Сложно, не спорю. Но что поделаешь?

Самые большие сложности возникают в том случае, если на форме лежит ActiveX или UserControl, который нужно выделить, чтобы не изменить его неизвестные свойства. Программеры боятся всех этих сложностей, поэтому по сей день не написано ни одного нормального редактора интерфеса VB-программ и русификаторы к VB-программам практически никем не создаются. Надеюсь, что, когда прочитаешь эту статью, ты разберешься, как устроены формы VB и как разбирать их и собирать заново. В бинарном упакованном виде каждый объект начинается со свойства Name и заканчивается идентификатором, по которому можно выяснить, идут ли другие объекты дальше, вложенность объектов и их завершение, также меню. Свойства чередуются крайне просто: сначала идет идентификатор свойства, затем — само значение, за ним — следующий идентификатор. Идентификаторы FF00-FF05 зарезервированы. Вот их описание:

Public Const vbFormNewChildControl = &H1FF

Public Const vbFormExistingChildControl = &H2FF

Public Const vbFormChildControl = &H3FF

Public Const vbFormEnd = &H4FF

Public Const vbFormMenu = &H5FF

Перед нами встает такая проблемка: откуда брать идентификаторы всех свойств всех контролов? Решение очень простое. Я уже составил таблицу путем выдирания этих свойств из TypeLib’ов VB и их многочисленных исправлений (таблицу можно найти на прилагаемом к журналу диске). А сейчас приступим к реальному примеру (рис. 1).

00 00 00 00-00 00 00 00-00 00 04 00-00 00 0D 00 ?? ?? ?

41 43 5F 45-78 44 65 63-5F 30 33 5F-42 00 0D 01 AC_ExDec_03_B ??

Назад на стр. 066-040-1  Содержание  Вперед на стр. 066-040-3