package org.sinrel.engine.library; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtField; import javassist.CtMethod; import javassist.NotFoundException; import javassist.expr.ExprEditor; import javassist.expr.FieldAccess; import javassist.expr.NewExpr; import org.sinrel.engine.util.VirtualZipModifer; public final class PatchManager { protected static String class_joinserver = "ayh", class_checkserver = "iu"; protected static String methodname_joinserver, methodsign_joinserver; protected static String methodname_checkserver, methodsign_checkserver; public static void patchWorkDir(final VirtualZipModifer virtualJar, final ClassPool pool, final String workDir) throws Exception { final String sanDir = workDir.replace('\\', '/').replace("\"", "\\\""); CtClass clazz = pool.get("net.minecraft.client.Minecraft"); CtField[] fields = clazz.getDeclaredFields(); int i = 0; for (CtField f : fields) if (f.getSignature().equals("Ljava/io/File;")) if (++i == 2) { final String fieldname = f.getName(); clazz.instrument(new ExprEditor() { @Override public void edit(FieldAccess f) throws CannotCompileException { if (f.getFieldName() == fieldname && f.isWriter()) { f.replace("{" + fieldname + " = new java.io.File(\"" + sanDir + "\"); }"); } } }); break; } virtualJar.putClass(clazz); } public static void patchCheckJoinserver(final VirtualZipModifer virtualJar, final ClassPool classPool, final String version, final String joinserver, final String checkserver) throws Exception { CtClass dummy = classPool.makeClass("sle.Dummy"); dummy.addMethod(CtMethod.make("public static String bob(){return null;}", dummy)); if (class_joinserver != null) { CtClass netClientHandler = classPool.get(class_joinserver); CtMethod mtd = netClientHandler.getMethod(methodname_joinserver, methodsign_joinserver); mtd.instrument(new ExprEditor() { @Override public void edit(NewExpr e) throws CannotCompileException { if (e.getClassName().equals("java.net.URL")) { e.replace("{ $_ = new java.net.URL($1.indexOf(\'?\')!=-1 ? \"" + joinserver.replace("\"", "\\\"") + "\"+\"?mob=\"+sle.Dummy.bob()+\"&\"+$1.substring($1.indexOf(\'?\')+1) : $1); }"); } } }); virtualJar.putClass(netClientHandler); } if (class_checkserver != null) { CtClass threadLoginVerifer = classPool.get(class_checkserver); CtMethod mtd = threadLoginVerifer.getMethod(methodname_checkserver, methodsign_checkserver); mtd.instrument(new ExprEditor() { @Override public void edit(NewExpr e) throws CannotCompileException { if (e.getClassName().equals("java.net.URL")) { e.replace("{ $_ = new java.net.URL($1.indexOf(\'?\')!=-1 ? \"" + checkserver.replace("\"", "\\\"") + "\"+$1.substring($1.indexOf(\'?\')) : $1); }"); } } }); virtualJar.putClass(threadLoginVerifer); } dummy.detach(); try { CtClass rel = classPool.get("cpw.mods.fml.relauncher.FMLRelauncher"); CtMethod method = rel.getDeclaredMethod("relaunchApplet"); classPool.importPackage("java.security.ProtectionDomain"); classPool.importPackage("cpw.mods.fml.relauncher.ReflectionHelper"); method.insertBefore("Object cont=ReflectionHelper.getPrivateValue(ReflectionHelper.getClass(getClass().getClassLoader(),new String[] {\"java.awt.Component\"}),$1,new String[]{\"parent\"});" + "Class launcher=ReflectionHelper.getClass(getClass().getClassLoader(),new String[]{\"net.minecraft.Launcher\"}); \n" + "ReflectionHelper.findMethod(launcher,null,new String[]{\"addExtra\"},new Class[]{ClassLoader.class,ProtectionDomain.class}).invoke(cont,new Object[]{classLoader,getClass().getProtectionDomain()}); \n"); virtualJar.putClass(rel); } catch (NotFoundException ex) {} } }