Acces direct direct la macro-uri în documente ms cuvânt, cuvânt microsoft, format binar, structurat

. Am încălcat a doua regulă de utilizare
ridica și trece prin perete.

S. Lukyanenko. Săptămâna eșecurilor.

Continuăm să bâjbâim "secretele de coșmar al companiei sângeroase Microsoft". J







1. Modul "drept"

În general, Microsoft oferă utilizatorului posibilitatea de a privi textul sursă al unei macro-uri scrise în VBA:

Dar există și alte abordări pe care Microsoft practic nu vrea să le documenteze.

2. Unde locuiesc macro-urile?

Știm deja că fișierul MS Word este un obiect complex cu formatul unei structuri de stocare structurate și toate informațiile utile sunt stocate în acesta ca fluxuri.

În MS Word 6.0 / 7.0, macro-urile au fost localizate împreună cu textul documentului într-un fir obișnuit numit "Document Word".

În versiunile ulterioare ale componentelor software care trăiesc în interiorul documentului, acesta nu este organizat sub forma unei multitudini de macro-uri individuale, sub forma așa-numita VBA-proiect, care este fizic „uns“ de fire diferite.

În plus, în cadrul documentului MS Word, pot fi prezente și trei imagini ale aceluiași macro.

În primul rând, este textul sursă al macrocomenzii, așa-numitul cod s-cod. Nu este vizibil "pe luminator" din interiorul fișierului; comprimat de algoritmul LZNT1.

În al doilea rând, este rezultatul compilării unei surse de text într-o imagine binară - așa-numitul pseudocod (sau p-cod). Acesta poate fi executat de mașina virtuală MS Word.

În cele din urmă, acesta este un cod exe executat pentru execuție (sau ex-cod, sau cod executabil). Nu este întotdeauna prezent, dar dacă este prezent, el execută mașina virtuală MS Word.

O caracteristică caracteristică a tuturor acestor fluxuri este semnătura 01 16h 01.

Codul exe trăiește în fire cu numele "__srp_0", "__srp_1" etc.

3. Cum să accesați fluxul într-un document

Cunoscând formatul unui depozit structurat, puteți scrie în mod independent un program de scanare a fișierelor. Dar vom merge în altă direcție.

Biblioteca OLE2.DLL conține instrumente pentru a lucra cu depozite structurate. Funcția stgIsStorageFile () returnează un steag pentru fișier, indiferent dacă este sau nu un depozit structurat. Funcția stgOpenStorage () deschide fișierul repository și returnează interfața IStorage. Este un obiect al unei clase care conține proprietăți și metode de lucru cu depozite structurate:





  • IStorage :: OpenStorage () - deschide un subdirector, returnând interfața pentru a accesa directoarele subordonate;
  • IStorage :: Release () - închide subdirectorul;
  • IStorage :: EnumElements () - returnează interogarea enumeratorului cu metodele Next (), Skip (), Reset (), etc;
  • IStorage :: OpenStream () - deschide un fir, returnând introspecția IStream cu metode Read (), Write (), etc.

Iată un exemplu de program care scanează fluxurile interne pentru un fișier .doc specificat.

Dezavantaje ale abordării: viteză redusă și probleme de acces la documente protejate prin parolă și "ușor corupte".

4. Cum să găsiți sursa ambalată în interiorul fluxului

Există o metodă de căutare "corectă", dar este destul de plictisitoare, așa că sugerez o abordare mai simplă. Se bazează pe faptul că s-codul se află în a doua jumătate a fluxului și este organizat sub forma mai multor fragmente de date ambalate (așa-numitele "bucăți"). Primul are o semnătura la început, care poate fi găsită de masca 01 yz Bx, unde xyz este lungimea bucății de 12 biți minus 3.

De exemplu, macroul virusului Macro.Word97.TNT are la offset 15B9h trei octeți 01 63h B6h. Aceasta înseamnă începutul unei lungimi de pachete ambalate de 663h + 3 = 666h octeți.

Iată un exemplu de procedură care găsește începutul unui cod s-pack în interiorul fluxului:

5. Cum să dezarhivați textul

Așa cum am menționat deja, s-codul este împachetat cu algoritmul LZNT1. Această variantă a algoritmului clasic LZ77 (chiar primul dintre algoritmii plănuite de Lempel și Ziv), caracterizat prin numeroasele sale omologii doar un fel codificarea fluxului de ieșire. (Apropo, algoritmul aplicat de către Microsoft în utilități COMPRESS / Ext și biblioteci LZEXPAND / LZ32. Implementează o versiune similară, dar puțin diferită de LZ77).

Iată un exemplu de procedură care despachetează textul sursă al unei macrocomenzi și o transmite pe ecran:

Dezavantajul metodei: incapacitatea de a lucra în Windows 95/98 / ME.

6. Unele comentarii

În plus, este timpul să sune alarma în cazul în care codul sursă arată „strashnenko“, cum ar fi aceasta fragment din celebra (printre virusologi) macro virus polimorf POLYMAC (aka Chydow):

Automatizarea procesului de recunoaștere a acestui tip de infecție este posibilă numai prin emularea executării codului p sau a codului exe și deci prin decodificarea "carcasei" virusului. "Dar aceasta este o poveste complet diferită".

concluzie

Pentru a evita o anumită cantitate de reproșuri, mă grăbesc să vă informez că pentru rezolvarea unora dintre problemele discutate mai sus cunosc metode și algoritmi mai rapizi și mai puternici. Dar în articol s-au luat în considerare simpli "substituenți" pentru acești algoritmi și metode, care, totuși, ar rezolva problema. Dacă am reușit - este de până la tine.

Apropo, nu voi obiecta puternic dacă cititorii competenți îmi vor critica în mod constructiv. și anume ei înșiși vor împărtăși informații interesante pe această temă.

Îmi exprim recunoștința față de participantul la proiectul "Antivirus Stop!" A. Karimov, în ale căror convorbiri s-au născut (și, sper, se vor naște în continuare) toate articolele mele dedicate cercetării formatului documentelor MS Word.

Asta e tot pentru moment. Vă mulțumesc pentru atenție.

Cu cel mai profund respect și sincer devotament, sunt, dragi domni, servitorul tău umil,

Toate documentele și programele de pe acest site sunt colectate NUMAI în scopuri educaționale, nu suntem responsabili pentru eventualele consecințe care au survenit ca urmare a utilizării acestor materiale / programe. Utilizați toate cele de mai sus pe propriul risc.







Articole similare

Trimiteți-le prietenilor: