Portál AbcLinuxu, 11. května 2025 00:51

Dotaz: Reverse engineering datových formátů

16.2.2005 20:28 unchallenger | skóre: 69 | blog: unchallenger
Reverse engineering datových formátů
Přečteno: 313×
Odpovědět | Admin
Hledám nějaký nástroj na $SUBJ. Pro začátek bych chtěl alespoň (pohodlně) vypisovat bloky ze souborů interpretované jako všechny možné typy (od usinged char po big endian IEEE double), vypsat z N souborů hodnoty na daném offsetu interpretované jako daný typ, hledat offsety, na nichž leží daná hodnota, když se správně interpretuje, etc. Navymýšlel bych si i pokročilejší funkce, ale zatím to vypadá, jako bych si musel něco napsat i na ty základní. Tudíž otázka je: Co na to použít?
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Vašek Lorenc avatar 16.2.2005 22:02 Vašek Lorenc | skóre: 27
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Bohužel neznám konkrétní produkt, ale vzhledem k tomu, že máš na práci nejspíš dost jiných věcí, nebylo by lepší tím pověřit nějakého šikovného diplomanta (třeba z informatiky)? Užitečná diplomka je poměrně vzácný jev.. ;)
...včetně majestátného loosa
16.2.2005 22:57 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
To je obávám se tak na zápočet...

Yeti: kdyby ses do toho pustil sám, tak dej vědět (třeba v blogu, mi tě nezastřelíme). BTW: khexedit asi není to, co chceš slyšet?
Vašek Lorenc avatar 16.2.2005 23:21 Vašek Lorenc | skóre: 27
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů

Netřeba se obávat :) Spíš šlo o to nechat práci někomu, kdo by ji rád dodělal a navíc by z toho měl užitek -- ať už jako bakalářku nebo zápočet.

Možná by bylo ale zajímavé někde hodit nějaký Wiki web a dávat tam různé poznámky a možná řešení k implementaci.. Nebo do blogu, ale ten by k tomu nemusel být tak vhodný. Nějaké hledání vzrůstajících/klesajících sekvencí by se třeba taky hodilo, zvlášť s různými odstupy (ať už hodnot nebo pozic v souboru) -- indexy nebo něco takového by se tím při velké dávce štěstí daly odhalit.. Ale takových nápadů má určitě kdekdo celé kapsy :)

...včetně majestátného loosa
16.2.2005 23:22 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Na zápočet? To by byl pěkně levný zápočet ;-)

Ad khexedit. To je přesně to, co chci, až na to, že to potřebuji skriptovat, a ne klikat (tedy někdy i interaktivně, a na to vypadá docela použitelně, až na to, že v hlavním okně umožňuje jen jednobajtové formáty, což je pro mě pruda, protože reálná čísla zatím z hexdumpu číst neumím). Mám třeba dvacet souborů a hypotézu, že na offsetu 0x0022 je jako little endian IEEE single nějaká zajímavá hodnota. Tak chci vypsat ze všech zároveň, co by to bylo zač, ve formátu soubor: hodnota. Strávil jsem v khexeditu jen několik minut, ale nevidím způsob, jak to udělat bez oteveření dvaceti oken nebo otevření dvaceti souborů postupně a čtyřiceti Ctrl-C, přepnutí okna, Ctrl-V, přepnutí okna.
elviin avatar 16.2.2005 22:20 elviin | skóre: 29 | blog: elviin | Plzeň-Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli jsem to spravne pochopil (jeste nevim, co je to $SUBJ), tak tomu by mohl poslouzit Bison.
16.2.2005 22:37 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
No, to moc ne. Možná jsem to nenapsal jasně, ale jde mi o binární data, v textových se obvykle jde vyznat, a o interaktivní šťourání, což yacc + lex stejně neumožňují.

P.S.: $SUBJ je proměnná obsahující na předmět zprávy (subject).
16.2.2005 22:45 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jediné co mě napadá je nějaký chytřejší hex editor, minimálně něco z toho by to mohlo zvládnout.
Weblate - překládání přes web | Gammu SMSD - posílání SMS | Blog
16.2.2005 23:24 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Odpovědět | | Sbalit | Link | Blokovat | Admin
No už to tak vypadá, že si budeš muset něco napsat (nebo si nechat něco napsat). Perlivé pack a unpack jsou silné zbraně, tak něco s Term::ReadLine by jsi měl mít za chvilku. Defakto by ti z toho rovnou mohl vypadávat zárodek příslušného filtru. Pokud jsi na perl zanevřel, tak je tu ještě python a jiné (forth ;-) smalltalk, lisp).
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
16.2.2005 23:34 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Když to začnu psát já, tak to skončí jedním ze dvou konců:

- jako chaotická změť specializovaných skriptíků, které budu před každým použitím upravovat a ještě předtím studovat, co vlastně delají

- jako interpret speciálního jazyka pro popis datových formátů[*], který nikdy nedokončím

A tomu se chci vyhnout, kromě toho bych ideálně nechtěl psát nic.

[*] perlí unpack znám, ale potřeboval bych nejdřív něco, co dokáže dekódovat ty formátovací vzory ;-)
16.2.2005 23:39 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
A tomu se chci vyhnout, kromě toho bych ideálně nechtěl psát nic.
Tuším, že se rodí velký softwarový produkt ;-)
Copak toho není dost?
16.2.2005 23:55 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
- jako interpret speciálního jazyka pro popis datových formátů[*], který nikdy nedokončím
Hmm, to mi silně připomíná "interpret" jazyka, který jsem vytvořil při reverse engeneeringu protokolu telefonu. Ale je to natolik nedokončené, že je asi lepší začít od začátku :-).
18.2.2005 19:36 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Právě jsem dopsal tohle, snad to dělá aspoň něco, co potřebuješ

ukázka:
$ ./revdump  '"na %d. pozici je " (u8) 0 (u16_le) 114 (u16_be) $0' /etc/passwd /etc/group
/etc/passwd: na 114. pozici je 613a     3a61
/etc/group: na 114. pozici je 3a78      783a
první parametr určuje, co se má odkud vypsat (dá se to načíst i ze souboru), zbytek jsou soubory, ze kterých se bude vypisovat. Ten zápis vypadá takhle:
"format string" (type) offset
nebo
"format string" (type) $reference
kde format string je nepovinný parametr pro printf (zatím skutečně printf, takže není problém to shodit ;-)), type je typ (umí to i floaty, ale moc jsem je nezkoušel), offset je jasný, reference znamená, že jako offset se veme výsledek n-tého výrazu (zde $0 dá 114, takže se vlastně použije stejná offset, jenom se interpretuje jako be).

Ješte chci přidělat opakování stejné posloupnosti výrazů na bloky vstupu, aby v tom šel emulovat xxd/od a nějaké základní operace pro výpočet offsetu (typu sečti výsledek $x a $y, vynásob n a použij to jako offset).

A taky vlastní printf, aby to nepadalo a aby to umělo \n apod a lár bugů

Takže otázka: hodí se ti něco takového?
18.2.2005 19:39 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Jo, a má to skoro 3 000 řádků ;-)
18.2.2005 22:23 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Jo, určitě, ale kde to najdu?

Já jsem tedy zrovna svůj poslední formát už rozebral pomocí xxd, head, tail a jednoúčelových primitivních nástrojů (resp. fázi fyzické struktury už mám za sebou), naštěstí byl dost jednoduchý, takže jsem psaní něčeho zase uložil k ledu, ale hodit se to určitě bude nejpozději příště ;-)
18.2.2005 23:29 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Já tam ještě opravoval pár chyb, je to tady. Ale zatím je to spíš takový prototyp, viz grep FIXME *
19.2.2005 19:54 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Nemůžu to nějak přimět k vypisování floating point dat. Pokud tomu dobře rozumím, tak

'"%g" (float_le) 0x0002'

by mělo vypsat little endian (Intel) IEEE single na posici 2, ale vypisuje to úplně jiná čísla, než vím, že v těch souborech jsou.

No, nebudu si stěžovat, až to budu zase potřebovat, raději se zapojím do vývoje...
19.2.2005 20:25 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Nj, floating point čísla jsou trochu rozbitý... Zítra bych měl mít čas, tak to dám do pořádku.
19.2.2005 20:34 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Žádný spěch; já doufám, že to nebudu potřebovat hodně dlouho. I když to tak asi úplně nedopadne ;-)
20.2.2005 15:18 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Oops, blbá chyba, zapomněl jsem, že float se funkcím s proměnným počtem parametrů (printf) předává jako double.

patch, nová verze.
22.2.2005 16:23 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Patch, aby se negativní offsety počítaly od konce souboru.

Patch pro výrobu rpm balíčku.

P.S.: Pokud tohle je verze 0.0.2.1, tak čekám, že verze 1.0 bude mimo jiné obsahovat reimplementaci TeXu v zsh ;-)
31.3.2005 16:10 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Mám po zkouškách, tak jsem dostal novou verzi do použitelného stavu: revdump-0.1.tar.gz. Nějaké příklady jsou v src/test/*.rd.

P.S.: Pokud tohle je verze 0.0.2.1, tak čekám, že verze 1.0 bude mimo jiné obsahovat reimplementaci TeXu v zsh ;-)
Zatím to není ekvivalentní ani HQ9+, ale do 1.0 času dost ;-)
31.3.2005 16:19 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Já jsem od té doby zase reverse-engineeroval a revdump využil, ale co jsem hodně potřeboval (a napsal si na to pidinástroj používaný v kombinaci s head a tail...), bylo interpretovat část souboru od každého bajtu jako daný typ (v mém případě nejčastěji single, double) a vypsat posice, které dají hodnoty z nějakého zadného/rozumného rozsahu

offset hodnota

pak se výsledek z několika souborů projede joinem, a hned je jasno.

Tak to byl takový námět ;-)
31.3.2005 16:43 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
./revdump --repeat --with-offsets --step=1 --cols=1 \
'(float_le) 0 if $_ > 10' soubory | grep -v NO
ale && zatím nefunguje. A je nevyšší čas napsat aspoň help, když jsem se sám musel koukat do zdrojáku, jak se ty optiony jmenují :-/

PS: Je to v main.c, až to budeš taky hledat ;-)
31.3.2005 16:59 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
Vlastně && a || se dají nahradit pomocí uniq, ale měl by to umět rovnou revdump (stejně jako nevypisovat řádky se samým NO).
31.3.2005 17:45 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Reverse engineering datových formátů
No vida, jaké to má netušené možnosti. Ještěže existuje jako help alespoň tento thread, jinak bych to do příště zapomněl... ;-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.