android反编译apk后,java文件中出现的一些类似乱码的问题

参考文章:点击打开链接

概述

java class  反编译之后,偶尔回碰到一些不正常的代码

例如:

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语句反编译后产生的。

下面,就简单介绍一下,一些反编译后的特殊代码的还原规则。



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");
			} 
		} 


你可能感兴趣的:(android-问题)