Прямой доступ к макросам в документах MS WORD
ОГЛАВЛЕНИЕ
1. "Правильный" способ
Вообще-то, Microsoft дает пользователю возможность посмотреть на исходный текст макроса, написанный на VBA:
- в меню "Сервис" выбрать пункт "Макрос";
- потом выбрать "Макросы";
- затем в появившемся списке выбрать желаемую строчку (например, "AutoOpen");
- нажать на кнопку "Изменить";
- и в окне редактора Visual Basic for Application узреть, наконец, вожделенный исходник.
Существуют ряд модификаций этого способа, связанных с использованием Организатора, с копированием макросов из документа в шаблон, с прямым вызовом редактора VBA по Alt-F11 и т.п. Но подобно дверям некрасовского "парадного подъезда", которые открывались далеко не для всех, этот способ не гарантирует успеха никому. Некоторые "привилегированные" макросы (например, большинство современных вирусов) таким образом увидеть невозможно.
Но ведь есть и другие подходы, которые Microsoft принципиально не желает документировать...
2. Где живут макросы
Мы уже знаем, что файл MS Word - это сложный объект, имеющий формат структурированного хранилища (structured storage), а вся полезная информация хранится в нем в виде потоков (streams).
В MS Word 6.0/7.0 макросы находились вместе с текстом документа в одном общем потоке с именем "Word Document".
В более поздних версиях программные компоненты, живущие внутри документа, организованы уже не в виде множества отдельных макросов, а в виде так называемого VBA-проекта, который физически "размазан" по различным потокам.
Кроме того, внутри документа MS Word одновременно могут присутствовать стразу ТРИ формы представления одного и того же макроса.
Во-первых, это исходный текст макроса, так называемый s-code. Он не виден "на просвет" внутри файла, т.к. сжат алгоритмом LZNT1.
Во-вторых, это результ компиляции текстового исходника в двоичный образ - так называемый псевдокод (или p-code). Он может исполняться виртуальной машиной MS Word.
Наконец, это подготовленный к исполнению exe-code (или ex- code, или executable code). Он присутствует не всегда, но если присутствует, то исполняется виртуальной машиной MS Word именно он.
S-code и p-code живут в потоках:
- "newmacros" (обычно, это "свежесозданные" пользователем макросы);
- "thisdocument" (обычно, это "служебные" макросы и вирусы, размножающиеся при помощи методов Import/Export);
- в потоках с именами макросных модулей (например, макросы вируса Macro.Word97.Emlitch, размножающегося при помощи OrganizerCopy, живут в потоке с именем sfc).
Характерной особенностью всех таких потоков является сигнатура 01 16h 01.
Exe-code живет в потоках с именами "__srp_0", "__srp_1" и т.п.