用户: 密码: 答案:   我要注册   忘记密码

加入收藏  设为首页

开发文档

CNJM首页

业界新闻

手机软件

终端应用

资源下载

EclipseME

CNJM论坛

                 

频道列表

J2ME开发 176篇
服务器端开发 33篇
JAVA语言 71篇
游戏与图形 101篇
WindowsMobile开发 6篇
Symbian开发 61篇
Brew开发 36篇
其它开发平台 6篇

热点文章

Jakarta Commons H... 15245次
利用HttpClient获...  11997次
[原创]反编译器jad... 10929次
防止JAVA代码被反...  9060次
Java异常处理 7840次
看例子练apache co... 7761次
每个JAVA初学者都...  7634次
加密与数字签名 7623次
为测试 Java 应用...  7072次
用JAVA设计面向对...  6953次
Java网络编程笔记(1) 6885次
移动视频: QuickTi... 6729次

文章搜索

搜 索
按 照
频 道
  
防止JAVA代码被反编译的方法
编辑:rocks    审核:rocks    文章来源:minisoyo
关键词:破解, 反编译    发表日期:2006-04-14 12:10:40    浏览次数:9060次
本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>

[本文章最后由 rocks 在2006-04-14 13:08:50编辑过]

来自:http://www.cnjm.net/tech/article1525.html

[转载于minisoyo]
原文:http://www.minisoyo.com/forum/thread.jspa?threadID=943&tstart=0
作者:bb

我们都知道JAVA是一种解析型语言,这就决定JAVA文件编译后不是机器码,而是一个字节码文件,也就是CLASS文件。而这样的文件是存在规律的,经过反编译工具是可以还原回来的。例如Decafe、FrontEnd,YingJAD和Jode等等软件。下面是《Nokia中Short数组转换算法》
类中Main函数的ByteCode:
0 ldc #16
2 invokestatic #18
5 astore_1
6 return

其源代码是:short [] pixels = parseImage("/ef1s.png");
我们通过反编译工具是可以还原出以上源代码的。而通过简单的分析,我们也能自己写出源代码的。
JAVA手机网[www.cnjm.net]
第一行:ldc #16
ldc为虚拟机的指令,作用是:压入常量池的项,形式如下
ldc index
这个index就是上面的16,也就是在常量池中的有效索引,当我们去看常量池的时候,我们就会找到index为16的值为String_info,里面存了/ef1s.png.
所以这行的意思就是把/ef1s.pn作为一个String存在常量池中,其有效索引为16。
第二行:2 invokestatic #18
invokestatic为虚拟机指令,作用是:调用类(static)方法,形式如下
invokestatic indexbyte1 indexbyte2
其中indexbyte1和indexbyte2必须是在常量池中的有效索引,而是指向的类型必须有Methodref标记,对类名,方法名和方法的描述符的引用。
所以当我们看常量池中索引为18的地方,我们就会得到以下信息:
JAVA手机网[www.cnjm.net]
Class Name : cp_info#1
JAVA手机网[www.cnjm.net]
Name Type : cp_info#19
1 和19都是常量池中的有效索引,值就是右边<>中的值,再往下跟踪我就不多说了,有兴趣的朋友可以去JAVA虚拟机规范。
这里我简单介绍一下parseImage(Ljava/lang/String;)[S 的意思。
这就是parseImage这个函数的运行,我们反过来看看parseImage的原型就明白了
short [] parseImage(String)
那么Ljava/lang/String;就是说需要传入一个String对象,而为什么前面要有一个L呢,这是JAVA虚拟机用来表示这是一个Object。如果是基本类型,这里就不需要有L了。然后返回为short的一维数组,也就是对应的[S。是不是很有意思,S对应着Short类型,而“[”对应一维数组,那有些朋友要问了,两维呢,那就“[[”,呵呵,是不是很有意思。
好了,调用了函数,返回的值要保存下来吧。那么就是第三行要做的事情了。
第三行:5 astore_1
呵呵,很简单的。但是却有文章,也是比较容易混乱的地方。
astore_为虚拟机指令,作用为:将当前reference存储到局部变量中去。而必须是对当前框架的局部变量的有效索引。打个比方,可能我们这个函数中可能还要用到这个局部变量,我们可以通过来找到它。例如调用虚拟机指令:
aload_1,就能得到该值。
第四行:6 return
同样的,return也是虚拟机指令了,它的作用为:从方法返回void。
JAVA手机网[www.cnjm.net]
这里也就是退出main函数。
----------------------------------------------------------------------------
ok,终于啰嗦完毕了。有些朋友可能要问,这么复杂,才四行就说这么多,呵呵,可能是我这人废话过多,当然如果你熟悉了,一点就能看懂了。通过肉眼就可以反编译程序了。目前所有的反编译工具都无法做到完美反编译,在有问题的地方还需要人去修正。
好了,说了半天如何反编译,我们就来看看如果在你的程序如果防止别人来反编译。好不容易写好的程序被人反编译了,多郁闷。哈哈。工欲善其事,必先利其器,这句话用对了吗?
什么混淆等等的方法,我就不说了,我这里主要是要说一种通过添加代码来在某种程度来避免当前流行的反编译工具对你的代码进行反编译。
方案一。
1,首先要添加一个参数为Exception类型的函数,例如这样。
JAVA手机网[www.cnjm.net]
   public static void Fake(Exception e)
   {
       e.toString();
   }
  一定要有e.toString();,因为要防止你的混淆器把无用的代码过滤。
2,然后在每个类中调用这个函数,放在try...catch(Exception e)..中的catch里面,例如:
   try
   {
    ...
   }
   catch (Exception e)
   {
       Fake(e);
   }
请注意 ,一定要放在catch才有用,其他地方无用。
JAVA手机网[www.cnjm.net]
方案二。
如果以上方法还不够专业,我们再来一个。呵呵~
1,同样的,我们定义一个类,这个类叫做AntiCrack.。名字好像有点大。。。代码如下:
public class AntiCrack
{
   private AntiCrack()
   {
   }
   public static Throwable Fake(Throwable throwable, Throwable throwable1)
   {
JAVA手机网[www.cnjm.net]
       try
       {
           throwable.getClass().getMethod("initCause", new Class[] {
JAVA手机网[www.cnjm.net]
               java.lang.Throwable.class
           }).invoke(throwable, new Object[] {
               throwable1
           });
       }
       catch(Exception exception) { }
       return throwable;
   }
}
2,同样的,我们在catch里面调用该函数。例如如下。
           try
           {
JAVA手机网[www.cnjm.net]
               //your code here
           }
           catch(IOException ioexception)
           {
               IllegalArgumentException illegalargumentexception = new IllegalArgumentException(ioexception.toString());
               AntiCrack.fake(illegalargumentexception, ioexception);
               throw illegalargumentexception;
           }
或者也可以这样
public class AntiException extends Exception
{
   public AntiException()
JAVA手机网[www.cnjm.net]
   {
   }
   public AntiException(String s)
   {
       super(s);
   }
   public AntiException(String s, Throwable throwable)
   {
JAVA手机网[www.cnjm.net]
       super(s);
JAVA手机网[www.cnjm.net]
       AntiCrack.fake(this, throwable);
   }
}
然后在你的程序里面
try
{
}
catch(IoException e)
{

     throw new AntiException(ioexception.toString(), ioexception);

}

当采用以上方式后,任何类只要调用了该函数,生成的class反编译后出错,得不到结果。
Decafe、FrontEnd和YingJAD,反编译时都有exception,然后无法进行下去。大家可以多测试变得反编译工具。建议推荐用第二个方法。
呵呵,有什么问题可以给我mail
来自:http://www.cnjm.net/tech/article1525.html

相关文章
    [原创]反编译器jad的使用心得  [2003-05-22]
最新评论   [查看全部评论(7条)]
匿名 在 2006-10-17 22:00:06 发表的评论:
不好用 
匿名 在 2006-08-29 16:35:40 发表的评论:
888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------===============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 
匿名 在 2006-08-29 16:33:25 发表的评论:
..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... 
匿名 在 2006-07-13 10:34:24 发表的评论:
我试试看,如果行的话真得感谢你啊! 
匿名 在 2006-06-21 07:48:33 发表的评论:
假的。。。。。 
匿名 在 2006-06-21 07:42:03 发表的评论:
不好用。。。。。 
网站简介  |  关于版权  |  广告服务  |  网站地图  |  联系我们
Copyright © www.CNJM.net, All rights reserved
中国JAVA手机网 版权所有
ICP备案:京ICP备041452