def disassembleClass(readTarget, targets=None, outpath=None, roundtrip=False): out = script_util.makeWriter(outpath, '.j') start_time = time.time() with out: for i, target in enumerate(targets): print 'processing target {}, {}/{} remaining'.format(target.encode('utf8'), len(targets)-i, len(targets)) data = readTarget(target) clsdata = ClassData(Reader(data)) name = clsdata.pool.getclsutf(clsdata.this) output = StringIO.StringIO() # output = sys.stdout Disassembler(clsdata, output.write, roundtrip=roundtrip).disassemble() filename = out.write(name, output.getvalue()) print 'Class written to', filename.encode('utf8') print time.time() - start_time, ' seconds elapsed'
def disassembleClass(readTarget, targets=None, outpath=None, printCPool=False): out = script_util.makeWriter(outpath, '.j') # targets = targets[::-1] start_time = time.time() # __import__('random').shuffle(targets) with out: for i,target in enumerate(targets): print 'processing target {}, {}/{} remaining'.format(target.encode('utf8'), len(targets)-i, len(targets)) data = readTarget(target) stream = Krakatau.binUnpacker.binUnpacker(data=data) class_ = ClassFile(stream) class_.loadElements(keepRaw=True) source = Krakatau.assembler.disassembler.disassemble(class_, printCPool=printCPool) filename = out.write(class_.name, source) print 'Class written to', filename.encode('utf8') print time.time() - start_time, ' seconds elapsed'
def decompileClass(path=[], targets=None, outpath=None, skip_errors=False, rename_classes=None, add_throws=False): out = script_util.makeWriter(outpath, '.java') e = Environment() for part in path: e.addToPath(part) start_time = time.time() # random.shuffle(targets) with e, out: print rename_classes if rename_classes is None: printer = visitor.DefaultVisitor() else: printer = visitor.RenameClassesVisitor(targets, rename_classes) for i,target in enumerate(targets): print 'processing target {}, {} remaining'.format(target.encode('utf8'), len(targets)-i) try: c = e.getClass(target) source = printer.visit(javaclass.generateAST(c, makeGraph, skip_errors, add_throws=add_throws)) except Exception as err: if not skip_errors: raise if isinstance(err, ClassLoaderError): print 'Failed to decompile {} due to missing or invalid class {}'.format(target.encode('utf8'), err.data.encode('utf8')) else: import traceback print traceback.format_exc() continue #The single class decompiler doesn't add package declaration currently so we add it here if '/' in target: package = 'package {};\n\n'.format(target.replace('/','.').rpartition('.')[0]) source = package + source filename = out.write(printer.className(c.name), source) print 'Class written to', filename.encode('utf8') print time.time() - start_time, ' seconds elapsed' deleteUnusued(c)
filename = out.write(name, output.getvalue()) if filename is not None: print('Class written to', filename) print(time.time() - start_time, ' seconds elapsed') if __name__== "__main__": print(script_util.copyright) import argparse parser = argparse.ArgumentParser(description='Krakatau decompiler and bytecode analysis tool') parser.add_argument('-out', help='Path to generate files in') parser.add_argument('-r', action='store_true', help="Process all files in the directory target and subdirectories") parser.add_argument('-path', help='Jar to look for class in') parser.add_argument('-roundtrip', action='store_true', help='Create assembly file that can roundtrip to original binary.') parser.add_argument('target', help='Name of class or jar file to decompile') args = parser.parse_args() targets = script_util.findFiles(args.target, args.r, '.class') jar = args.path if jar is None and args.target.endswith('.jar'): jar = args.target out = script_util.makeWriter(args.out, '.j') if jar is not None: with zipfile.ZipFile(jar, 'r') as archive: readFunc = functools.partial(readArchive, archive) disassembleSub(readFunc, out, targets, roundtrip=args.roundtrip) else: disassembleSub(readFile, out, targets, roundtrip=args.roundtrip, outputClassName=False)
with open(filename, 'rU') as f: source = f.read() source = source.replace('\t', ' ') + '\n' return list(parse.assemble(source, basename, fatal=fatal)) if __name__== "__main__": import argparse parser = argparse.ArgumentParser(description='Krakatau bytecode assembler') parser.add_argument('-out', help='Path to generate files in') parser.add_argument('-r', action='store_true', help="Process all files in the directory target and subdirectories") parser.add_argument('-q', action='store_true', help="Only display warnings and errors") parser.add_argument('target', help='Name of file to assemble') args = parser.parse_args() log = script_util.Logger('warning' if args.q else 'info') log.info(script_util.copyright) out = script_util.makeWriter(args.out, '.class') targets = script_util.findFiles(args.target, args.r, '.j') start_time = time.time() with out: for i, target in enumerate(targets): log.info('Processing file {}, {}/{} remaining'.format(target, len(targets)-i, len(targets))) pairs = assembleClass(target) for name, data in pairs: filename = out.write(name, data) log.info('Class written to', filename) print 'Total time', time.time() - start_time
source = f.read() return assembleSource(source, basename) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Krakatau bytecode assembler") parser.add_argument("-out", help="Path to generate files in") parser.add_argument("-r", action="store_true", help="Process all files in the directory target and subdirectories") parser.add_argument("-q", action="store_true", help="Only display warnings and errors") parser.add_argument("target", help="Name of file to assemble") args = parser.parse_args() log = script_util.Logger("warning" if args.q else "info") log.info(script_util.copyright) out = script_util.makeWriter(args.out, ".class") targets = script_util.findFiles(args.target, args.r, ".j") start_time = time.time() with out: for i, target in enumerate(targets): log.info("Processing file {}, {}/{} remaining".format(target, len(targets) - i, len(targets))) pairs = assembleClass(target) for name, data in pairs: filename = out.write(name, data) log.info("Class written to", filename) print "Total time", time.time() - start_time
parser = argparse.ArgumentParser(description='Krakatau bytecode assembler') parser.add_argument('-out', help='Path to generate files in') parser.add_argument( '-r', action='store_true', help="Process all files in the directory target and subdirectories") parser.add_argument('-q', action='store_true', help="Only display warnings and errors") parser.add_argument('target', help='Name of file to assemble') args = parser.parse_args() log = script_util.Logger('warning' if args.q else 'info') log.info(script_util.copyright) out = script_util.makeWriter(args.out, '.class') targets = script_util.findFiles(args.target, args.r, '.j') start_time = time.time() with out: for i, target in enumerate(targets): log.info('Processing file {}, {}/{} remaining'.format( target, len(targets) - i, len(targets))) pairs = assembleClass(target) for name, data in pairs: filename = out.write(name, data) log.info('Class written to', filename) print('Total time', time.time() - start_time)
parser.add_argument( '-r', action='store_true', help="Process all files in the directory target and subdirectories") parser.add_argument('-path', help='Jar to look for class in') parser.add_argument( '-roundtrip', action='store_true', help='Create assembly file that can roundtrip to original binary.') parser.add_argument('target', help='Name of class or jar file to disassemble') args = parser.parse_args() targets = script_util.findFiles(args.target, args.r, '.class') jar = args.path if jar is None and args.target.endswith('.jar'): jar = args.target out = script_util.makeWriter(args.out, '.j') if jar is not None: with zipfile.ZipFile(jar, 'r') as archive: readFunc = functools.partial(readArchive, archive) disassembleSub(readFunc, out, targets, roundtrip=args.roundtrip) else: disassembleSub(readFile, out, targets, roundtrip=args.roundtrip, outputClassName=False)