Embedded fajlok kiszedese word dokumentumbol

Hatha segit valakinek:

Vannak kedves emberek, akik olyan MS Office doksikat kuldenek, amik tele vannak tovabbi beagyazott MS Office es mas doksikkal. Nyilvan az ECDL konyvekbol ezt tanultak a titkarnokepzoben :P, ellenben szerintem erosen anti-pattern ez a megoldas.

Hogyan lehetne hozzajutni a beagyazott doksik tartalmahoz?

A vicc az, hogy a beagyazott MS Office fajlokkal nincs kulonosebb gond, Openoffice szepen megoldja. Viszont a beagyazott PDF-fel nem tud mit kezdeni: "General Error" hibauzenet fogad, ha megprobalom megnyitni.

Az egyszeruseg kedveert tetelezzuk fel, hogy docx (xlsx, pptx) a formatum. Sima doc/xls/ppt mar level 2-es feladat.

Eloszor is segit az unzip, a docx belsejeben egyebek mellett ilyesmi fajlokat fogunk talalni:


/word/embeddings/
 Microsoft_Office_Word_97_-_2003_Document1.doc
 Microsoft_Office_Word_97_-_2003_Document2.doc
 Microsoft_Office_Word_97_-_2003_Document3.doc
 oleObject1.bin
 oleObject2.bin
 oleObject3.bin

Remek, a beagyazott .doc fajlok megvannak, meg is nyithatok. A PDF-ek nyilvan az oleObject.bin fajlokban lesznek, csakhogy a PDF nezo szerint megsem.


file oleObject1.bin 
oleObject1.bin: CDF V2 Document, corrupt: Cannot read summary info

Valoban nem PDF...

Ez a problema nem csak engem erint, masnak is elojott, ahol egyreszt kiderult a baj forrasa: az "egyeb" beagyazott dokumentumokat valami OLE objektumba csomagolva taroljak. Tovabba azt tanacsoltak, ahogy tekintsuk meg az Apache POIFS projektet, amivel Java API-n keresztul tudunk manipulalni ilyen dokumentumokat.

Most nem vagyok olyan hangulatban, hogy elkezdjek egy command line toolt irni, ami ezzel az library-vel megoldja a fajlok kinyereset. Legyen ez majd kesobb a - fent mar emlitett - level 2 megoldas.

Hatha megy ez egyszerubben is.


hexdump -C oleObject1.bin

00000000  d0 cf 11 e0 a1 b1 1a e1  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  3b 00 03 00 fe ff 09 00  |........;.......|
00000020  06 00 00 00 00 00 00 00  00 00 00 00 01 00 00 00  |................|
00000030  01 00 00 00 00 00 00 00  00 10 00 00 02 00 00 00  |................|

Igen, hat ez nem ugy kezdodik, mintha pdf lenne, de nezzuk csak lejjebb...


00000840  01 00 fe ff 03 0a 00 00  ff ff ff ff 65 ca 01 b8  |............e...|
00000850  fc a1 d0 11 85 ad 44 45  53 54 00 00 11 00 00 00  |......DEST......|
00000860  41 63 72 6f 62 61 74 20  44 6f 63 75 6d 65 6e 74  |Acrobat Document|
00000870  00 00 00 00 00 14 00 00  00 41 63 72 6f 45 78 63  |.........AcroExc|
00000880  68 2e 44 6f 63 75 6d 65  6e 74 2e 37 00 f4 39 b2  |h.Document.7..9.|
00000890  71 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |q...............|
000008a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000008c0  40 00 03 00 01 00 00 00  00 00 00 00 00 00 00 00  |@...............|
000008d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000a00  43 00 4f 00 4e 00 54 00  45 00 4e 00 54 00 53 00  |C.O.N.T.E.N.T.S.|
00000a10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000a40  12 00 02 00 ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
00000a50  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000a70  00 00 00 00 05 00 00 00  7c 72 00 00 00 00 00 00  |........|r......|
00000a80  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000c00  25 50 44 46 2d 31 2e 34  0a 25 c7 ec 8f a2 0a 35  |%PDF-1.4.%.....5|
00000c10  20 30 20 6f 62 6a 0a 3c  3c 2f 4c 65 6e 67 74 68  | 0 obj.<</Length|
00000c20  20 36 20 30 20 52 2f 46  69 6c 74 65 72 20 2f 46  | 6 0 R/Filter /F|

Hoppa, 0x0c00-tol kezdve ott figyel a PDF header! Vajon hol lehet a vege?


00007e50  36 39 31 41 41 32 30 42  43 35 34 44 36 35 35 41  |691AA20BC54D655A|
00007e60  3e 5d 0a 3e 3e 0a 73 74  61 72 74 78 72 65 66 0a  |>].>>.startxref.|
00007e70  32 38 35 37 34 0a 25 25  45 4f 46 0a 00 00 00 00  |28574.%%EOF.....|
00007e80  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00008000

Ez a legvege a fajlnak. Bar nem vagyok akkora PDF guru, hogy fejbol ismerjem a szintaxist, de a szimatom azt sugja, hogy a %%EOF-nal er veget a PDF. Utana mar csak 0-k jonnek az eredeti bin fajl vegeig.

Proba szerencse, remeljuk, hogy nincs kodolva a pdf torzse:


dd if=oleObject1.bin skip=3072 of=oleObject1.pdf bs=1

evince oleObject1.pdf

Es ezt mar mindenfele PDF nezovel meg lehet nyitni, elso pillantasra a tartalma is korrektnek tunik.

Great Success!

Edit:
timar javasolt meg tovabbi idevonatkozo projekteket, amik elso nekifutasra elkerultek a figyelmemet. (Talan nem eleg kozismertek? Legalabbis a Gugliban keresgelesnel, az elso par oldalon szereplo talalatokban senkinek nem jutott eszebe javasolni oket):
- libgsf
- oletoy
Ezeket is erdemes lehet megnezni, mert talan kulturaltabban meg lehet oldani a feladatot veluk.

Hozzászólások

Na igen, nekem a vim hexa módja (%!xxd) és szintén dd segítségével sikerült a múltkor openwrt firmware "képfájlból" a SquashFS részt kiszedni, majd unsquash után hasznosítani. :)

A hexa legyen veled! :D

"Hogyan lehetne hozzajutni a beagyazott doksik tartalmahoz?"

Megnyitod Wordben :)
--
cythoon

Ügyes, de ezzel csak a "zip" docx-ekkel, illetve adott esetben gondolom az odf-ekkel lehet varázsolni. A sima doc-okkal nemigazán, pedig érdekes lenne. Mondjuk ha valami úton-módon esetleg a libre/open office konvertálni tudná, ha megjeleníteni nem is... de ez csak egy ötlet.

Van még a libgsf is, Linuxokon megtalálható szokott lenni.


$ gsf list Doc1.doc
$ gsf cat Doc1.doc  $(gsf list Doc1.doc | grep Ole10Native | sed -e "s/^.*Obj/Obj/") > ojjektum

De biztos lehet a libgsf-re alapozva okosabb toolt is írni.
Az oletoy megvan? Csak hogy legyen minden egy helyen. :)

Megnéztem a PKGBUILD-ot, nincs semmi extra paraméter kiherélésre :-) Gyanítom, hogy ezesetben inkább vmi extráról lehet szó, de megnézem mostmár.
szerk: nos, úgy tűnik, hogy a forrás tools mappája alatt figyel ilyen wrapper script meg bináris. Ami miatt én nem találtam, az az, hogy nem volt a csomag telepítve :-D Ezt persze teljesen nem értem, mert volt fenn koffice, ami meg dependál rá, és calligra meg van is, ez viszont nem dependál rá... mondjuk lehet legyaktam a többi orphan csomaggal, mert elég kevés a hely ezen a kis gépen.

Régen (Ubuntu alatt) mc-ben a fájlon Enter, és megnyitotta a tömörítvényt. Ezután a szokásos módon lehetett másolni a kívánt fájlokat a másik panelre. Talán egyszerűbb így. Vagy nem. :-)
Most Sabayont használok, szerkeszteni kellett a kiterjesztésfájlt (Parancsok menü, alulról a harmadik pont -> ods, ... formátumokhoz a zip formátumnál lévő parancsokat átmásolni), és utána itt is működik a dolog. Igaz, hogy csak ods-sel és odt-vel próbáltam, mert nem találtam docx-et, de azzal is működnie kell.

Ettől még az OLE "bűvészkedést" nem lehet megúszni.

-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.