package net.scapeemulator.asm.bundler; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.security.NoSuchAlgorithmException; import net.scapeemulator.asm.bundler.trans.CachePathTransformer; import net.scapeemulator.asm.bundler.trans.FileTransformer; import net.scapeemulator.asm.bundler.trans.HostnameTransformer; import net.scapeemulator.asm.bundler.trans.RsaTransformer; import net.scapeemulator.asm.bundler.trans.Transformer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class ClientBundler { private static final Logger logger = LoggerFactory.getLogger(ClientBundler.class); public static void main(String[] args) throws IOException, NoSuchAlgorithmException { ClientBundler bundler = new ClientBundler(); bundler.bundle(); } public void bundle() throws IOException, NoSuchAlgorithmException { /* unpack source jars */ logger.info("Starting client bundler..."); Application client = Application.unpackJar(new File("data/asm/runescape.jar")); Application glClient = Application.unpack200(new File("data/asm/runescape_gl.pack200")); Application loader = Application.unpackJar(new File("data/www/loader.jar")); Application glLoader = Application.unpackJar(new File("data/www/loader_gl.jar")); Application jogl = Application.unpackJar(new File("data/asm/jogl.jar")); /* update client RSA keys */ logger.info("Transforming RSA keys..."); Transformer transformer = new RsaTransformer(); client.transform(transformer); glClient.transform(transformer); /* remove hostname protection */ logger.info("Transforming hostname protection..."); transformer = new HostnameTransformer(); client.transform(transformer); glClient.transform(transformer); /* write everything but the loaders back out */ logger.info("Bundling clients and libraries..."); File clientOut = new File("data/game/jaggrab/runescape.pack200"); File glClientOut = new File("data/game/jaggrab/runescape_gl.pack200"); File joglOut = new File("data/game/jaggrab/jogl.pack200"); client.packJar(new File("data/game/jaggrab/runescape.jar")); // unsigned client output client.pack200(clientOut); glClient.pack200(glClientOut); jogl.pack200(joglOut); /* compute SHA1 checksums */ logger.info("Computing SHA1 checksums and file sizes..."); Resource[] resources = new Resource[] { Resource.create(new File("data/asm/game_unpacker.dat")), Resource.create(clientOut), Resource.NULL }; Resource[] glResources = new Resource[] { Resource.create(new File("data/asm/game_unpacker.dat")), Resource.create(glClientOut), Resource.NULL, Resource.create(joglOut), Resource.NULL, Resource.create(new File("data/asm/windows-x86/jogl.dll")), Resource.create(new File("data/asm/windows-x86/jogl_awt.dll")), Resource.create(new File("data/asm/windows-amd64/jogl.dll")), Resource.create(new File("data/asm/windows-amd64/jogl_awt.dll")), Resource.create(new File("data/asm/linux-x86/libjogl.so")), Resource.create(new File("data/asm/linux-x86/libjogl_awt.so")), Resource.create(new File("data/asm/linux-x86/libgluegen-rt.so")), Resource.create(new File("data/asm/linux-amd64/libjogl.so")), Resource.create(new File("data/asm/linux-amd64/libjogl_awt.so")), Resource.create(new File("data/asm/linux-amd64/libgluegen-rt.so")), Resource.create(new File("data/asm/mac-ppc/libjogl.jnilib")), Resource.create(new File("data/asm/mac-ppc/libjogl_awt.jnilib")), Resource.create(new File("data/asm/mac-universal/libjogl.jnilib")), Resource.create(new File("data/asm/mac-universal/libjogl_awt.jnilib")), Resource.create(new File("data/asm/solaris-amd64/libjogl.so")), Resource.create(new File("data/asm/solaris-amd64/libjogl_awt.so")), Resource.create(new File("data/asm/solaris-amd64/libgluegen-rt.so")), Resource.create(new File("data/asm/solaris-sparcv9/libjogl.so")), Resource.create(new File("data/asm/solaris-sparcv9/libjogl_awt.so")), Resource.create(new File("data/asm/solaris-sparcv9/libgluegen-rt.so")), Resource.create(new File("data/asm/solaris-sparc/libjogl.so")), Resource.create(new File("data/asm/solaris-sparc/libjogl_awt.so")), Resource.create(new File("data/asm/solaris-sparc/libgluegen-rt.so")), Resource.create(new File("data/asm/solaris-x86/libjogl.so")), Resource.create(new File("data/asm/solaris-x86/libjogl_awt.so")), Resource.create(new File("data/asm/solaris-x86/libgluegen-rt.so")) }; /* update SHA1 checksums in the loader */ logger.info("Transforming SHA1 checksums and file sizes..."); transformer = new FileTransformer(resources); loader.transform(transformer); transformer = new FileTransformer(glResources); glLoader.transform(transformer); /* transform cache path */ logger.info("Transforming cache path..."); transformer = new CachePathTransformer(); loader.transform(transformer); glLoader.transform(transformer); /* write the loaders back out */ logger.info("Bundling loaders..."); loader.packJar(new File("data/game/www/loader.jar")); glLoader.packJar(new File("data/game/www/loader_gl.jar")); /* copy natives/unpacker */ logger.info("Copying native libraries and game unpacker..."); copy("data/asm/game_unpacker.dat", "data/game/jaggrab/unpackclass.pack"); copy("data/asm/windows-x86/jogl.dll", "data/game/jaggrab/jogl_0_0.lib"); copy("data/asm/windows-x86/jogl_awt.dll", "data/game/jaggrab/jogl_0_1.lib"); copy("data/asm/windows-amd64/jogl.dll", "data/game/jaggrab/jogl_1_0.lib"); copy("data/asm/windows-amd64/jogl_awt.dll", "data/game/jaggrab/jogl_1_1.lib"); copy("data/asm/linux-x86/libjogl.so", "data/game/jaggrab/jogl_2_0.lib"); copy("data/asm/linux-x86/libjogl_awt.so", "data/game/jaggrab/jogl_2_1.lib"); copy("data/asm/linux-x86/libgluegen-rt.so", "data/game/jaggrab/jogl_2_2.lib"); copy("data/asm/linux-amd64/libjogl.so", "data/game/jaggrab/jogl_3_0.lib"); copy("data/asm/linux-amd64/libjogl_awt.so", "data/game/jaggrab/jogl_3_1.lib"); copy("data/asm/linux-amd64/libgluegen-rt.so", "data/game/jaggrab/jogl_3_2.lib"); copy("data/asm/mac-ppc/libjogl.jnilib", "data/game/jaggrab/jogl_4_0.lib"); copy("data/asm/mac-ppc/libjogl_awt.jnilib", "data/game/jaggrab/jogl_4_1.lib"); copy("data/asm/mac-universal/libjogl.jnilib", "data/game/jaggrab/jogl_5_0.lib"); copy("data/asm/mac-universal/libjogl_awt.jnilib", "data/game/jaggrab/jogl_5_1.lib"); copy("data/asm/solaris-amd64/libjogl.so", "data/game/jaggrab/jogl_6_0.lib"); copy("data/asm/solaris-amd64/libjogl_awt.so", "data/game/jaggrab/jogl_6_1.lib"); copy("data/asm/solaris-amd64/libgluegen-rt.so", "data/game/jaggrab/jogl_6_2.lib"); copy("data/asm/solaris-sparcv9/libjogl.so", "data/game/jaggrab/jogl_7_0.lib"); copy("data/asm/solaris-sparcv9/libjogl_awt.so", "data/game/jaggrab/jogl_7_1.lib"); copy("data/asm/solaris-sparcv9/libgluegen-rt.so", "data/game/jaggrab/jogl_7_2.lib"); copy("data/asm/solaris-sparc/libjogl.so", "data/game/jaggrab/jogl_8_0.lib"); copy("data/asm/solaris-sparc/libjogl_awt.so", "data/game/jaggrab/jogl_8_1.lib"); copy("data/asm/solaris-sparc/libgluegen-rt.so", "data/game/jaggrab/jogl_8_2.lib"); copy("data/asm/solaris-x86/libjogl.so", "data/game/jaggrab/jogl_9_0.lib"); copy("data/asm/solaris-x86/libjogl_awt.so", "data/game/jaggrab/jogl_9_1.lib"); copy("data/asm/solaris-x86/libgluegen-rt.so", "data/game/jaggrab/jogl_9_2.lib"); /* sign loaders */ logger.info("Signing loaders..."); Runtime.getRuntime().exec("jarsigner -keystore data/asm/scapeemu.keystore -storepass scapeemu data/game/www/loader.jar scapeemu"); Runtime.getRuntime().exec("jarsigner -keystore data/asm/scapeemu.keystore -storepass scapeemu data/game/www/loader_gl.jar scapeemu"); /* all done! */ logger.info("Client bundler completed successfully."); } private void copy(String srcPath, String destPath) throws IOException { Path src = new File(srcPath).toPath(); Path dest = new File(destPath).toPath(); Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING); } }