mirror of
https://github.com/sashs/Ropper
synced 2026-06-08 17:20:46 +00:00
134 lines
4.0 KiB
Python
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')
|