1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 """ These are standard address spaces supported by Rekall Memory Forensics """
27 import StringIO
28 import struct
29 import os
30 import weakref
31
32 from rekall import addrspace
33 from rekall import config
34
35
36 config.DeclareOption(
37 "-o", "--file_offset",
38 type="IntParser", help="A Relative offset for image file.")
39
40
42 """An address space which operated on a file like object."""
43
44 __name = "filelike"
45
46
47 order = 0
48
49 - def __init__(self, base=None, fhandle=None, **kwargs):
50 self.as_assert(base == None, "Base passed to FDAddressSpace.")
51 self.as_assert(fhandle is not None, 'file handle must be provided')
52
53 self.fhandle = fhandle
54 try:
55 self.fhandle.seek(0, 2)
56 self.fsize = self.fhandle.tell()
57 except IOError:
58
59
60 self.fsize = 0
61 self.volatile = True
62 self.session.logging.warn(
63 "Unable to determine file size, assuming file is volatile.")
64
65 self.offset = 0
66
67 super(FDAddressSpace, self).__init__(**kwargs)
68
69 - def read(self, addr, length):
79
81 string = self.read(addr, 4)
82 (longval,) = struct.unpack('=I', string)
83 return longval
84
89
91 if addr == None:
92 return False
93 return True
94
97
99 return (self.__class__ == other.__class__ and
100 self.fname == other.fname)
101
102
104 """ This is a direct file AS.
105
106 For this AS to be instantiated, we need
107
108 1) A valid config.filename
109
110 2) no one else has picked the AS before us
111
112 3) base == None (we dont operate on anyone else so we need to be
113 right at the bottom of the AS stack.)
114 """
115
116 __name = "file"
117
118
119 order = 100
120
121
122 __image = True
123
124 - def __init__(self, base=None, filename=None, session=None, **kwargs):
150
151
153 """An address space to add a constant offset."""
154
155 __image = True
156
157
158 order = 120
159
169
170
172 """This address space can be used to create new files.
173
174 NOTE: This does not participate in voting or gets automatically
175 selected. It can only be instantiated directly.
176 """
177
178 - def write(self, addr, data):
179 self.fhandle.seek(addr)
180 self.fhandle.write(data)
181 self.fhandle.flush()
182
183 return len(data)
184
188
190 self.fhandle.seek(0, 2)
191 return self.fhandle.tell()
192
193 - def read(self, addr, length):
202
203
205
206 - def __init__(self, filename=None, mode="w+b", **kwargs):
216
217
219 """An address space which can be initialized from a file handle.
220
221 Note that file handle must be writable.
222 """
223
224
226 """An AS which always returns nulls."""
227 __name = 'dummy'
228
229 - def __init__(self, size=10 * 1024, session=None, **_):
233
235 """Dump the entire address space as a byte string."""
236 return self.fhandle.getvalue()
237