的确java的编译类文件可反编译,市面上可见到java的反编译具jad等;类似工具POwerbuider编译的也可被反编译。
哎,编译成伪代码虚拟机解释执行的都有这个通病,这的确是个窘地。
无可,为何?继续后文诠释一二…。
1)解释执行的虚拟机运算执行基于栈、离不开栈,基于栈运行都会留下蛛丝马迹;java编译字节码是基于栈操的,啥入栈、出栈、操作数、操作码都孕育其中,如是表达式这些编译后肯定是后缀表达式的计算逻辑哈 2)静态区、符号表、常量区、本地变量不是解释性这类语言独有的,可执行文件也有,有的叫法不同而已;哪为何要有呢,其一、各相关连接、解释、回填地址等;其二、资源有限共享等;其三、方便调试跟踪等、如运行期异常那得通知用户原代码那行报错呀 ,当然还有一二三… 3)栈是英雄,其上跑的方法或函数,栈上的操作数可概括为常量、局部变量(注意是基本类型的按值传递、如对象则是对象地址值复制后的地址值传递,再者各局部变量都有编号,这个编号是编译期确定的)、静态变量按值传递(当然还有对象的地址值复制传递); 方法的参数类型、参数个数也很好推算出来; 4)编译后字节码有个重要的行表,加上前面提到的栈上后缀表达式,加上分析收集的指令代码、及操作数类型就能读懂这个代码了 ,对应翻转为中缀表达式; 5)人工虽能读懂二进制也瓜了点,还是写段代码翻译为中缀,符号表也在、操作数也分析到位;思路清晰,这样的反编译工具就出来了 再试测改进工具。 6)哪咋防反编译呢,只有将静态区、常量区、符号表等地方的东东部分抹掉、替换名字了,或运行流程控制吧了;最终反编译后的代码就不易阅读,看不懂了; 哎呀,中午了我也该吃午饭了 |
java之七篇:为何java可反编译
最新推荐文章于 2024-04-25 12:04:37 发布