《如何制作java可执行程序以及安装程序》由会员分享,可在线阅读,更多相关《如何制作java可执行程序以及安装程序(10页珍藏版)》请在金锄头文库上搜索。
1、将Java程序转换成exe文件的七种方法(2006-02-04 13:10:03) 转载分类: IT时空 一、exe4j 说明:exe4j可以将Jar文件制作成exe文件,但需jre支持,也可将Jar文件放在外面。 软件性质:共享软件二、JBuilder 说明:新版本的JBuilder可以直接把工程制作成各系统的可执行文件,包括Windows系统。 软件性质:商业软件 三、NativeJ 说明:与exe4j功能类似。 软件性质:共享软件四、Excelsior JET 说明:可以直接将Java类文件制作成exe文件,除AWT和Swing及第三方图形接口外可不需jre支持(Java5.0不行)。
2、软件性质:共享软件五、jshrink 说明:可将Jar文件打包进exe文件。同时具有混淆功能(这才是它的主要功能)。 软件性质:共享软件六、InstallAnywhere 说明:打包工具,对Java打包最好用。可打包成各操作系统运行包。包括Windows系统。 软件性质:商业软件。七、InstallShieldX 说明:与InstallAnywhere类似,但比InstallAnywhere功能强大。相对的,比较复杂,不易上手,我现在还没学会。 软件性质:商业软件。作者:舵手申明:如转载请保证文章的完整性来源: Jshrink extracts the minimal set of Java
3、class files for an application, removes unused code and data, obfuscates symbolic names, finalizes code for optimized execution, and stores the results in a Java archive .jar file. Jshrink typically reduces program size by 30-40%. Jshrink obfuscated code is much harder to comprehend when decompiled,
4、 a claim that can be readily verified using Jshrinks built-in Java decompiler. What at first glance seems to be meaningful names in Jshrink obfuscated code are often reused system names, a Jshrink obfuscation technique called semantic recycling. 一直没怎么用过,闲来无聊想研究下它的功能,用jshrink打开一个class文件双击提示“Missing l
5、icense key, see www.e- to request evaluation license”,以前申请了一个试用的license key,恢复过系统,早丢了。java写的,反编译出来看看,解压jar,并反编译所有的class文件,类被混淆过,这里要注意的是,有些方法混淆后名称和类名一样,但千万不要把它当作构造函数,否则可能会带来一点麻烦。在整个源代码中查找上面的报错字符串,居然没找到。在解压后的目录里找了一下,发现I.gif挺可怀,打开一看果然是加密了的东东,并不是gif文件,在I.I.class反编译源代码中果然发现了I.gif,如下:InputStream inputstre
6、am = (new I().getClass().getResourceAsStream( + I + . + g + i + f); 即然建立输入流读取方文件,肯定有解密过程,分析原代码后写出一个解密代码:import java.io.InputStream;public class I static byte COWY; static String append = new String256; static int close = new int256;public String td(int i) int j = i & 0xff; if(closej != i) closej = i
7、; if(i 0) i &= 0xffff; String s = new String(COWY, i, COWYi - 1 & 0xff); appendj = s; System.out.println(appendj); return appendj; public static void main(String args) try InputStream inputstream = (new I().getClass().getResourceAsStream( + I + . + g + i + f); /这里他用I + . + g + i + f,如果我们直接查找I.gif,肯定
8、没有结果,所以当搜索I.gif没找到时, /一定要试试这种方法,还有数组形式存放。 if(inputstream != null) int i = inputstream.read() 16 | inputstream.read() 8 | inputstream.read(); COWY = new bytei; int j = 0; byte byte0 = (byte)i; byte abyte0 = COWY; while(i != 0) int k = inputstream.read(abyte0, j, i); if(k = -1) break; i -= k; for(k +=
9、 j; j k; j+) abyte0j = byte0; inputstream.close(); catch(Exception exception) I i = new I();for (int j=0; j7200; j+ )/为什么这个j最大值为7200,因为大概查看了一下源代码中调/用I.I.I()这个方法的最大值就是这个,试图加大后,抛出异常。System.out.print(j+:);i.td(j); 当上面的循环体里j为4088时字符串是Missing license key, see www.e- to request evaluation license,在整个原代码是搜
10、索4088,发现只在A.class中有,switch(getViewRect) case -1: case 0: / 0 return true; case 1: / 001 getChildCount(); getJarEntry(I.I.I(4088); /Missing license key, see www.e- to request evaluation license /I.I.I(4088)返回的串 return false; case 2: / 002 getChildCount(); getJarEntry(I.I.I(4168); /Evaluation license
11、key has expired, purchase new key at www.e- /I.I.I(4168)返回的串 return false; case 3: / 003 getChildCount(); getJarEntry(I.I.I(4249); /Invalid license key /I.I.I(4249)返回的串 return false; case 4: / 004 getJarEntry(I.I.I(4269); /Internal error verifying license key /I.I.I(4269)返回的串 return false; return fa
12、lse; 不想分析注册key详细算法,暴破试一下,把上面每个case子句里的代码变为 return true; 可能问题就能解决,用十六进制编辑器打开A.class,查找03AC,连续五个在一起,改为04AC,现在程序已经可以正常运行,只是还有无License的提示对话框,那么把04AC(前面已修改)前的十个四字节,如:2AB7016B2A110FF8B8056DB7003A全改为00,相当于汇编里的nop保存打包,运行就再没有提示对话框了。这样不完全暴破就已经成功,之所以说不完全是因为还有Z.class有类A.class的功能,读取I.gif文件并解密,我们并没有对A.class这个类的调用做跟踪分析,这样很有可能还有一些地方有限制而我们没有破除掉。 没什么技术性,但能为菜鸟破JAVA程序提示一点思路。今天搜了一下