您的位置:首页 > 编程语言 > Java开发

如何看懂Java混淆后的反编译代码

2013-01-24 13:20 447 查看
如何看懂Java混淆后的反编译代码

分类: JAVA相关

如何看懂Java混淆后的反编译代码

作者:dozb

一般情况下Java应用的开发者为了保护代码不被别人抄袭,在生成class文件的时候都java文件进行了混淆,这种class文件用反编译工具得到的结果很难看懂,并且不能进行编译。本文从研究的角度,浅析如何读懂这种反编译过来的文件。

例子一:赋值

反编译过来的代码如下:

        Node node;

        Node node1 = _$3.getChildNodes().item(0);

        node1;

        node1;

        JVM INSTR swap ;

        node;

        getChildNodes();

        0;

        item();

        getChildNodes();

        0;

        item();

        getNodeValue();

        String s;

        s;

原始语句:

        Node node;

        Node node1 = currDocument.getChildNodes().item(0);

 node = node1;

        String s = node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();

注解:

        JVM INSTR swap ; //赋值语句

练习:

        String s1;

        String s8 = node.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();

        s8;

        s8;

        JVM INSTR swap ;

        s1;

        10;

        Integer.parseInt();

        int i;

        i;

   
例子二:不带参数创建对象

反编译过来的代码如下:

        JVM INSTR new #244 <Class CrossTable>;

        JVM INSTR dup ;

        JVM INSTR swap ;

        CrossTable();

        CrossTable crosstable;

        crosstable;

原始语句:

        CrossTable crosstable = new CrossTable();

注解:

练习:

        JVM INSTR new #246 <Class Database>;

        JVM INSTR dup ;

        JVM INSTR swap ;

        Database();

        Object obj;

        obj;

例子三:带参数创建对象
反编译过来的代码如下:

        JVM INSTR new #262 <Class StringBuffer>;

        JVM INSTR dup ;

        JVM INSTR swap ;

        String.valueOf(s2);

        StringBuffer();

        s.substring(j, i);

        append();

        s6;

        append();

        toString();

        s2;

 

原始语句:

 s2 = (new StringBuffer(String.valueOf(s2))).append(s.substring(j, i)).append(s6).toString();

注解:

 此语句实际上是:s2 += s.substring(j, i) + s6;

练习:

例子四:for循环

反编译过来的代码如下:

        int k = 0;

          goto _L4

_L8:

 ...

 k++;

_L4:

        if(k < as.length) goto _L8; else goto _L7

原始语句:

 for(int k=0;k < as.length;k++)

 {

     ...

 }

注解:

例子五:while循环

反编译过来的代码如下:

        String s1 = "";

          goto _L1

_L3:

        JVM INSTR new #262 <Class StringBuffer>;

        JVM INSTR dup ;

        JVM INSTR swap ;

        String.valueOf(s1);

        StringBuffer();

        _$2(resultset, s, l);

        append();

        toString();

        s1;

_L1:

        if(resultset.next()) goto _L3; else goto _L2

原始语句:

 String s1 = "";

 while(resultset.next())

 {

  s1 = s1 + resultSetToString(resultset, s, l);

 }

分享到: 

上一篇:Tomcat的class加载的优先顺序一览下一篇:惨淡人生,平淡生活
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: