Files
2018-12-20 16:09:19 +01:00

134 lines
4.0 KiB
Python

# coding=utf-8
# Copyright 2018 Sascha Schirra
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" A ND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from .coloredstring import *
import ropper
import re
import sys
def getFileNameFromPath(path):
if '/' in path:
name = path.split('/')[-1]
elif '\\' in path:
name = path.split('\\')[-1]
else:
name = path
return name
def isHex(num):
return re.match('^0x[0-9A-Fa-f]+$', num) != None
def toHex(number, length=4):
t = 0xff
for i in range(length-1):
t <<= 8
t |= 0xff
number = int(number) & t
return ('0x%.' + str(length * 2) + 'x') % number
def printTableHeader( string):
print('\n')
print(string)
print('=' * len(string))
print('')
def createFmtString(rows, cnames, space):
scount = []
for cname in cnames:
scount.append(len(cname)+space)
for row in rows:
for idx in range(len(scount)):
new = len(cstr(row[idx])) + space
scount[idx] = max(scount[idx], new)
return str('%-{}s' * len(scount)).format(*scount)
def printTable(header, cnames, data, space=2, fmt=None):
ccount = len(cnames)
if not fmt:
fmt = createFmtString(data, cnames, space)
printTableHeader(header)
cnamelines = []
for cname in cnames:
if isinstance(cname, cstr):
cnamelines.append(cstr('-' * cname.rawlength(), cname.color))
else:
cnamelines.append('-' * len(cname))
print(fmt % cnames)
print(fmt % tuple(cnamelines))
for row in data:
line = fmt % row
print(line.strip())
print('')
def printHexFormat(data, addr, nocolor=False):
for i in range((int(len(data)/16))+1):
part = data[i*16:i*16+16]
bytes = cstr('')
c = 0
for j in range(0,len(part),2):
if j == len(part)-1:
bytes += cstr(('%.2x ' % tuple(part[j:j+1])), Color.WHITE if c % 2 else Color.LIGHT_GRAY)
else:
bytes += cstr(('%.2x%.2x ' % tuple(part[j:j+2])), Color.WHITE if c % 2 else Color.LIGHT_GRAY)
c += 1
string = ''
if nocolor:
if len(bytes) < 40:
bytes += ' ' * (40 - len(bytes))
else:
if len(bytes) < 227:
bytes += ' ' * ((8-int(len(bytes)/29)) *5)
for b in part:
if b < 32 or b > 126:
string += '.'
else:
string += chr(b)
bytes += ' ' + cstr(string, Color.BLUE)
print(cstr(toHex(addr + i*16), Color.RED) +': ' + bytes)
def isWindows():
return sys.platform.lower().startswith('win')