Skip to content

Commit 6efe133

Browse files
authored
Merge pull request #26 from syschmod/master
Improve D-Link eCos RomFS support and add D-link MD5 based langpack signature ReFirmLabs#456
2 parents 59142ea + 3417573 commit 6efe133

File tree

3 files changed

+25
-6
lines changed

3 files changed

+25
-6
lines changed

src/binwalk/magic/filesystems

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,14 +570,17 @@
570570

571571
# Not to be confused with an actual romfs image!
572572
# ftp://ftp.dlink.eu/Products/dir/dir-600/driver_software/DIR-600_fw_revC1_3-05B15__all_en_20120216.zip
573+
# based on eCos romfs, but with lzma files compression
573574
0x10 string ROMFS\x20v D-Link ROMFS filesystem,
574575
>0x17 string x version %s,
575576
>0 string !\x2EmoR
576577
>>0 string !Rom\x2E {invalid} unknown endianness
577578
>0 string \x2EmoR little endian,
579+
>>4 lelong x %d entries,
578580
>>8 lelong x size: <= %d
579581
#>>8 lelong-0x20 x {jump:%d}
580582
>0 string Rom\x2E big endian,
583+
>>4 belong x %d entries,
581584
>>8 belong x size: <= %d
582585
#>>8 belong-0x20 x {jump:%d}
583586

src/binwalk/magic/misc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,10 @@
8383
# Xilinx FPGA Bitstream
8484
# Ref: http://www.xilinx.com/support/answers/7891.html
8585
0 ubequad 0xffffffffaa995566 Xilinx Virtex/Spartan FPGA bitstream dummy + sync word
86+
87+
# D-Link MD5 hash based langpack (sealpac.slp used in embedded PHP i18n function)
88+
0 belong 0x05ea19ac D-Link MD5 based langpack (sealpac),
89+
>4 belong x %d translations,
90+
>8 bequad !0 {invalid} non-zero header padding
91+
>0x1f byte 0
92+
>>0x10 string x langcode: %s

src/binwalk/plugins/dlromfsextract.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111

1212
class RomFSCommon(object):
1313

14+
def _read_next_halfword(self):
15+
value = struct.unpack("%sH" % self.endianness, self.data[self.index:self.index + 2])[0]
16+
self.index += 2
17+
return value
18+
1419
def _read_next_word(self):
1520
value = struct.unpack("%sL" % self.endianness, self.data[self.index:self.index + 4])[0]
1621
self.index += 4
@@ -48,20 +53,21 @@ class RomFSEntry(RomFSCommon):
4853

4954
DIR_STRUCT_MASK = 0x00000001
5055
DATA_MASK = 0x00000008
51-
COMPRESSED_MASK = 0x005B0000
56+
COMPRESSED_MASK = 0x005B0000 # wrong - probably some permissions
5257

5358
def __init__(self, data, endianness="<"):
5459
self.data = data
5560
self.endianness = endianness
5661
self.index = 0
5762

5863
self.type = self._read_next_word()
59-
self.unknown2 = self._read_next_word()
60-
self.unknown3 = self._read_next_word()
64+
self.nlink = self._read_next_word()
65+
self.user_id = self._read_next_halfword()
66+
self.group_id = self._read_next_halfword()
6167
self.size = self._read_next_word()
62-
self.unknown4 = self._read_next_word()
68+
self.ctime = self._read_next_word()
6369
self.offset = self._read_next_word()
64-
self.unknown5 = self._read_next_word()
70+
self.size_decompressed = self._read_next_word() # 0 means no compression
6571
self.uid = self._read_next_uid()
6672

6773

@@ -167,6 +173,9 @@ def _process_all_entries(self):
167173
entries[entry.uid].offset = entry.offset
168174
entries[entry.uid].size = entry.size
169175
entries[entry.uid].type = entry.type
176+
entries[entry.uid].size_decompressed = entry.size_decompressed
177+
entries[entry.uid].ctime = entry.ctime
178+
entries[entry.uid].nlink = entry.nlink
170179
if entry.uid == 0:
171180
entries[entry.uid].name = os.path.sep
172181

@@ -200,7 +209,7 @@ def _process_all_entries(self):
200209
class DlinkROMFSExtractPlugin(binwalk.core.plugin.Plugin):
201210

202211
'''
203-
Gzip extractor plugin.
212+
D-link ROMFS extractor plugin.
204213
'''
205214
MODULES = ['Signature']
206215
BLOCK_SIZE = 10 * 1024

0 commit comments

Comments
 (0)