2 import sys
, md5
, os
, mmap
3 from struct
import unpack
6 # We can brute force everything
10 sys
.stderr
.write (msg
)
15 buf
= map[pos
:pos
+20*4]
16 D
= unpack ("<20I", buf
)
19 return map[pos
+off
:pos
+off
+4]
21 if not buf
[0:4] in ["xff\x00", "xff2"]:
34 sechdroff
= unpack ("<I", buf
)[0] + 8 * 4
35 secoff
= unpack ("<I", r4 (sechdroff
+ 7*4))[0]
36 buf
= r4 (secoff
+ entr
)
37 if buf
== "\x01\x00\x00\x00":
39 elif buf
== "\x0c\x00\x00\x00":
41 elif buf
== "NMO\x00":
48 def findname (map, pos
, ext
):
49 startpos
= pos
- 16384
52 buf
= map[startpos
:pos
]
53 pos
= buf
.rfind ("." + ext
)
57 pos1
= buf
[:pos
].rfind ("\x00")
60 return buf
[pos1
+1:pos
+4]
66 m
= mmap
.mmap (x
.fileno (), s
, mmap
.MAP_PRIVATE
, mmap
.PROT_READ
)
72 buf
= m
[pos
:pos
+chunk
]
73 off
= buf
.find ("xff\x00")
86 name
= findname (m
, pos
, ext
)
88 if name
!= None and name
[0] <> 0x80: # oh well
89 print "%x %10d %s" % (pos
, size
, name
)