java class反编译后的代码还原(二)

 java class 利用jad 反编译之后,偶尔回碰到一些不正常的代码,例如:label0 :_L1 MISSING_BLOCK_LABEL_30、JVM INSTR ret 7、JVM INSTR tableswitch 1 3: default 269、 JVM INSTR monitorexit、JVM INSTR monitorenter,这些一般是由特殊的for循环、try catch finally语句块、synchronized语句反编译后产生的。下面,就简单介绍一下,一些反编译后的特殊代码的还原规则。本文在Jdk 1.4.2_08+jad 1.58f下测试。jad 1.5.8f可以到这里http://download.csdn.net/source/470540 下载。

    第二部分、异常

   下面的代码前提是类中有如下属性,  Calendar cal = Calendar.getInstance();。

    1、Exceptioin的还原    反编译后的代码如下:

    public boolean f1()
 
    {
 
        return cal.getTime().after(new Date());
 
        Exception e;
 
        e;
 
        e.printStackTrace();
 
        return false;
 
    }
 
还原后的Java代码
    public boolean f1()
 
    {
 
        try
 
        {
 
            return cal.getTime().after(new Date());
 
        }
 
        catch (Exception e)
 
        {
 
            e.printStackTrace();
 
            return false;
 
        }
 
    }
 
2、finally代码的还原 反编译后的Java代码如下:
    public boolean f2()
 
    {
 
        boolean flag = cal.getTime().after(new Date());
 
        System.out.println("finally");
 
        return flag;
 
        Exception e;
 
        e;
 
        e.printStackTrace();
 
        System.out.println("finally");
 
        return false;
 
        Exception exception;
 
        exception;
 
        System.out.println("finally");
 
        throw exception;
 
 
 
    }
 
还原后的代码如下:
    public boolean f2()
 
    {
 
        try
 
        {
 
            return cal.getTime().after(new Date());
 
        }
 
        catch (Exception e)
 
        {
 
            e.printStackTrace();
 
            return false;
 
        }
 
        finally
 
        {
 
            System.out.println("finally");
 
        }
 
    }
 
 
 
3、MISSING_BLOCK_LABEL_的还原反编译后的代码
    public Object f22()
 
    {
 
        Date date = cal.getTime();
 
        System.out.println("finally");
 
        return date;
 
        Exception e;
 
        e;
 
        e.printStackTrace();
 
        System.out.println("finally");
 
        break MISSING_BLOCK_LABEL_45;
 
        Exception exception;
 
        exception;
 
        System.out.println("finally");
 
        throw exception;
 
        return null;
 
    }
 
还原后的Java代码
    public Object f22()
 
    {
 
        try
 
        {
 
            return cal.getTime();
 
        }
 
        catch (Exception e)
 
        {
 
            e.printStackTrace();
 
        }
 
        finally
 
        {
 
            System.out.println("finally");
 
        }
 
        return null;
 
    }
 
4、异常中:label的还原反编译后的代码
    public String f4()
 
        throws Exception
 
    {
 
label0:
 
        {
 
            try
 
            {
 
                Integer i = new Integer(1);
 
                if(i.intValue() > 0)
 
                {
 
                    System.out.println(i);
 
                    break label0;
 
                }
 
 
 
                System.err.println(i);
 
            }
 
            catch(Exception dae)
 
 
 
 
 
 
 
            {
 
                System.err.println(dae);
 
                throw new RuntimeException(dae);
 
            }
 
            return null;
 
        }
 
        return "Hello";
 
    }
 
注意,这个代码有点诡异,实际代码如下:
    public String f4() throws Exception
 
 
 
 
 
    {
 
        try
 
        {
 
            Integer i = new Integer(1);
 
            if (i.intValue() > 0)
 
            {
 
                System.out.println(i);
 
            }
 
            else
 
            {
 
                System.err.println(i);
 
                return null;
 
            }
 
            return "Hello";
 
        }
 
        catch (Exception dae)
 
        {
 
            System.err.println(dae);
 
            throw new RuntimeException(dae);
 
        }
 
 
 
 
 
 
 
    }
5、典型数据库操作代码还原 反编译后代码
    public HashMap f5()
 
    {
 
 
 
        Connection conn = null;
 
        HashMap hashmap;
 
 
 
        HashMap map = new HashMap();
 
        Class.forName("");
 
        conn = DriverManager.getConnection("jdbc:odbc:");
 
        PreparedStatement pstmt = conn.prepareStatement("select * from table");
 
        pstmt.setString(1, "param");
 
        String columnVallue;
 
        for(ResultSet rs = pstmt.executeQuery(); rs.next(); map.put(columnVallue, ""))
 
            columnVallue = rs.getString("column");
 
 
 
        hashmap = map;
 
        if(conn != null)
 
            try
 
            {
 
                conn.close();
 
            }
 
            catch(SQLException sqlce)
 
            {
 
                sqlce.printStackTrace();
 
            }
 
        return hashmap;
 
        ClassNotFoundException cnfe;
 
        cnfe;
 
        cnfe.printStackTrace();
 
        if(conn != null)
 
            try
 
            {
 
                conn.close();
 
            }
 
            catch(SQLException sqlce)
 
            {
 
                sqlce.printStackTrace();
 
            }
 
        break MISSING_BLOCK_LABEL_188;
 
        SQLException sqle;
 
        sqle;
 
        sqle.printStackTrace();
 
        if(conn != null)
 
            try
 
            {
 
                conn.close();
 
            }
 
            catch(SQLException sqlce)
 
            {
 
                sqlce.printStackTrace();
 
            }
 
        break MISSING_BLOCK_LABEL_188;
 
        Exception exception;
 
        exception;
 
        if(conn != null)
 
            try
 
            {
 
                conn.close();
 
            }
 
            catch(SQLException sqlce)
 
            {
 
                sqlce.printStackTrace();
 
            }
 
        throw exception;
 
        return null;
 
    }
 
实际代码如下:
    public HashMap f5()
 
    {
 
 
 
        Connection conn = null;
 
        try
 
        {
 
            HashMap map = new HashMap();
 
            Class.forName("");
 
            conn = DriverManager.getConnection("jdbc:odbc:");
 
            PreparedStatement pstmt = conn.prepareStatement("select * from table");
 
            pstmt.setString(1, "param");
 
            ResultSet rs = pstmt.executeQuery();
 
            while (rs.next())
 
            {
 
                String columnVallue = rs.getString("column");
 
                map.put(columnVallue, "");
 
            }
 
            return map;
 
        }
 
        catch (ClassNotFoundException cnfe)
 
        {
 
            cnfe.printStackTrace();
 
        }
 
        catch (SQLException sqle)
 
        {
 
            sqle.printStackTrace();
 
        }
 
        finally
 
        {
 
            if (conn != null)
 
            {
 
                try
 
                {
 
                    conn.close();
 
                }
 
                catch (SQLException sqlce)
 
                {
 
                    sqlce.printStackTrace();
 
                }
 
            }
 
        }
 
        return null;
 
    }
 
6、两层异常嵌套代码还原 反编译后的代码
    public int f6()
 
    {
 
        int i = cal.getTime().compareTo(new Date());
 
        System.out.println("finally");
 
        return i;
 
        Exception e1;
 
        e1;
 
        e1.printStackTrace();
 
        System.out.println("finally");
 
        return -1;
 
        Exception e2;
 
        e2;
 
        e2.printStackTrace();
 
        System.out.println("finally");
 
        return -2;
 
        Exception exception;
 
        exception;
 
        System.out.println("finally");
 
        throw exception;
 
    }
 
实际代码
    public int f6()
 
    {
 
        try
 
        {
 
            try
 
            {
 
                return cal.getTime().compareTo(new Date());
 
            }
 
            catch (Exception e1)
 
            {
 
                e1.printStackTrace();
 
                return -1;
 
            }
 
        }
 
        catch (Exception e2)
 
        {
 
            e2.printStackTrace();
 
            return -2;
 
        }
 
        finally
 
        {
 
            System.out.println("finally");
 
        }
 
    }
 
7、非常诡异的代码 反编译后的代码
    public int f7()
 
    {
 
        int i = cal.getTime().compareTo(new Date());
 
        System.out.println("finally");
 
        return i;
 
        Exception e1;
 
        e1;
 
        e1.printStackTrace();
 
_L2:
 
        System.out.println("finally");
 
        return -1;
 
        Exception e2;
 
        e2;
 
        e2.printStackTrace();
 
        if(true) goto _L2; else goto _L1
 
_L1:
 
        Exception exception;
 
        exception;
 
        System.out.println("finally");
 
        throw exception;
 
    }
 
原始代码
    public int f7()
 
    {
 
        try
 
        {
 
            try
 
            {
 
                return cal.getTime().compareTo(new Date());
 
            }
 
            catch (Exception e1)
 
            {
 
                e1.printStackTrace();
 
                return -1;
 
            }
 
        }
 
        catch (Exception e2)
 
        {
 
            e2.printStackTrace();
 
            return -1;
 
        }
 
        finally
 
        {
 
            System.out.println("finally");
 
        }
 
    }

 ———————————————— 
版权声明:本文为CSDN博主「z3h」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z3h/article/details/2640522

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值