metc file formats ================= 2009-10-28 .. 2010-02-06, solyga@absinth.net 1 Binaries ---------- Infos taken from http://cpansearch.perl.org/src/KLIMKIN/P2P-pDonkey-0.01/doc/eDonkey-protocol, the Linux aMule code and some reverse engineering. 1.1 known.met ------------- Syntax (with some semantics): (terminals start with 0 (zero), nonterminals start with a letter) Format = ( 0x0e | 0x0f ) FileStatusList . (* met magic *) FileStatusList = DWORD { FileStatus } . (* number of items *) FileStatus = DATE HASH PartHashList TagList . (* ed2k hash *) PartHashList = WORD { HASH } . (* number of items *) TagList = DWORD { Tag } . (* number of items *) Tag = 0x02 TagName String | (* tag (value) type *) 0x03 TagName DWORD | 0x04 TagName FLOAT . TagName = ( 0x0001 SpecialTag ) | ( 0x0002 TwoByteTag ) | ( 0x0003 ThreeByteTag ) | String . (* strlen # 1..3 reqd *) SpecialTag = 0x01 | (* name *) 0x02 | (* size *) 0x03 | (* type *) 0x04 | (* format *) 0x08 | (* copied *) TwoByteTag = DWORD . String = WORD { CHAR } . (* number of chars *) FLOAT = DWORD . (* 4 bytes, intel coding *) DATE = DWORD . (* seconds since 1.1.1970) CHAR = BYTE . (* some vals may be disallowed *) WORD = BYTE BYTE . (* 2 bytes, little endian *) DWORD = WORD WORD . (* 4 bytes, little endian *) QuadWord = DWORD DWORD . (* 8 bytes, little endian *) HASH = QuadWord QuadWord . (* 16 bytes, little endian (?) *) BYTE = 0x01 .. 0xff . 1.2 part.met ------------ Format = 0xe0 FileStatus . 2 Sources --------- 2.1 known.met ------------- Syntax (with some semantics): Syntax = Magic FileList . Magic = 'known' | 'knownLarge' . FileList = 'file' FileCount '(' File ')' . File = Date HASH HashList TagList . Date = Year '-' Month '-' Day Hour ':' Minute ':' Second DST . HashList = 'parts' HashCount '(' HASH ')' . TagList = 'tags' TagCount '(' Tag ')' . Tag = TagName '=' TagValue . TagName = STRING | NUMBER . TagValue = STRING | NUMBER . FileCount = NUMBER . HashCount = NUMBER . TagCount = NUMBER . Year = NUMBER . Month = NUMBER . Day = NUMBER . Hour = NUMBER . Minute = NUMBER . Second = NUMBER . DST = NUMBER . (* DST # 0 <==> daylight saving time active *) scanner output symbols: keywords: 'known', 'knowLarge', 'files', 'parts', 'tags' simple : '(', ')', '-', ':', '=', '+' complex : NUMBER, STRING, HASH NUMBER = '$' HexNum | DecNum . HexNum = HexDigit { HexDigit } . DecNum = DecDigit { DecDigit } . HexDigit = DecDigit | 'a' .. 'f' | 'A' .. 'F' . DecDigit = '0' .. '9' . STRING = StringPart { '+' StringPart } . StringPart = Single | Double . Single = '"' { Char - '"' } '"' . Double = "'" { Char - "'" } "'" . HASH = '#' HexDigit (* insert 62 digits here *) HexDigit . Examples: The shortest of all valid source texts is ----- snip ----- known files 0() ----- snip ----- End-of-line is not required. A little bit longer was ----- snip ----- known files 1 ( 2009-09-17 22:10:04 1 (* 4AB2979C *) #966282E09C3C715A6E6B310E6EF1B63D parts 0 ( ) tags 9 ( $01 (* name *) = 'ÄÖÜäöüß' $01 (* name *) = 'ÄÖÜäöüß' $02 (* size *) = $0000000B (* 11 *) $50 (* xfdl *) = $00000000 (* 0 *) $54 (* xfdh *) = $00000000 (* 0 *) $51 (* rqed *) = $00000000 (* 0 *) $52 (* accd *) = $00000000 (* 0 *) $19 (* priu *) = $00000006 (* 6 *) $27 (* aich *) = 'VUW5JYNY3YMB2MSFWJ7S4FL4NQGIJMAB' ) ) ----- snip ----- 2.2 part.met ------------ Syntax = 'part' FileList .