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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
我们都知道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 class防止反编译,最大限度的保护自己的代码

java以其跨平台、免费、安全等特点,被越来越多的应用到大型的系统中。正是由于其代码的跨平台性,是解析型语言才使得它很容易被反编译成源码,从而造成公司代码的泄露,设置时运用框架的泄露。本文从各个方面介绍了防止class被反编译。从而保护自己的知识产权不受侵害。 包括混淆技术,加密技术等。

License机制保护java软件产品的安全

中国是个盗版软件横行泛滥的国度,也许这里面有我们社会主义初级阶段这个国情的因素,我们确实离不开盗版软件。但要发展壮大本国的软件产业,知识产权保护亟需重视起来。除了寄希望于大环境方面的改善,我们自己也可以做些力所能及的事情,保护好自己的软件产品,以免自己的辛勤劳动成果被他人轻松窃取。 通常可以通过license机制来保护软件产品的安全,我们可以限定只有购买了license用户在特定...

eagletony 712

防止Java程序被反编译

 Java语言的出现,使得反编译变得非常容易而有效。原因如下:1.由于跨平台的需求,Java的指令集比较简单而通用,较容易得出程序的语义信息;2.Java编译器将每一个类编译成一个单独的文件,这也简化了反编译的工作;3.Java 的Class文件中,仍然保留所有的方法名称、变量名称,并且通过这些名称来访问变量和方法,这些符号往往带有许多语义信息。由于Java程序自身的特点,对于不经过处理的Java程序反编译的效果非常好

license反编译技术方案

因此,在实施许可验证机制时,需要进行权衡,确保安全措施的成本与效果之间的平衡,并密切关注用户体验和隐私保护。使用服务器端验证:将许可验证的逻辑部分放在服务器端进行,而不是完全依赖客户端的验证代码。混淆验证代码:通过使用代码混淆技术,可以增加反编译验证代码的难度。分散验证逻辑:将验证逻辑分散到多个代码模块或者服务器端,使得用户无法通过分析单个模块来完全了解验证的实现方式。动态生成许可文件:每次生成许可文件时,可以使用随机数或者其他动态生成的数据来增加许可文件的复杂性和安全性。

Liberty1010的博客 783

Spket破解方法(反编译)

        Spket(http://www.spket.com/)是一种很强大的Javascript编辑器,它是基于Eclipse内核的IDE(可以以独立可执行文件,或者Eclipse插件的形式安装)。本文以Spket独立IDE为例。在开发Ext、火狐扩展或其它Javascript相关程序的时候,可以使用它作为不错的代码编辑工具。         The powerful edito

wirror800的专栏 8760

使用 ClassFinal 对 java class 文件进行加密防止反编译

ClassFinal 是一款 java class文件安全加密工具,支持直接加密 jar 包或 war 包,无需修改任何项目代码,兼容 spring-framework;可避免源码泄漏或字节码被反编译特点。

悟世君子的博客 1万+

android 预防apk 反编译

常用的保护技术 由于Java字节码的抽象级别较高,因此它们较容易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点。   1.隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将关键的J

xuhui_7810的专栏 980

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

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达作者| Zzzkis来源 | urlify.cn/2u2yEbjava作为解释型的语言,其高度抽象的特性意味其很容易被反编...

程序IT圈 730

Java代码防止反编译的4中方法

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草urlify.cn/2u2yEb推荐:https://www.xttbl...

xmt1139057136的专栏 1879
上一篇: C#读取app.config文件中的连接字符串的方法
下一篇: Java.io包学习-获取文件的父目录
derek
博客等级 码龄17年 208粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值