1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """This file implements an xls renderer based on the openpyxl project.
23
24 We produce xls (Excel spreadsheet files) with the output from Rekall plugins.
25 """
26 import time
27 import openpyxl
28
29 from openpyxl import styles
30 from openpyxl.styles import colors
31 from openpyxl.styles import fills
32
33 from rekall import utils
34 from rekall.ui import renderer
35 from rekall.ui import text
36
37
38
39
40 HEADER_STYLE = styles.Style(font=styles.Font(bold=True))
41 SECTION_STYLE = styles.Style(
42 fill=styles.PatternFill(
43 fill_type=fills.FILL_SOLID, start_color=styles.Color(colors.RED)))
44 FORMAT_STYLE = styles.Style(
45 alignment=styles.Alignment(vertical="top", wrap_text=False))
46
47
49 """By default the XLS renderer delegates to the text renderer."""
50 renders_type = "object"
51 renderers = ["XLSRenderer"]
52
53 STYLE = None
54
58
60 cell = worksheet.cell(
61 row=worksheet.current_row, column=worksheet.current_column)
62
63 cell.value = column.name
64 cell.style = HEADER_STYLE
65
66
67 worksheet.current_column += 1
68
69 - def RenderCell(self, value, worksheet, **options):
70
71 cell = worksheet.cell(
72 row=worksheet.current_row, column=worksheet.current_column)
73 cell.value = self.GetData(value, **options)
74 if self.STYLE:
75 cell.style = self.STYLE
76
77
78 worksheet.current_column += 1
79
80 - def GetData(self, value, **options):
81 if isinstance(value, (int, float, long)):
82 return value
83
84 return unicode(self._GetDelegateObjectRenderer(value).render_row(
85 value, **options))
86
87
89
90 - def __init__(self, type=None, table=None, renderer=None, session=None,
91 **options):
98
99
101 column_class = XLSColumn
102
116
117 - def render_row(self, row=None, highlight=None, **options):
132
133
135 """A Renderer for xls files."""
136
137 name = "xls"
138
139 table_class = XLSTable
140 tablesep = ""
141
142 - def __init__(self, output=None, **kwargs):
143 super(XLSRenderer, self).__init__(**kwargs)
144
145
146
147
148 self.delegate_text_renderer = text.TextRenderer(session=self.session)
149
150 self.output = output or self.session.GetParameter("output")
151
152
153
154 if self.output == None:
155 self.output = "%s.xls" % time.ctime()
156
157 try:
158 self.wb = openpyxl.load_workbook(self.output)
159 self.current_ws = self.wb.create_sheet()
160 except IOError:
161 self.wb = openpyxl.Workbook()
162 self.current_ws = self.wb.active
163
164 - def start(self, plugin_name=None, kwargs=None):
165 super(XLSRenderer, self).start(plugin_name=plugin_name, kwargs=kwargs)
166
167
168 if self.current_ws is None:
169 self.current_ws = self.wb.create_sheet()
170
171 ws = self.current_ws
172 ws.title = plugin_name or ""
173 ws.current_row = 1
174 ws.current_column = 1
175
176 return self
177
183
184 - def section(self, name=None, **_):
185 ws = self.current_ws
186 for i in range(10):
187 cell = ws.cell(row=ws.current_row, column=i + 1)
188 if i == 0:
189 cell.value = name
190
191 cell.style = SECTION_STYLE
192
193 ws.current_row += 1
194 ws.current_column = 1
195
212
217
218
219
220
221
223 """Expands an EPROCESS into three columns (address, name and PID)."""
224 renders_type = "_EPROCESS"
225
227 for heading in ["_EPROCESS", "Name", "PID"]:
228 cell = worksheet.cell(
229 row=worksheet.current_row, column=worksheet.current_column)
230 cell.value = heading
231 cell.style = HEADER_STYLE
232
233 worksheet.current_column += 1
234
235 - def RenderCell(self, item, worksheet, **options):
240
241
243 renders_type = "String"
244
246 return utils.SmartStr(item)
247
248
250 """Hex format struct's offsets."""
251 renders_type = "Struct"
252
254 return "%#x" % item.obj_offset
255
256
258 """Renders the address of the pointer target as a hex string."""
259 renders_type = "Pointer"
260
262 result = item.v()
263 if result == None:
264 return "-"
265
266 return "%#x" % result
267
268
270 """Renders native types as python objects."""
271 renders_type = "NativeType"
272
273 - def GetData(self, item, **options):
274 result = item.v()
275 if result != None:
276 return result
277
278
281
282
284 renders_type = "NoneObject"
285
287 _ = item
288 return "-"
289
290
292 """Renders timestamps as python datetime objects."""
293 renders_type = "UnixTimeStamp"
294 STYLE = styles.Style(number_format='MM/DD/YYYY HH:MM:SS')
295
296 - def GetData(self, item, **options):
297 if item.v() == 0:
298 return None
299
300 return item.as_datetime()
301