Example #1
0
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'
Example #2
0
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'
Example #3
0
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)
Example #4
0
            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)
Example #5
0
    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
Example #6
0
        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
Example #7
0
    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)
Example #8
0
    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)