use of org.mapleir.asm.ClassNode in project maple-ir by LLVM-but-worse.
the class RunCommand method dumpJar.
private void dumpJar(ApplicationClassSource app, SingleJarDownloader<ClassNode> dl, PassGroup masterGroup, String outputFile) throws IOException {
(new CompleteResolvingJarDumper(dl.getJarContents(), app) {
@Override
public int dumpResource(JarOutputStream out, String name, byte[] file) throws IOException {
// }
if (name.equals("META-INF/MANIFEST.MF")) {
ClassRenamerPass renamer = (ClassRenamerPass) masterGroup.getPass(e -> e.is(ClassRenamerPass.class));
if (renamer != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos));
BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(file)));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(": ", 2);
if (parts.length != 2) {
bw.write(line);
continue;
}
if (parts[0].equals("Main-Class")) {
String newMain = renamer.getRemappedName(parts[1].replace(".", "/")).replace("/", ".");
logger.print(String.format("%s -> %s%n", parts[1], newMain));
parts[1] = newMain;
}
bw.write(parts[0]);
bw.write(": ");
bw.write(parts[1]);
bw.write(System.lineSeparator());
}
br.close();
bw.close();
file = baos.toByteArray();
}
}
return super.dumpResource(out, name, file);
}
}).dump(new File(outputFile));
}
use of org.mapleir.asm.ClassNode in project maple-ir by LLVM-but-worse.
the class Boot method dumpJar.
private static void dumpJar(ApplicationClassSource app, SingleJarDownloader<ClassNode> dl, PassGroup masterGroup, String outputFile) throws IOException {
(new CompleteResolvingJarDumper(dl.getJarContents(), app) {
@Override
public int dumpResource(JarOutputStream out, String name, byte[] file) throws IOException {
// }
if (name.equals("META-INF/MANIFEST.MF")) {
ClassRenamerPass renamer = (ClassRenamerPass) masterGroup.getPass(e -> e.is(ClassRenamerPass.class));
if (renamer != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos));
BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(file)));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(": ", 2);
if (parts.length != 2) {
bw.write(line);
continue;
}
if (parts[0].equals("Main-Class")) {
String newMain = renamer.getRemappedName(parts[1].replace(".", "/")).replace("/", ".");
LOGGER.info(String.format("%s -> %s%n", parts[1], newMain));
parts[1] = newMain;
}
bw.write(parts[0]);
bw.write(": ");
bw.write(parts[1]);
bw.write(System.lineSeparator());
}
br.close();
bw.close();
file = baos.toByteArray();
}
}
return super.dumpResource(out, name, file);
}
}).dump(new File(outputFile));
}
use of org.mapleir.asm.ClassNode in project maple-ir by LLVM-but-worse.
the class Boot method main.
public static void main(String[] args) throws Exception {
sections = new LinkedList<>();
logging = true;
// Load input jar
// File f = locateRevFile(135);
File f = new File(args[0]);
section("Preparing to run on " + f.getAbsolutePath());
SingleJarDownloader<ClassNode> dl = new SingleJarDownloader<>(new JarInfo(f));
dl.download();
String appName = f.getName().substring(0, f.getName().length() - 4);
ApplicationClassSource app = new ApplicationClassSource(appName, dl.getJarContents().getClassContents());
//
// ApplicationClassSource app = new ApplicationClassSource("test", ClassHelper.parseClasses(CGExample.class));
// app.addLibraries(new InstalledRuntimeClassSource(app));
File rtjar = new File(System.getProperty("java.home"), "lib/rt.jar");
// File androidjar = new File("res/android.jar");
app.addLibraries(rt(app, rtjar));
section("Initialising context.");
IRCache irFactory = new IRCache(ControlFlowGraphBuilder::build);
AnalysisContext cxt = new BasicAnalysisContext.BasicContextBuilder().setApplication(app).setInvocationResolver(new DefaultInvocationResolver(app)).setCache(irFactory).setApplicationContext(new SimpleApplicationContext(app)).setDataFlowAnalysis(new LiveDataFlowAnalysisImpl(irFactory)).build();
section("Expanding callgraph and generating cfgs.");
for (ClassNode cn : cxt.getApplication().iterate()) {
// continue;
for (MethodNode m : cn.getMethods()) {
// if (!m.getName().equals("setRccState"))
// continue;
cxt.getIRCache().getFor(m);
}
}
section0("...generated " + cxt.getIRCache().size() + " cfgs in %fs.%n", "Preparing to transform.");
// do passes
PassGroup masterGroup = new PassGroup("MasterController");
for (IPass p : getTransformationPasses()) {
masterGroup.add(p);
}
run(cxt, masterGroup);
section0("...done transforming in %fs.%n", "Preparing to transform.");
for (Entry<MethodNode, ControlFlowGraph> e : cxt.getIRCache().entrySet()) {
MethodNode mn = e.getKey();
ControlFlowGraph cfg = e.getValue();
try {
cfg.verify();
} catch (Exception ex) {
ex.printStackTrace();
}
}
section("Retranslating SSA IR to standard flavour.");
for (Entry<MethodNode, ControlFlowGraph> e : cxt.getIRCache().entrySet()) {
MethodNode mn = e.getKey();
// if (!mn.getName().equals("openFiles"))
// continue;
ControlFlowGraph cfg = e.getValue();
// CFGUtils.easyDumpCFG(cfg, "pre-destruct");
try {
cfg.verify();
} catch (Exception ex) {
ex.printStackTrace();
}
BoissinotDestructor.leaveSSA(cfg);
// CFGUtils.easyDumpCFG(cfg, "pre-reaalloc");
LocalsReallocator.realloc(cfg);
// System.out.println(cfg);
try {
cfg.verify();
} catch (Exception ex) {
ex.printStackTrace();
}
// System.out.println("Rewriting " + mn.getName());
(new ControlFlowGraphDumper(cfg, mn)).dump();
// System.out.println(InsnListUtils.insnListToString(mn.instructions));
}
section("Rewriting jar.");
dumpJar(app, dl, masterGroup, "out/rewritten.jar");
section("Finished.");
}
use of org.mapleir.asm.ClassNode in project maple-ir by LLVM-but-worse.
the class DataFlowDemoBoot method rt.
private static LibraryClassSource rt(ApplicationClassSource app, File rtjar) throws IOException {
section("Loading " + rtjar.getName() + " from " + rtjar.getAbsolutePath());
SingleJarDownloader<ClassNode> dl = new SingleJarDownloader<>(new JarInfo(rtjar));
dl.download();
return new LibraryClassSource(app, dl.getJarContents().getClassContents());
}
use of org.mapleir.asm.ClassNode in project maple-ir by LLVM-but-worse.
the class Boot2 method dumpJar.
private static void dumpJar(ApplicationClassSource app, SingleJarDownloader<ClassNode> dl, PassGroup masterGroup, String outputFile) throws IOException {
(new CompleteResolvingJarDumper(dl.getJarContents(), app) {
@Override
public int dumpResource(JarOutputStream out, String name, byte[] file) throws IOException {
// }
if (name.equals("META-INF/MANIFEST.MF")) {
ClassRenamerPass renamer = (ClassRenamerPass) masterGroup.getPass(e -> e.is(ClassRenamerPass.class));
if (renamer != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos));
BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(file)));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(": ", 2);
if (parts.length != 2) {
bw.write(line);
continue;
}
if (parts[0].equals("Main-Class")) {
String newMain = renamer.getRemappedName(parts[1].replace(".", "/")).replace("/", ".");
LOGGER.info(String.format("%s -> %s%n", parts[1], newMain));
parts[1] = newMain;
}
bw.write(parts[0]);
bw.write(": ");
bw.write(parts[1]);
bw.write(System.lineSeparator());
}
br.close();
bw.close();
file = baos.toByteArray();
}
}
return super.dumpResource(out, name, file);
}
}).dump(new File(outputFile));
}
Aggregations