Skip to content

Instantly share code, notes, and snippets.

@bashkirtsevich
Forked from blaquee/readdisk.py
Created September 29, 2019 10:52
Show Gist options
  • Save bashkirtsevich/ed9611577348b9731320dea1dc96ba43 to your computer and use it in GitHub Desktop.
Save bashkirtsevich/ed9611577348b9731320dea1dc96ba43 to your computer and use it in GitHub Desktop.
rawdisk python
import os
import sys
SECTOR_SIZE = 512
def main():
try:
if len(sys.argv) != 4:
raise Exception('Not Enough Arguments')
else:
program(sys.argv[1], int(sys.argv[2]), int(sys.argv[3]))
except Exception, error:
print os.path.basename(sys.argv[0]), '<drive> <first> <last>'
print 'Note:', error
def program(drive, first, last):
if first > last:
first, last = last, first
data = get_data(drive, first, last)
sectors = partition(data, SECTOR_SIZE)
show_hex(first, last, sectors)
def get_data(drive, first, last):
if os.name == 'posix':
drive = file('/dev/' + drive)
elif os.name == 'nt':
drive = file(r'\\.\%s:' % drive)
else:
raise Exception('Do Not Know How To Access Drives')
return read_all(drive, first, last - first + 1)
def read_all(drive, start_sector, sectors_to_read):
start = start_sector * SECTOR_SIZE
end = sectors_to_read * SECTOR_SIZE
all_data = ''
while start > 0:
temp = drive.read(start)
if not temp:
temp = drive.read(start)
if not temp:
raise Exception('Cannot Read First Sector')
start -= len(temp)
assert start == 0
while end > 0:
temp = drive.read(end)
if not temp:
temp = drive.read(end)
if not temp:
if not all_data:
raise Exception('Cannot Find Requested Data')
return all_data
all_data += temp
end -= len(temp)
assert end == 0
return all_data
def partition(string, size):
if len(string) % size:
parts = len(string) / size + 1
else:
parts = len(string) / size
return [string[index*size:index*size+size] for index in range(parts)]
def show_hex(first, last, sectors):
print '=' * 77
for index in range(len(sectors)):
print 'SECTOR', index + first
print '=' * 77
engine(sectors[index], index + first)
print '=' * 77
def engine(string, sector):
parts = partition(string, 16)
rule = printable()
for index in range(len(parts)):
print ' | '.join([hex(index + sector * 32)[2:].upper().zfill(7)[-7:] + '0', \
pad_right(convert_hex(parts[index]), 47), \
convert_print(parts[index], rule)])
def printable():
return ''.join([chr(byte) for byte in range(256) \
if len(repr(chr(byte))) == 3 or byte == ord('\\')])
def pad_right(string, length, padding=' '):
return string + padding[0] * (length - len(string))
def convert_hex(string):
return ' '.join([hex(ord(character))[2:].upper().zfill(2) \
for character in string])
def convert_print(string, rule):
return ''.join([character in rule and character \
or '.' for character in string])
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment