前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

java class反编译后的代码还原(一) - z3h的专栏,Java+Oracle...大杂烩 - 博客频道 - CSDN.NET z3h的专栏,Java+Oracle...大杂烩 http://blog.csdn.net/z3h 目录视图 摘要视图 订阅 新年新气象------CSDN2014新版导航就要跟大家见面了 2014年1月微软MVP当选名单揭晓! 消灭0回答,赢下载分 “我的2013”年度征文活动火爆进行中! 专访何海涛:“不正经”程序员的进阶之路 java class反编译后的代码还原(一) 分类: 工具 java技术 2008-06-05 22:48 6153人阅读 评论(2) 收藏 举报 javaclasslistjvmjdk语言 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 下载。 第一部分、for、while循环 1、普通的循环,原始 public void f1() { boolean flag = false; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { for (int i = 0; i < 10; i++) { flag = Boolean.getBoolean("sys"); if (flag) { System.exit(0); } } } } 反编译后的代码 public void f1() { boolean flag = false; if(Boolean.getBoolean("sys")) { System.out.println("sys"); } else { for(int i = 0; i < 10; i++) { flag = Boolean.getBoolean("sys"); if(flag) System.exit(0); } } } 2、反编译后代码变的很古怪,这是java原代码 public void f2() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { if (list[i] == 2) { continue check; } else { break; } } } } } Java反编译后的代码,部分逻辑丢失。 public void f2() { int list[] = { 1, 2, 3, 4 }; if(Boolean.getBoolean("sys")) System.out.println("sys"); else do { int i = 0; if(i >= list.length || list[i] != 2); } while(true); } 3、就是比f2()多了一行System.out.println("list[i]");,反编译后也挺怪的。源码如下: public void f3() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } else { break; } } } } } 反编译后的代码: public void f3() { int list[] = { 1, 2, 3, 4 }; if(Boolean.getBoolean("sys")) System.out.println("sys"); else do { int i; do i = 0; while(i >= list.length); System.out.println("list[i]"); if(list[i] != 2); } while(true); } 4、f2()中的break语言,移动了位置。源码如下: public void f4() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { if (list[i] == 2) { continue check; } } break; } } } 反编译后代码: public void f4() { int list[] = { 1, 2, 3, 4 }; int i; if(Boolean.getBoolean("sys")) System.out.println("sys"); else label0: do { for(i = 0; i < list.length; i++) if(list[i] == 2) continue label0; break; } while(true); } 5、就是比f4()多了一行System.out.println("list[i]");,反编译后相当怪的。源码如下: public void f5() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } break; } } } 反编译后比较晕的代码: public void f5() { int list[] = { 1, 2, 3, 4 }; if(!Boolean.getBoolean("sys")) goto _L2; else goto _L1 _L1: System.out.println("sys"); goto _L3 _L2: int i = 0; goto _L4 _L6: System.out.println("list[i]"); if(list[i] != 2) goto _L5; else goto _L2 _L5: i++; _L4: if(i < list.length) goto _L6; else goto _L3 _L3: } 6、就是比f5()多了一行System.exit(0);代码,但是差异确很大。源码如下: public void f6() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } System.exit(0); break; } } } 编译后代码,比f5()差异太大了。 public void f6() { int list[]; list = (new int[] { 1, 2, 3, 4 }); if(Boolean.getBoolean("sys")) { System.out.println("sys"); break MISSING_BLOCK_LABEL_75; } _L2: int i = 0; goto _L1 _L5: System.out.println("list[i]"); if(list[i] != 2) goto _L3; else goto _L2 _L3: i++; _L1: if(i < list.length) goto _L5; else goto _L4 _L4: System.exit(0); } 7、差异就是f6()中的System.exit(0);移动了位置,但是差异确很大。源码如下: public void f7() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { check: while (true) { for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } break; } System.exit(0); } } 编译后代码,比f6()差异太大了。 public void f7() { int list[]; list = (new int[] { 1, 2, 3, 4 }); if(Boolean.getBoolean("sys")) { System.out.println("sys"); break MISSING_BLOCK_LABEL_75; } _L2: int i = 0; goto _L1 _L5: System.out.println("list[i]"); if(list[i] != 2) goto _L3; else goto _L2 _L3: i++; _L1: if(i < list.length) goto _L5; else goto _L4 _L4: System.exit(0); } 8、逻辑和f7比没有变,只是多了一些System.out.println()代码。 public void f8() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { System.out.println(":check while"); check: while (true) { System.out.println("for"); for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { continue check; } } System.out.println("break"); break; } System.out.println("exit(0)"); System.exit(0); } } 反编译后的代码:和f7()比较一下,基本就可以确定反编译后的代码对应关系了。 public void f8() { int list[]; list = (new int[] { 1, 2, 3, 4 }); if(Boolean.getBoolean("sys")) { System.out.println("sys"); break MISSING_BLOCK_LABEL_107; } System.out.println(":check while"); _L2: int i; System.out.println("for"); i = 0; goto _L1 _L5: System.out.println("list[i]"); if(list[i] != 2) goto _L3; else goto _L2 _L3: i++; _L1: if(i < list.length) goto _L5; else goto _L4 _L4: System.out.println("break"); System.out.println("exit(0)"); System.exit(0); } 9、逻辑和f8比没有变,只是多了一行System.out.println()代码,导致了反编译后的/* Loop/switch isn&apos;t completed */。 public void f9() { int[] list = new int[] { 1, 2, 3, 4 }; if (Boolean.getBoolean("sys")) { System.out.println("sys"); } else { System.out.println(":check while"); check: while (true) { System.out.println("for"); for (int i = 0; i < list.length; i++) { System.out.println("list[i]"); if (list[i] == 2) { System.out.println("continue check"); continue check; } } System.out.println("break"); break; } System.out.println("exit(0)"); System.exit(0); } } } 反编译后的代码: public void f9() { int list[] = { 1, 2, 3, 4 }; if(!Boolean.getBoolean("sys")) goto _L2; else goto _L1 _L1: System.out.println("sys"); goto _L3 _L2: System.out.println(":check while"); _L5: System.out.println("for"); for(int i = 0; i < list.length; i++) { System.out.println("list[i]"); if(list[i] != 2) continue; System.out.println("continue check"); continue; /* Loop/switch isn&apos;t completed */ } System.out.println("break"); System.out.println("exit(0)"); System.exit(0); _L3: return; if(true) goto _L5; else goto _L4 _L4: } } 更多 上一篇:Java 企业开发常用技术资料汇集 下一篇:java class反编译后的代码还原(二) 查看评论 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP Spark HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 个人资料 z3h 访问:107087次 积分:1038分 排名:第12582名 原创:29篇 转载:1篇 译文:0篇 评论:19条 文章搜索 文章分类 iPhone(2) java技术(18) WebLogic(2) 工具(8) 数据库(4) 文章存档 2011年04月(1)2010年11月(2)2009年04月(1)2008年07月(1)2008年06月(2)2008年05月(2)2008年02月(1)2008年01月(8)2007年10月(1)2007年09月(5)2007年06月(2)2005年11月(1)2005年06月(2)2004年11月(1) 阅读排行 WindowsXP 系统“NTLDR is missing”问题的修复(系统已经修复成功)。(44918) java class反编译后的代码还原(二)(8782) java class反编译后的代码还原(一)(6152) JDK自带命令native2ascii的用法(5399) SWT异常: org.eclipse.swt.SWTException: Invalid thread access(3865) 编译Oracle中无效的对象的N中方法(3322) 利用Log4j 创建日志服务器(3238) Pledit 打开错误无法正常运行的解决办法(2778) Oracle 树形SQL语句,SYS_CONNECT_BY_PATH 函数(2767) 批量转换Uncode编码的文件(2692) 评论排行 WindowsXP 系统“NTLDR is missing”问题的修复(系统已经修复成功)。(9) java class反编译后的代码还原(二)(4) Oracle 树形SQL语句,SYS_CONNECT_BY_PATH 函数(2) java class反编译后的代码还原(一)(2) 编译Oracle中无效的对象的N中方法(1) SWT异常: org.eclipse.swt.SWTException: Invalid thread access(1) 完整的Java表达式算法,扩充容易。(0) Java反编译工具JAD的用法(0) 批量转换Uncode编码的文件(0) JDK自带命令native2ascii的用法(0) 推荐文章 最新评论 SWT异常: org.eclipse.swt.SWTException: Invalid thread access xixue_kang_: 有没有eswt 架包提供下载呢?? java class反编译后的代码还原(一) shansheng: 第一个for循环,没看出来原始的和反编译后的区别嘛 java class反编译后的代码还原(一) hairui: 好文章,不过我认为多数问题是jad的开发没有能够跟上jdk的发展造成的可惜现在也没有什么比jad更好... java class反编译后的代码还原(二) shuiyuezhiwen: label0: { searchDevices(); ... java class反编译后的代码还原(二) 匿名用户: 怎么没有break MISSING_BLOCK_LABEL_95的编译规律啊! 编译Oracle中无效的对象的N中方法 mxx24680: 文章真棒,赞! Oracle 树形SQL语句,SYS_CONNECT_BY_PATH 函数 z3h: select * from hier start with child=&#39;Tokyo&#39; connec... Oracle 树形SQL语句,SYS_CONNECT_BY_PATH 函数 wangzi: 跪求: 例如节点顺序为 /Asia/Japan/Tokyo 我现在知道了Japan,怎们能得到/A... java class反编译后的代码还原(二) SunflowerC: 像以下代码怎么还原,其他简单的还可以,这样的看的头晕了,请赐教,急等 public void ru... WindowsXP 系统“NTLDR is missing”问题的修复(系统已经修复成功)。 李兰君: 下载的程序安装不上 我家宝宝 茜茜的新浪博客 (RSS)茜茜的网易博客 (RSS)