java代码禁止反编译 java防止反编译工具( 二 )


我们通过反编译工具是可以还原出以上源代码的 。而通过简单的分析,我们也能自己写出源代码的 。
第一行: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代码禁止反编译的信息别忘了在本站进行查找喔 。

推荐阅读