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

原创 2012年10月22日 16:03:19
我们都知道JAVA是一种解析型语言,这就决定JAVA文件编译后不是机器码,而是一个字节码文件,也就是CLASS文件。而这样的文件是存在规律的,经过反编译工具是可以还原回来的。例如Decafe、FrontEnd,YingJAD和Jode等等软件。下面是《Nokia中Short数组转换算法》

thread.jspa?threadID=872&tstart=0

类中Main函数的ByteCode:

0 ldc #16 
2 invokestatic #18 
5 astore_1
6 return

其源代码是:short [] pixels = parseImage(\"/ef1s.png\");

我们通过反编译工具是可以还原出以上源代码的。而通过简单的分析,我们也能自己写出源代码的。

第一行: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 的意思。

这就是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)
{
e.toString();
}

一定要有e.toString();,因为要防止你的混淆器把无用的代码过滤。

2,然后在每个类中调用这个函数,放在try...catch(Exception e)..中的catch里面,例如:

try
{
...
}
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.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);
}
}

然后在你的程序里面 

try
{

}

catch(IoException e)

{

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

}

当采用以上方式后,任何类只要调用了该函数,生成的class反编译后出错,得不到结果。

Decafe、FrontEnd和YingJAD,反编译时都有exception,然后无法进行下去。大家可以多测试变得反编译工具。建议推荐用第二个方法。

相关文章推荐

如何保护Java程序 防止Java反编译

常用的保护技术   由于Java字节码的抽象级别较高,因此它们较容易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

保护你的JAVA / .net 程序,终极避免被反编译方法研究

反编译真的让JAVA / .net 制作者讨厌的东西。你花大量的精力做了一个很好的软件,却有人盗用,盗用都算了人家还用来商业... 就像某文说的.你的软件买 XXXXXXXX大元.人家公司买200元....

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

本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网 [本文章最后由 rocks 在2006-04-14 13:08:50编辑过] ...

通过Java反编译揭开一些问题的真相

博主在上一篇《 Java语法糖之foreach》中采用反编译的形式进行探讨进而揭开foreach语法糖的真相。进来又遇到几个问题,通过反编译之后才了解了事实的真相,觉得有必要做一下总结,也可以给各位做...

Android 混淆proguard的实现(图文)

1、  在Eclipse中的工程编译运行后,在目录bin下面有生成一些文件,其中classes.dex是未经过混淆生成的。而我们要混淆的话,就要重新生成一个混淆过的classes.dex。本文主要讲怎...
  • hytfly
  • hytfly
  • 2014年04月25日 10:59
  • 4984

Jar包代码混淆操作指导

目前eclipse和sdk默认对打包的jar包代码都没有进行代码混淆,鉴于java代码很容易被反编译,因此对安全性要求比较高的jar包而言,对其进行代码混淆是非常必要的。下面对jar包代码混淆的操作步...
  • xy6490
  • xy6490
  • 2015年08月31日 19:51
  • 1341

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

  • 2011年06月20日 17:49
  • 6KB
  • 下载

一些防止java代码被反编译的方法

java作为解释型的语言,其高度抽象的特性意味其很容易被反编译,容易被反编译,自然有防止反编译措施存在。今天就拜读了一篇相关的文章,受益匪浅,知彼知己嘛!!之所以会对java的反编译感兴趣,那是因为自...

Android APK反编译方法(可以获取APK xml和android Manifest,java代码等内容)

APK反编译和签名 apk文件反编译以及签名打包 通过dex2jar和jd我们可以反编译apk中的dex,可以比较完美的查看java源文件;通过apktool可以反编译apk中的xml等资源文件,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:防止JAVA代码被反编译的方法
举报原因:
原因补充:

(最多只允许输入30个字)