zoukankan      html  css  js  c++  java
  • 如何看懂Java混淆后的反编译代码

    如何看懂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);

     }

查看全文
  • 相关阅读:
    泛型的二阶构造
    二叉树的优势
    浅谈AVL树,红黑树,B树,B+树原理及应用
    AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中?
    据库索引及其数据结构
    关系型数据库工作原理-数据结构(3)
    数据库的最简单实现
    为什么使用数据库?数据库的存取效率如何保证?
    iOS原生数据存储策略
    数据存储要解决的几个问题
  • 原文地址:https://www.cnblogs.com/jackrex/p/3001431.html
  • Copyright © 2011-2022 走看看