forked from fortra/impacket
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathesentutl.py
executable file
·113 lines (94 loc) · 3.34 KB
/
esentutl.py
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env python
# SECUREAUTH LABS. Copyright 2018 SecureAuth Corporation. All rights reserved.
#
# This software is provided under under a slightly modified version
# of the Apache Software License. See the accompanying LICENSE file
# for more information.
#
# Description:
# ESE utility. Allows dumping catalog, pages and tables.
#
# Author:
# Alberto Solino (@agsolino)
#
#
# Reference for:
# Extensive Storage Engine (ese)
#
from __future__ import division
from __future__ import print_function
import sys
import logging
import argparse
from impacket.examples import logger
from impacket import version
from impacket.ese import ESENT_DB
def dumpPage(ese, pageNum):
data = ese.getPage(pageNum)
data.dump()
def exportTable(ese, tableName):
cursor = ese.openTable(tableName)
if cursor is None:
logging.error('Can"t get a cursor for table: %s' % tableName)
return
i = 1
print("Table: %s" % tableName)
while True:
try:
record = ese.getNextRow(cursor)
except Exception:
logging.debug('Exception:', exc_info=True)
logging.error('Error while calling getNextRow(), trying the next one')
continue
if record is None:
break
print("*** %d" % i)
for j in list(record.keys()):
if record[j] is not None:
print("%-30s: %r" % (j, record[j]))
i += 1
def main():
print(version.BANNER)
# Init the example's logger theme
logger.init()
parser = argparse.ArgumentParser(add_help = True, description = "Extensive Storage Engine utility. Allows dumping "
"catalog, pages and tables.")
parser.add_argument('databaseFile', action='store', help='ESE to open')
parser.add_argument('-debug', action='store_true', help='Turn DEBUG output ON')
parser.add_argument('-page', action='store', help='page to open')
subparsers = parser.add_subparsers(help='actions', dest='action')
# dump page
dump_parser = subparsers.add_parser('dump', help='dumps an specific page')
dump_parser.add_argument('-page', action='store', required=True, help='page to dump')
# info page
subparsers.add_parser('info', help='dumps the catalog info for the DB')
# export page
export_parser = subparsers.add_parser('export', help='dumps the catalog info for the DB')
export_parser.add_argument('-table', action='store', required=True, help='table to dump')
if len(sys.argv)==1:
parser.print_help()
sys.exit(1)
options = parser.parse_args()
if options.debug is True:
logging.getLogger().setLevel(logging.DEBUG)
else:
logging.getLogger().setLevel(logging.INFO)
ese = ESENT_DB(options.databaseFile)
try:
if options.action.upper() == 'INFO':
ese.printCatalog()
elif options.action.upper() == 'DUMP':
dumpPage(ese, int(options.page))
elif options.action.upper() == 'EXPORT':
exportTable(ese, options.table)
else:
raise Exception('Unknown action %s ' % options.action)
except Exception as e:
if logging.getLogger().level == logging.DEBUG:
import traceback
traceback.print_exc()
print(e)
ese.close()
if __name__ == '__main__':
main()
sys.exit(1)