过程是这样的:我打了一个程序的jar包,
然后用jsmooth打包成了exe文件。但是发现用winrar可以把这个exe解压class文件,怎么能打成不可解压的exe呢,有什么方法。
望高手赐教

解决方案 »

  1.   

    如果EXE不可解开,那么JVM如何读取其中的CLASS呢?要知道,JVM是只认CLASS的,除非你的EXE可以脱离JVM运行.
      

  2.   

    to: lEFTmOON(?? http://www.ismyway.com)
    对啊,但我不是想脱离,我是想把JVM也打进去,可以打进去,但还能解压。按你说,JVM只认class文件,我有一事不明,java文件混淆后,JVM是如何识别的呢??
    这个不太明白原理。
      

  3.   

    用jb大的exe,winrar可解开,用exe4j打的exe,winrar就解不开,可能是压缩算法的原因把
      

  4.   

    java的exe包原理,象winrar的自解压文件一样,前几百k是运行平台上的可执行文件,用来解压后面的资源,解压后调用jvm,所以jvm不知到执行的是exe,执行的是临时目录里的class.一般来说,winrar并不看exe前面的头,只看文件中有没有头标记
    如*.rar,文件开始必须为Rar!,*.zip,文件开始为PK
    若winrar找到头标记,就把exe中从PK到文件尾的所有作为zip文件解压.所以,要有不可解压的exe,可以在exe可执行头作手脚,把"PK",去掉,反正它只是标记,不影响解压.
    或者,用不同的压缩算法,比如用cab,arj,ace等的自解压文件,当然可执行文件部分要加一段调用jvm的.
    关于*.class混淆后,JVM是如何识别的:
    *.class混淆,并没改变class文件的数据结构,一般只是把所有的变量名,类名改变后重写入class文件,JVM当然认得.
      

  5.   

    Java轉exe篇:
    實現方式:Eclipse搭配JSmooth(免費)。
    1.先由Eclipse製作包含Manifest的JAR。
    製作教學
    2.使用JSmooth將做好的JAR包裝成EXE。
    JSmooth下載頁面:
    http://jsmooth.sourceforge.net/index.php
    3.製作完成的exe檔,可在有裝置JRE的Windows上執行。
      

  6.   

    首先,谢谢dyhml(VirusCamp)详细的解答。
    如你所说
    ((java的exe包原理,象winrar的自解压文件一样,前几百k是运行平台上的可执行文件,用来解压后面的资源,解压后调用jvm,所以jvm不知到执行的是exe,执行的是临时目录里的class.))
    这样的话,不管怎么打成exe的包,别人还是可以从临时目录里得到class文件,还是可以反编译。((一般来说,winrar并不看exe前面的头,只看文件中有没有头标记
    如*.rar,文件开始必须为Rar!,*.zip,文件开始为PK
    若winrar找到头标记,就把exe中从PK到文件尾的所有作为zip文件解压.
    所以,要有不可解压的exe,可以在exe可执行头作手脚,把"PK",去掉,反正它只是标记,不影响解压.))
    所以这些方式可以过虑掉了吧?((或者,用不同的压缩算法,比如用cab,arj,ace等的自解压文件,当然可执行文件部分要加一段调用jvm的.))
    这个方式没太懂,还是压缩的本质吧,应该和上面一样吧,只不过压缩算法不同,同样可以在临时目录里得到class文件?((关于*.class混淆后,JVM是如何识别的:
    *.class混淆,并没改变class文件的数据结构,一般只是把所有的变量名,类名改变后重写入class文件,JVM当然认得.))
    如果只改了名称,对加密起不到任何作用啊。我描述一下我要解决的事情:
    我传输一个文件,在源头用des算法加密,在接收方用密钥解密。但是密钥都写在程序中了,如果class被反编译的话,别人就可以看到这个密钥,我这个加密就毫无用处了。我现在是想找一个方法,把写在程序中的密钥完全隐藏起来,任何人都得不到。有什么解决方法呢???看你写的混淆的概念,并不能把这个也混淆掉啊。
      

  7.   

    不是,解压不一定要在临时目录里,可以直接解压到内存,用classloader装入混淆确实不能隐藏class里的常数.看看这样可以吗:用加密的zip,把pk标志去掉,在exe头里写zip密码,class解压到内存中,很可能exe也要加密,麻烦.
      

  8.   

    呵呵,好像是比较麻烦。
    如果class可以解压到内存中,不是解压到硬盘上估计可行。你说的后一种方法好像太难了点,麻烦死了,并且越麻烦越容易出错。还有高人有什么方法么??