示例#1
0
def disassembleSub(readTarget,
                   out,
                   targets,
                   roundtrip=False,
                   outputClassName=True):
    start_time = time.time()
    with out:
        for i, target in enumerate(targets):
            if isinstance(target, unicode):
                target = target.encode('utf8')
            print('processing target {}, {}/{} remaining'.format(
                target,
                len(targets) - i, len(targets)))

            data = readTarget(target)
            clsdata = ClassData(Reader(data))

            if outputClassName:
                name = clsdata.pool.getclsutf(clsdata.this)
            else:
                name = target.rpartition('.')[0] or target

            output = StringIO()
            # output = sys.stdout
            Disassembler(clsdata, output.write,
                         roundtrip=roundtrip).disassemble()

            filename = out.write(name, output.getvalue())
            if filename is not None:
                print('Class written to', filename)
                print(time.time() - start_time, ' seconds elapsed')
示例#2
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'
示例#3
0
def disassembleSub(readTarget,
                   out,
                   targets,
                   roundtrip=False,
                   outputClassName=True):
    start_time = time.time()
    with out:
        for i, target in enumerate(targets):
            print('processing target {}, {}/{} remaining'.format(
                target,
                len(targets) - i, len(targets)))

            data = readTarget(target)
            if not data.startswith(b'\xca\xfe\xba\xbe'):
                print(
                    'Warning! Skipping {} since it is not a valid classfile.'.
                    format(target))
                print('File begins with {!r}, expected {!r}'.format(
                    data[:4], b'\xca\xfe\xba\xbe'))
                continue

            clsdata = ClassData(Reader(data))

            if outputClassName:
                name = clsdata.pool.getclsutf(clsdata.this)
            else:
                name = target.rpartition('.')[0] or target

            output = StringIO()
            # output = sys.stdout
            Disassembler(clsdata, output.write,
                         roundtrip=roundtrip).disassemble()

            filename = out.write(name, output.getvalue())
            if filename is not None:
                print('Class written to', filename)
                print(time.time() - start_time, ' seconds elapsed')
示例#4
0
sys.path.append(p.abspath(p.join(project_dir, 'Krakatau')))

from Krakatau.assembler.disassembly import Disassembler
from Krakatau.classfileformat.reader import Reader
from Krakatau.classfileformat.classdata import ClassData
from io import StringIO

print("Generating files")

for f in java_files:
    name = f[:-5]

    def j_path(base_dir):
        return p.abspath(p.join(base_dir, name + ".j"))

    print("Generating {}".format(f))
    path = p.join(_java_dir, f)
    subprocess.call(['javac', path, '-d', javac_dir])
    javac_path = p.join(javac_dir, name + '.class')
    with open(j_path(javap_dir), 'w+') as p_file:
        subprocess.call(['javap', '-p', '-c', javac_path], stdout=p_file)
    with open(j_path(javap_v_dir), 'w+') as p_file:
        subprocess.call(['javap', '-p', '-c', '-v', javac_path], stdout=p_file)
    with open(javac_path, 'rb') as c_file:
        clsdata = ClassData(Reader(c_file.read()))
        output = StringIO()
        Disassembler(clsdata, output.write, roundtrip=False).disassemble()
        with open(j_path(krakatau_dir), 'w+') as p_file:
            p_file.write(output.getvalue())
示例#5
0
def initialize():
    global NEOW_CHOICES
    global ROOM_CHOICES
    global all_cards
    global all_relics
    global colors
    global all_potions

    with zipfile.ZipFile("../desktop-1.0.jar", 'r') as zf:
        # find NEOW_CHOICES in the class file.. because why not.
        namelist = zf.namelist()

        neow_fn = "com/megacrit/cardcrawl/neow/NeowReward$NeowRewardType.class"
        if neow_fn in namelist:
            with zf.open(neow_fn, 'r') as neow_file:
                raw_class = neow_file.read()

            clsdata = ClassData(Reader(raw_class))

            out = StringIO()
            disassembled = Disassembler(clsdata, out.write, roundtrip=False).disassemble()
            out.seek(0)

            for line in out:
                reg = re.match(r".*getstatic Field \[c4\] ([A-Z0-9_]*) \[u50\].*", line)

                if reg:
                    NEOW_CHOICES.append(reg.groups()[0])
            NEOW_CHOICES.append("")  # yeah, for real.
        else:
            print('neow data is not available')

        # to populate the 'room' dropdown we can make some assumptions based
        # on which files exist in the jar
        for pathfn in namelist:
            aslist = pathfn.split('/')
            if aslist[0] == "com":
                if aslist[1] == "megacrit":
                    # print(aslist)
                    if aslist[:4] == ["com", "megacrit", "cardcrawl", "rooms"]:
                        if "$" in aslist[-1] or not aslist[-1]:
                            continue

                        aslist[-1] = aslist[-1].split('.')[0]  # trim off .class extension
                        clean = ".".join(aslist)
                        ROOM_CHOICES.append(clean)

                    elif aslist[:4] == ["com", "megacrit", "cardcrawl", "cards"]:
                        if len(aslist) == 6:
                            color = aslist[4]
                            if color in ['deprecated', 'status', 'tempCards', 'optionCards']:
                                continue

                            colors.add(color)

                            card_name = aslist[5].split('.')[0]
                            if card_name:
                                with zf.open(pathfn) as card_file:
                                    raw_card = card_file.read()

                                clsdata = ClassData(Reader(raw_card))

                                out = StringIO()
                                disassembled = Disassembler(clsdata, out.write, roundtrip=False).disassemble()
                                out.seek(0)

                                cname_re = re.compile(r".*ldc '([-A-Za-z0-9_ ]*).*'")
                                ctype_re = re.compile(r".*AbstractCard\$CardType ([A-Z]*) .*")
                                crarity_re = re.compile(r".*AbstractCard\$CardRarity ([A-Z]*) .*")
                                ctarget_re = re.compile(r".*AbstractCard\$CardTarget ([A-Z]*) .*")

                                # if card_name == "Strike_Green":
                                #     print(out.read())
                                #     out.seek(0)

                                cname = None
                                ctype = None
                                crarity = None
                                ctarget = None
                                for line in out:
                                    found = False

                                    if cname is None:
                                        cname_match = cname_re.match(line)
                                        if cname_match:
                                            cname = cname_match[1]
                                            found = True

                                    if not found and ctype is None:
                                        ctype_match = ctype_re.match(line)
                                        if ctype_match:
                                            ctype = ctype_match[1]
                                            found = True

                                    if not found and crarity is None:
                                        ctype_match = crarity_re.match(line)
                                        if ctype_match:
                                            crarity = ctype_match[1]
                                            found = True

                                    if not found and ctarget is None:
                                        ctarget_match = ctarget_re.match(line)
                                        if ctarget_match:
                                            ctarget = ctarget_match[1]
                                            found = True

                                    #if not found:
                                    #    print(line)

                                all_cards[cname] = Card(card_name, cname, color, ctype, crarity, ctarget)
                                print(f"Found {all_cards[cname]}")

                    elif aslist[:4] == ["com", "megacrit", "cardcrawl", "relics"]:

                        if aslist[4] in ['deprecated', 'AbstractRelic.class']:
                            continue

                        # print(f'Relic found: {aslist[4]}')

                        if "$" in aslist[-1] or not aslist[-1]:
                            continue

                        tier_re = re.compile(r".*RelicTier ()([A-Z]*) .*")
                        name_re = re.compile(r".*ID Ljava/lang/String; = ([\"'])(.*)([\"']) \n")

                        with zf.open(pathfn) as card_file:
                            raw_card = card_file.read()

                            clsdata = ClassData(Reader(raw_card))

                            out = StringIO()
                            disassembled = Disassembler(clsdata, out.write, roundtrip=False).disassemble()
                            out.seek(0)

                            myvars = {}
                            for line in out:
                                # if "RelicTier" in line:
                                #     print(line)

                                found = False
                                for regexp, var in (
                                    (tier_re, 'tier'),
                                    (name_re, 'name')):

                                    if var not in myvars:
                                        rematch = regexp.match(line)
                                        if rematch:
                                            # print(f"{regexp} ?= {line}")
                                            myvars[var] = rematch[2]
                                            found = True

                            if "name" in myvars and "tier" in myvars:
                                r = Relic(myvars["name"], myvars["tier"])
                                # print(r)
                                all_relics[r.name] = r
                            else:
                                if "name" not in myvars:
                                    print(f'No matches for {name_re}')
                                if "tier" not in myvars:
                                    print(f'No matches for {tier_re}')

                    elif aslist[:4] == ["com", "megacrit", "cardcrawl", "potions"]:

                        if "$" in aslist[4] or aslist[4] in ['AbstractPotion.class']:
                            continue

                        name_re = re.compile(r".*ldc '([A-Za-z ]*)'.*")

                        with zf.open(pathfn) as potion_file:
                            raw_potion = potion_file.read()
                            try:
                                clsdata = ClassData(Reader(raw_potion))
                            except Krakatau.classfileformat.reader.TruncatedStreamError:
                                print(f'Invalid class file: {pathfn}')
                                continue

                            out = StringIO()
                            disassembled = Disassembler(clsdata, out.write, roundtrip=False).disassemble()
                            out.seek(0)

                            myvars = {}
                            for line in out:

                                found = False
                                for regexp, var in (
                                    (name_re, 'name'), ):

                                    if var not in myvars:
                                        rematch = regexp.match(line)
                                        if rematch:
                                            # print(f"{regexp} ?= {line}")
                                            myvars[var] = rematch[1]
                                            found = True

                            if "name" in myvars:
                                p = Potion(myvars["name"])
                                all_potions[p.name] = p
                            else:
                                if "name" not in myvars:
                                    print(f'No matches for {name_re}')