private static HashMap unpackRunescape(File jarFile) throws Exception { int size = (int) jarFile.length(); RandomAccessFile raf = new RandomAccessFile(jarFile, "rw"); byte jarFileBuffer[] = new byte[size]; raf.readFully(jarFileBuffer); ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream( unscrambler(jarFileBuffer))); ArrayList ClassGens = new ArrayList(30); byte classFileBuffer[] = new byte[1000]; ZipEntry entry = null; Project p = new Project(); while ((entry = zis.getNextEntry()) != null) { String name = entry.getName(); final String fileExtension = ".class"; if (!name.endsWith(fileExtension)) { continue; } name = name.replace(fileExtension, ""); ByteArrayOutputStream bos = new ByteArrayOutputStream(); int readlength = 0; while ((readlength = zis.read(classFileBuffer, 0, classFileBuffer.length)) != -1) { bos.write(classFileBuffer, 0, readlength); } ClassGens.add(p.loadClass(new ByteArrayInputStream(bos .toByteArray()))); } HashMap hm = new HashMap(); for (int i = 0; i < ClassGens.size(); i++) { hm.put(ClassGens.get(i).getClassName(), ClassGens.get(i)); } return hm; } private static byte[] unscrambler(byte abyte0[]) throws IOException { byte abyte1[] = new byte[2 + abyte0.length]; ByteArrayOutputStream bytearrayoutputstream; abyte1[0] = 31; abyte1[1] = -117; System.arraycopy(abyte0, 0, abyte1, 2, abyte0.length); bytearrayoutputstream = new ByteArrayOutputStream(); Pack200.newUnpacker().unpack( new GZIPInputStream(new ByteArrayInputStream(abyte1)), new JarOutputStream(bytearrayoutputstream)); return bytearrayoutputstream.toByteArray(); } private static File getCacheDir() throws Exception { String[] PossibleLocations = { "c:/rscache/", "/rscache/", "c:/windows/", "c:/winnt/", "c:/", "/tmp/", "" }; String[] PossibleLocationsAdditions = { ".jagex_cache_32", ".file_store_32" }; ArrayList matches = new ArrayList(0); for (String location : PossibleLocations) { for (String addition : PossibleLocationsAdditions) { File f = new File(location + addition); if (f.exists()) { matches.add(f); } } } File f = null; for (File match : matches) { f = new File(match, "runescape/main_file_cache.dat0"); if (f.exists()) { System.out.println(f); return f; } } return null; } private static void packFile(JarFile j, File out) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzos = new GZIPOutputStream(baos); Pack200.Packer pk = Pack200.newPacker(); pk.pack(j, gzos); gzos.finish(); if (!out.exists()) out.createNewFile(); FileOutputStream fos = new FileOutputStream(out); byte[] data = baos.toByteArray(); fos.write(data, 2, data.length - 2); fos.close(); } catch (Exception e) { e.printStackTrace(); } }