爱问知识人 爱问教育 医院库

如何防止JAVA程序源代码被反编译?

首页

如何防止JAVA程序源代码被反编译?

如何防止JAVA程序源代码被反编译?

提交回答

全部答案

    2018-03-23 08:47:06
  •   我们都知道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"); 我们通过反编译工具是可以还原出以上源代码的。而通过简单的分析,我们也能自己写出源代码的。 第一行: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类型,而 “[”对应一维数组,那有些朋友要问了,两维呢,那就“[[”,呵呵,是不是很有意思。

    杜***

    2018-03-23 08:47:06

类似问题

换一换

相关推荐

正在加载...
最新资料 推荐信息 热门专题 热点推荐
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):