java源代码防破解 java暴力破解代码

如何防止JAVA程序源代码被反编译我们都知道JAVA是一种解析型语言,这就决定JAVA文件编译后不是机器码 , 而是一个字节码文件 , 也就是CLASS文件 。而这样的文件是存在规律的,经过反编译工具是可以还原回来的 。例如Decafe、FrontEnd,YingJAD和Jode等等软件 。下面是《Nokia中Short数组转换算法》
类中Main函数的ByteCode:0 ldc #162 invokestatic #185 astore_16 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类型,而“[”对应一维数组 , 那有些朋友要问了,两维呢,那就“[[”,呵呵 , 是不是很有意思 。
好了,调用了函数,返回的值要保存下来吧 。那么就是第三行要做的事情了 。
如何防止程序员反编译?Java从诞生以来java源代码防破解,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光java源代码防破解!但随着java的应用领域越来越广,特别是一些功能要发布到终端用户手中(如Android开发的app),有时候,公司为java源代码防破解了商业技术的保密考虑 , 不希望这里面的一些核心代码能够被人破解(破解之后,甚至可以被简单改改就发布出去,说严重点 , 就可能会扰乱公司的正常软件的市场行为),这时候就要求这些java代码不能够被反编译 。
这里要先说一下反编译的现象 。因为java一直秉持着开放共享的理念,所以大家也都知道 , java源代码防破解我们一般共享一个自己写的jar包时,同时会共享一个对应的source包 。但这些依然与反编译没有什么关系,但java的共享理念 , 不只是建议我们这样做 , 而且它自己也在底层上“强迫”我们这么做!在java写的.java文件后,使用javac编译成class文件,在编译的过程,不像C/C++或C#那样编译时进行加密或混淆,它是直接对其进行符号化、标记化的编译处理,于是,也产生了一个逆向工程的问题:可以根据class文件反向解析成原来的java文件!这就是反编译的由来 。

推荐阅读