Uinc прямий доступ до макросам в документах ms word, microsoft word, binary format, structured

. Я порушив друге правило користування
ліфтом і вийшов крізь стіну.

С. Лук'яненко. Тиждень невдач.

Продовжуємо розбовтувати "кошмарні таємниці кривавої фірми Microsoft". J

1. "Правильний" спосіб

Взагалі-то, Microsoft дає користувачеві можливість подивитися на вихідний текст макросу, написаний на VBA:

Але ж є й інші підходи, які 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 саме він.

Характерною особливістю всіх таких потоків є сигнатура 01 16h 01.

Exe-code живе в потоках з іменами "__srp_0", "__srp_1" і т.п.

3. Як отримати доступ до потоку всередині документа

Знаючи формат структурованого сховища, можна самостійно написати програму сканування файлу. Але ми підемо іншим шляхом.

Бібліотека OLE2.DLL містить засоби для роботи зі структурованими сховищами. Функція stgIsStorageFile () повертає для файла ознака, чи є він структурованим сховищем чи ні. Функція stgOpenStorage () відкриває файл сховища і повертає "інтерфейс" IStorage. Це - об'єкт класу, що містить властивості та методи для роботи зі структурованими сховищами:
  • IStorage :: OpenStorage () - відкриває підкаталог, повертаючи інтерфейс для доступу до підлеглих каталогів;
  • IStorage :: Release () - закриває підкаталог;
  • IStorage :: EnumElements () - повертає інтерефейса перечіслітеля з методами Next (), Skip (), Reset () і т.п .;
  • IStorage :: OpenStream () - відкриває потік, повертаючи інтерефейса IStream з методами Read (), Write () і т.п.

Ось приклад програми, що сканує для зазначеного DOC-файлу внутрішні потоки.

Недоліки підходу: невисока швидкодія і проблеми доступу до запаролений і "злегка зіпсованим" документам.

4. Як знайти упакований исходник всередині потоку

Є "правильний" метод пошуку, але він досить зануда, тому я пропоную більш простий підхід. Він заснований на тому, що s-code лежить в другій половині потоку і організований у вигляді декількох фрагментів упакованих даних (так званих "чунков" - chunks). Перший з них має на початку сигнатуру, яку можна знайти за маскою 01 yz Bx, де xyz є 12-бітову довжину чунка мінус 3.

Наприклад, макрос вірусу Macro.Word97.TNT має по зсуву 15В9h три байта 01 63h B6h. Це означає початок упакованого чунка довжиною 663h + 3 = 666h байтів.

Ось приклад процедури, знаходить всередині потоку початок упакованого s-code:

5. Як розпакувати текст

Як уже зазначалося, s-code упакований алгоритмом LZNT1. Це варіант класичного алгоритму LZ77 (найпершого з алгоритмів, придуманих Лемпелом і Зивом), що відрізняється від своїх численних побратимів лише способом кодування вихідного потоку. (До речі, алгоритм, застосований фірмою Microsoft в утиліти COMPRESS / EXPAND і в бібліотеках LZEXPAND / LZ32. Реалізує схожий, але трохи інший варіант LZ77).

Ось приклад процедури, розпаковувати вихідний текст макросу і виводить його на екран:

Недолік методу: неможливість роботи в Windows 95/98 / ME.

6. Деякі зауваження

Крім того, пора бити тривогу, якщо исходник виглядає "страшненько", наприклад, як ось цей фрагмент знаменитого (серед вірусологів) поліморфного макровірусу PolyMac (він же Chydow):

Автоматизувати процес розпізнавання такого роду зарази можна, лише емулюючи виконання p-code або exe-code і декодуючи таким чином "тушку" вірусу. "Але це вже зовсім інша історія".

висновок

Щоб уникнути деякої порції докорів, поспішаю повідомити, що для вирішення деяких розглянутих вище завдань я знаю більш швидкі і потужні методи і алгоритми. Але в статті були розглянуті прості "замінники" для цих алгоритмів і методів, які, тим не менш, дозволили б в результаті все-таки вирішити задачу. Чи вдало у мене вийшло - вирішувати Вам.

До речі, я не буду сильно заперечувати, якщо компетентниме читачі почнуть критикувати мене конструктивно. тобто самі поділяться цікавими відомостями на цю тему.

Висловлюю вдячність учаснику проекту "антивірус Stop!" А. Карімову, в бесідах з яким народилися (і, сподіваюся, будуть продовжувати народжуватися) всі мої статті, присвячені дослідженням формату документів MS Word.

Ось поки і все. Дякую за увагу.

З глибокою повагою і щирою відданістю єсмь, панове, Ваш покірний слуга,

Всі документи і програми на цьому сайті зібрані ТІЛЬКИ для освітніх цілей, ми не відповідаємо ні за які наслідки, які мали місце як наслідок використання цих матеріалів \ програм. Ви використовуєте все вищеперелічене на свій страх і ризик.

Схожі статті