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')
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 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')
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())
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}')