java反编译器剖析(中)-java开发java经验技巧

java反编译器剖析(中)-java开发java经验技巧

ID:30768690

大小:105.52 KB

页数:8页

时间:2019-01-03

java反编译器剖析(中)-java开发java经验技巧_第1页
java反编译器剖析(中)-java开发java经验技巧_第2页
java反编译器剖析(中)-java开发java经验技巧_第3页
java反编译器剖析(中)-java开发java经验技巧_第4页
java反编译器剖析(中)-java开发java经验技巧_第5页
资源描述:

《java反编译器剖析(中)-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java反编译器剖析(中)-编程开发技术Java反编译器剖析(中)木文由ImportNew・乌

2、1柏翻译自javacodegeekso欢迎加入翻译小纽.。转载请见文末要求。在上一篇文章中,我们介绍了翻译器的功能、简单的字节码知识回顾、反编译和栈分析。本文将继续讨论反编译器中对条件表达式、变量类型分析、短路运算符和方法调用在反编译器屮的处理。条件表达式在这里可以决定我们的代码是否使用了三元运算符(?:):冇一个判断条件,条件的每个分支都对同一个栈变量s{l,2}进行一次赋值,赋值后两条路径会进行合并。-旦确定了这个模式,就可直接使用三元表达式。复制传播后合并三元表达式0145891011讦(v

3、O==0)goto#8s{l,2}=vlgoto9s{l,2}=v2v3=s{1,2)returnv3v3=v0!=0?vl:v2returnv3值得注意的是,作为转换的一部分,我们对#9处的条件进行了取反。可以看出javac生成的代码对判断条件取反这一行为是有规律的。因此,如果将转换后的条件取反,就口J以更加接近原來的代码。画外音:类型是什么?当处理栈值时,JVM使用了一个比Java代码更为简单的类型系统。特别是boolean、char和short的值都被作为int值使用同一指令处理。因此,vO!=0可以翻译成:vO!=false?vl:v2或者vO!=0?vl:v2甚至还可以翻译为vO!

4、=false?v1==true:v2==true……还有很多其它的翻译结果!在这个例子屮,我们很幸运地知道vO的精确类型,这个类型包含在方法描述中:descriptor:(ZII)Iflags:ACC_PUBLTC,ACC_STATTC方法签名由此可以知形式如下:publicstaticintplus(boolean,int,int)通过签名还可以知道,v3是int型(而不是boolean型)。因为它是返回值,通过描述符已经知道了返回值类型。接下來,还需要翻译:v3=vO?vl:v2returnv3另外,如果vO是一个本地变量(不是形参),可能无法知道其类型是boolean而不是into还记

5、得我们之前提到的本地变量表,就是包含了原始本地变量名的那个表吗?除了变量名,它述记录了有变量的类型。因此,如果编译时带有debug信息,就可以从本地变量表屮知道变量的类型。此外,还有一张LocalVariab1eTypeTab1e表,此表也包含类似的信息。两者的主要区别在于LocalVariableTypeTable包含了泛型信息。然而,由于LocalVariableTypeTable中的信息是未经验证的元数据,因此不能完全依赖这些数据。一些非常规的混淆器(obfuscator)会在这些表小填入假信息,但是修改后的字节码却依然可以执行!所以请自行决定如何使用这些表。短路运算符(试和,)pub

6、licstaticreturnaboolcanfn(boolcana,boolcanb,boolcanc){b&&c;怎么能更简单呢?不幸的是,关于字节码的理解总是冇一点痛苦字节码栈变量复制传播后0iload_0sO=vO1ifne#12if(s()!=())goto#12if(v()!=())goto#124iload_lsl=vl5ifeq#16if(sl==0)goto#16if(vl==0)goto#168iload_2s2=v29ifeq#16if(s2==0)goto#16讦(v2==0)goto#1612iconst_ls3=1s{3,4)=113goto#17goto17go

7、to1716iconst_0s4=0s{3,4}=017ireturnreturns{3,4}returns{3,4}根据选择的路径不同,位于#17位置的ireturn指令可能返冋s3或者s4o我们为其分别命名,然后使用复制传播来消除sO、si和s2。接下來,在#1、#5和#7位置冇三个连续的条件。如之前提到的那样,条件分支要么跳转,要么接着执行下一条指令。上面的字节码包含了一组遵循特定的使用模式,这些模式非常实用:条件与(&&)条件或(IDTl:Tl:讦(cl)gotoLI讦(cl)gotoL2if(c2)gotoL2if(c2)gotoL2LI:LI:变成了变成了if(!cl&&c2)g

8、otoL2if(cl

9、

10、c2)gotoL2LI:LI:••••••如果考虑上面表中的临近条件组,#1・・・#5不遵循上面任何一种模式,但#5…#9却是一个条件或(

11、

12、),因此可以进行如卜•转换:1:if(vO!二0)goto#125:if(vl二二0v2二二0)goto#1612:s{3,4}=113:goto#1716:s{3,4}=017:returns{3,4}注意:每次转换都可能引入新的转换。这种情况

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。