-
-
Save bashkirtsevich/ed9611577348b9731320dea1dc96ba43 to your computer and use it in GitHub Desktop.
rawdisk python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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