forked from greatscottgadgets/facedancer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfacedancer-umass.py
More file actions
executable file
·108 lines (79 loc) · 2.87 KB
/
facedancer-umass.py
File metadata and controls
executable file
·108 lines (79 loc) · 2.87 KB
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
#!/usr/bin/env python3
#
# facedancer-umass.py
#
# Creating a disk image under linux:
#
# # fallocate -l 100M disk.img
# # fdisk disk.img
# # losetup -f --show disk.img
# # kpartx -a /dev/loopX
# # mkfs.XXX /dev/mapper/loopXpY
# # mount /dev/mapper/loopXpY /mnt/point
# do stuff on /mnt/point
# # umount /mnt/point
# # kpartx -d /dev/loopX
# # losetup -d /dev/loopX
import sys
from serial import Serial, PARITY_NONE
from facedancer import FacedancerUSBApp
from USBMassStorage import *
class RawDiskImage(DiskImage):
"""
Raw disk image backed by a file.
"""
def __init__(self, filename, block_size, verbose=0):
self.filename = filename
self.block_size = block_size
self.verbose = verbose
statinfo = os.stat(self.filename)
self.size = statinfo.st_size
self.file = open(self.filename, 'r+b')
self.image = mmap(self.file.fileno(), 0)
def close(self):
self.image.flush()
self.image.close()
def get_sector_count(self):
return int(self.size / self.block_size) - 1
def get_sector_data(self, address):
if self.verbose == 2:
print("<-- reading sector {}".format(address))
block_start = address * self.block_size
block_end = (address + 1) * self.block_size # slices are NON-inclusive
data = self.image[block_start:block_end]
if self.verbose > 3:
if not any(data):
print("<-- reading sector {} [all zeroes]".format(address))
else:
print("<-- reading sector {} [{}]".format(address, data))
return data
def put_data(self, address, data):
if self.verbose > 1:
blocks = int(len(data) / self.block_size)
print("--> writing {} blocks at lba {}".format(blocks, address))
super().put_data(address, data)
def put_sector_data(self, address, data):
if self.verbose == 2:
print("--> writing sector {}".format(address))
if len(data) > self.block_size:
print("WARNING: got {} bytes of sector data; expected a max of {}".format(len(data), self.block_size))
block_start = address * self.block_size
block_end = (address + 1) * self.block_size # slices are NON-inclusive
if self.verbose > 3:
if not any(data):
print("--> writing sector {} [all zeroes]".format(address))
else:
print("--> writing sector {} [{}]".format(address, data))
self.image[block_start:block_end] = data[:self.block_size]
self.image.flush()
if len(sys.argv)==1:
print("Usage: facedancer-umass.py disk.img");
sys.exit(1);
u = FacedancerUSBApp(verbose=3)
i = RawDiskImage(sys.argv[1], 512, verbose=3)
d = USBMassStorageDevice(u, i, verbose=3)
d.connect()
try:
d.run()
except KeyboardInterrupt:
d.disconnect()