`
djsl6071
  • 浏览: 593460 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

防止JAVA代码被反编译的方法

阅读更多
本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>

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

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

[转载于minisoyo]
JAVA手机网[www.cnjm.net]
原文: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的地方,我们就会得到以下信息:
Class Name : cp_info#1
Name Type : cp_info#19
1 和19都是常量池中的有效索引,值就是右边<>中的值,再往下跟踪我就不多说了,有兴趣的朋友可以去JAVA虚拟机规范。
这里我简单介绍一下parseImage(Ljava/lang/String;)[S 的意思。
JAVA手机网[www.cnjm.net]
这就是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。
这里也就是退出main函数。
----------------------------------------------------------------------------
ok,终于啰嗦完毕了。有些朋友可能要问,这么复杂,才四行就说这么多,呵呵,可能是我这人废话过多,当然如果你熟悉了,一点就能看懂了。通过肉眼就可以反编译程序了。目前所有的反编译工具都无法做到完美反编译,在有问题的地方还需要人去修正。
好了,说了半天如何反编译,我们就来看看如果在你的程序如果防止别人来反编译。好不容易写好的程序被人反编译了,多郁闷。哈哈。工欲善其事,必先利其器,这句话用对了吗?
什么混淆等等的方法,我就不说了,我这里主要是要说一种通过添加代码来在某种程度来避免当前流行的反编译工具对你的代码进行反编译。
方案一。
1,首先要添加一个参数为Exception类型的函数,例如这样。
   public static void Fake(Exception e)
   {
JAVA手机网[www.cnjm.net]
       e.toString();
   }
  一定要有e.toString();,因为要防止你的混淆器把无用的代码过滤。
2,然后在每个类中调用这个函数,放在try...catch(Exception e)..中的catch里面,例如:
   try
JAVA手机网[www.cnjm.net]
   {
    ...
   }
   catch (Exception e)
   {
       Fake(e);
   }
请注意 ,一定要放在catch才有用,其他地方无用。
方案二。
如果以上方法还不够专业,我们再来一个。呵呵~
1,同样的,我们定义一个类,这个类叫做AntiCrack.。名字好像有点大。。。代码如下:
public class AntiCrack
{
   private AntiCrack()
   {
   }
   public static Throwable Fake(Throwable throwable, Throwable throwable1)
   {
       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
           {
               //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()
   {
   }
   public AntiException(String s)
   {
       super(s);
   }
   public AntiException(String s, Throwable throwable)
   {
       super(s);
       AntiCrack.fake(this, throwable);
   }
}
JAVA手机网[www.cnjm.net]
然后在你的程序里面
try
{
}
catch(IoException e)
{

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

}

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

相关推荐

    防止Java程序被反编译

    反编译工具能够解析Class文件中的方法和变量名,甚至重构出接近源代码的代码,这为保护Java代码的知识产权带来了挑战。以下是一些常见的防止Java程序被反编译的技术: 1. **隔离Java程序**:最直接的方式是不让用户...

    java代码保护,防止反编译

    "Java代码保护,防止反编译" 本文讨论了Java程序的保护方法,以防止反编译和盗版。由于Java语言的特点,使得反编译变得非常容易。因此,保护Java程序变得非常重要。本文首先讨论了保护Java程序的基本方法,然后对...

    防止java反编译的一些方法

    隔离Java程序适用于网络应用,加密Class文件和使用本地代码则在特定条件下有效,而代码混淆作为综合性强的保护措施,被广泛认为是防止Java反编译的基本方法之一。开发者应根据应用的具体需求和安全等级,灵活选用或...

    java class防止反编译,最大限度的保护自己的代码

    正是由于其代码的跨平台性,是解析型语言才使得它很容易被反编译成源码,从而造成公司代码的泄露,设置时运用框架的泄露。本文从各个方面介绍了防止class被反编译。从而保护自己的知识产权不受侵害。 包括混淆技术,...

    JAVA加密 保护源代码 防止反编译的工具

    而且大多数不是很好用,这样自己辛苦开发出来的程序很容易被人反编译过来而据为己有,一般情况下,大多数的人都是用混编器(java obfuscator)来把开发出来的程序进行打乱以达到没有办法来反编译观看源代码,...

    java防反编译jar

    为了防止Java代码被反编译,开发者通常会采用混淆工具,如ProGuard、Allatori、Zelix KlassMaster等。这些工具的主要功能是将可读性强的代码转换为难以理解的形式,使得反编译后的结果变得模糊且难以阅读。混淆过程...

    JAVA源代码反编译.rar

    Java源代码反编译是一个对已编译的Java字节码(.class文件)进行逆向工程处理,以恢复接近原始的Java源代码的过程。这个过程通常由开发者在没有源代码但有二进制类文件的情况下进行,以便理解或修改现有程序的行为。在...

    java代码反编译工具

    Java代码反编译工具是程序员在特定情况下非常有用的工具,主要用于查看和理解Java字节码(.class文件)的原始源代码。这类工具能够将已编译的Java类文件转换回接近原始的Java源代码形式,尽管可能无法完全恢复到与...

    Java代码的编译与反编译

    1. javap:Java自带的反编译工具,它可以从.class文件中提取关于方法的元信息,但不会反编译成完整源代码。 2. Jad:一个流行的第三方反编译工具,能够将.class文件反编译成可读性较好的Java源代码。Jad在Linux下...

    JAVA反编译软件(可将class文件反编译为java文件)

    Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...

    JAVA反编译和unicode转字符.rar

    在Java反编译过程中,Jad.exe通常被用来查看或分析已有的字节码,以获取类、方法、变量等信息。反编译工具并不总是能完全恢复原始的源代码,尤其是当原始代码中包含复杂的优化或者混淆时。不过,对于简单的程序和...

    jar包混淆文档,防止代码反编译

    "jar包混淆文档,防止代码反编译"的主题聚焦于通过Allatori这一工具来增强Spring Boot应用的安全性,避免源代码被恶意分析或盗用。下面将详细介绍Allatori代码混淆、反编译的概念以及如何在Spring Boot项目中应用...

    咖啡图形的java反编译工具(实用)

    Java反编译是将已编译的Java字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解已加密或混淆的代码、逆向工程库或者研究软件内部工作原理非常有用。这款名为“咖啡图形的java反编译工具”很可能是一...

    java完全反编译工具

    Java完全反编译工具是开发者在进行代码调试、学习或者逆向工程时非常有用的工具。这类工具能够将Java字节码(.class文件)转换回可读的源代码格式,帮助我们理解已编译的Java程序的工作原理。下面将详细介绍Java反...

    web代码混淆压缩工具和java代码反编译工具

    本文将详细讲解"web代码混淆压缩工具"和"Java代码反编译工具"的相关知识点。 首先,代码混淆是一种技术,用于将可读性强的源代码转换为难以理解的形式,目的是防止未经授权的人员阅读或破解代码。混淆通常涉及...

    Apk 反编译成Java源代码工具

    6. **保护措施**:对于开发者而言,防止APK被轻易反编译的方法包括使用代码混淆、签名验证和运行时加密等手段。这些方法可以增加逆向工程的难度,但无法完全阻止。 总之,"Apk 反编译成Java源代码工具"如dex2jar和...

    java反编译工具(可以反编译所有的jar包)

    4. **版权保护:** 了解反编译手段也有助于开发者采取措施防止自己的代码被非法反编译。 **注意事项:** 尽管反编译工具非常有用,但使用它们时应尊重软件的许可协议。对于受版权保护的代码,未经许可的反编译可能...

    java反编译.zip

    Java反编译是Java开发中一个重要的技术环节,主要用于恢复已编译的.class文件到接近原始的.java源代码。这在源代码丢失或者需要查看已部署应用的内部实现时非常有用。本文将深入探讨Java反编译的概念、工具以及相关...

    jock java 混淆反编译

    Jock作为混淆工具,提供了一种保护Java代码的方式;而反编译则是为了分析混淆后的代码,尽管这通常是一项挑战。理解和掌握这些技术,对于开发者来说,无论是为了保护自己的知识产权,还是为了学习和研究他人的代码,...

Global site tag (gtag.js) - Google Analytics