近期项目中需要反编译修改多年前的class文件,经过反编译并修改后,用Eclipse编译和java命令行得到的class文件不同,对新class文件反编译后如下:
用Eclipse编译的class文件反编译:
package com.langchao.kpiengine.builder.baskpi;
import com.langchao.kpiengine.model.common.BasDimensionType;
import com.langchao.kpiengine.model.common.Kpi;
import com.langchao.kpiengine.model.common.KpiRelation;
import com.langchao.kpiengine.model.common.UnitKpi;
import com.langchao.kpiengine.search.BasKpiDefine;
import com.langchao.kpiengine.util.KpiConfigHelper;
import com.langchao.kpiengine.xml.digester.DigesterUtil;
import com.langchao.kpiengine.xml.digester.KpiDigester;
import com.langchao.kpiengine.xml.digester.KpiDigesterFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class BasKpiDefineDaoXmlImpl
implements BasKpiDefineDao
{
private static Log log = LogFactory.getLog("KpiQueryService");
public static final String RULE_CONFIG;
public static final String DEFINE_CONFIG;
private BasKpiDefine basKpiDefine;
static Class class$0;
// ERROR //
static
{
// Byte code:
// 0: ldc 20
// 2: invokestatic 22 org/apache/commons/logging/LogFactory:getLog (Ljava/lang/String;)Lorg/apache/commons/logging/Log;
// 5: putstatic 28 com/langchao/kpiengine/builder/baskpi/BasKpiDefineDaoXmlImpl:log Lorg/apache/commons/logging/Log;
// 8: new 30 java/lang/StringBuffer
// 11: dup
// 12: getstatic 32 com/langchao/kpiengine/builder/baskpi/BasKpiDefineDaoXmlImpl:class$0 Ljava/lang/Class;
// 15: dup
// 16: ifnonnull +28 -> 44
// 19: pop
// 20: ldc 34
// 22: invokestatic 36 java/lang/Class:forName (Ljava/lang/String;)Ljava/lang/Class;
// 25: dup
// 26: putstatic 32 com/langchao/kpiengine/builder/baskpi/BasKpiDefineDaoXmlImpl:class$0 Ljava/lang/Class;
// 29: goto +15 -> 44
// 32: new 42 java/lang/NoClassDefFoundError
// 35: dup_x1
// 36: swap
// 37: invokevirtual 44 java/lang/Throwable:getMessage ()Ljava/lang/String;
// 40: invokespecial 50 java/lang/NoClassDefFoundError:<init> (Ljava/lang/String;)V
// 43: athrow
// 44: invokevirtual 54 java/lang/Class:getPackage ()Ljava/lang/Package;
// 47: invokevirtual 58 java/lang/Package:getName ()Ljava/lang/String;
// 50: invokestatic 63 java/lang/String:valueOf (Ljava/lang/Object;)Ljava/lang/String;
// 53: invokespecial 69 java/lang/StringBuffer:<init> (Ljava/lang/String;)V
// 56: ldc 70
// 58: invokevirtual 72 java/lang/StringBuffer:append (Ljava/lang/String;)Ljava/lang/StringBuffer;
// 61: invokevirtual 76 java/lang/StringBuffer:toString ()Ljava/lang/String;
// 64: putstatic 79 com/langchao/kpiengine/builder/baskpi/BasKpiDefineDaoXmlImpl:RULE_CONFIG Ljava/lang/String;
// 67: new 30 java/lang/StringBuffer
// 70: dup
// 71: getstatic 32 com/langchao/kpiengine/builder/baskpi/BasKpiDefineDaoXmlImpl:class$0 Ljava/lang/Class;
// 74: dup
// 75: ifnonnull +28 -> 103
// 78: pop
// 79: ldc 34
// 81: invokestatic 36 java/lang/Class:forName (Ljava/lang/String;)Ljava/lang/Class;
// 84: dup
// 85: putstatic 32 com/langchao/kpiengine/builder/baskpi/BasKpiDefineDaoXmlImpl:class$0 Ljava/lang/Class;
// 88: goto +15 -> 103
// 91: new 42 java/lang/NoClassDefFoundError
// 94: dup_x1
// 95: swap
// 96: invokevirtual 44 java/lang/Throwable:getMessage ()Ljava/lang/String;
// 99: invokespecial 50 java/lang/NoClassDefFoundError:<init> (Ljava/lang/String;)V
// 102: athrow
// 103: invokevirtual 81 java/lang/Class:getName ()Ljava/lang/String;
// 106: invokestatic 63 java/lang/String:valueOf (Ljava/lang/Object;)Ljava/lang/String;
// 109: invokespecial 69 java/lang/StringBuffer:<init> (Ljava/lang/String;)V
// 112: ldc 82
// 114: invokevirtual 72 java/lang/StringBuffer:append (Ljava/lang/String;)Ljava/lang/StringBuffer;
// 117: invokevirtual 76 java/lang/StringBuffer:toString ()Ljava/lang/String;
// 120: putstatic 84 com/langchao/kpiengine/builder/baskpi/BasKpiDefineDaoXmlImpl:DEFINE_CONFIG Ljava/lang/String;
// 123: return
//
// Exception table:
// from to target type
// 20 25 32 java/lang/ClassNotFoundException
// 79 84 91 java/lang/ClassNotFoundException
}
用java命令行执行(如图):
C:\j2sdk1.4.2_16\bin>javac
–classpath .;kpimodelbuild.jar;commons-logging.jar;kpimodel.jar;commons-digester.jar;sax.jar;zhibiaoutil.jar
BasKpiDefineDaoXmlImpl.java
对用命令行新生成的class反编译:
package com.langchao.kpiengine.builder.baskpi;
import com.langchao.kpiengine.model.common.BasDimensionType;
import com.langchao.kpiengine.model.common.Kpi;
import com.langchao.kpiengine.model.common.KpiRelation;
import com.langchao.kpiengine.model.common.UnitKpi;
import com.langchao.kpiengine.search.BasKpiDefine;
import com.langchao.kpiengine.util.KpiConfigHelper;
import com.langchao.kpiengine.xml.digester.DigesterUtil;
import com.langchao.kpiengine.xml.digester.KpiDigester;
import com.langchao.kpiengine.xml.digester.KpiDigesterFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class BasKpiDefineDaoXmlImpl
implements BasKpiDefineDao
{
private static Log log = LogFactory.getLog("KpiQueryService");
public static final String RULE_CONFIG = BasKpiDefineDaoXmlImpl.class.getPackage().getName() + ".ruleconfig";
public static final String DEFINE_CONFIG = BasKpiDefineDaoXmlImpl.class.getName() + ".defineconfig";
private BasKpiDefine basKpiDefine;
经比对,Eclipse生成的对应的public static final String 静态常量的值在反编译后都没有了,而使用java命令行的反编译后正常。
问题找到了,但是原因未知。
- 大小: 37.2 KB
分享到:
相关推荐
在IT领域,特别是软件开发行业中,反编译技术是一项至关重要的技能,它不仅能够帮助开发者理解其他程序的内部逻辑,还能用于逆向工程、安全审计及版权分析等多个方面。本文将深入探讨Java Class文件的反编译原理,为...
JavaScript作为一种广泛使用的前端开发语言,其源代码通常是可见的,这使得代码容易受到静态反编译和逆向工程的攻击。为了应对这一挑战,开发者们通常会采用混淆(Obfuscation)技术来保护他们的JavaScript代码。 ...
反编译通常包括识别类结构、方法签名、变量定义、常量池解析等步骤。由于Java字节码是静态类型语言的中间表示,反编译器必须重建类的继承关系、接口实现以及方法体内的指令序列。 5. **注意事项**: 使用反编译...
6. **AndroGuard**:这是一个全面的Android分析工具集,包括反编译、动态分析和静态分析功能,可以用于安全审计和研究。 在使用这些工具时,开发者需要注意版权和法律问题,因为反编译他人的APK可能涉及侵犯知识...
### Android 反编译与smali语法:ROM适配的关键技术 #### 一、引言 在Android开发领域,反编译技术与smali语法的应用是进行深度定制、ROM适配以及逆向工程的重要手段。smali作为一种中间语言,与dalvik虚拟机紧密...
当APKtool不能完全恢复源代码时,Smali和baksmali可以作为更底层的分析工具来使用。 5. **dexdump**:这是Android SDK自带的一个命令行工具,可以将DEX文件的信息输出到文本格式,包括类、方法、字段等。虽然它不...
Android反编译工具就是这样的利器,它们能帮助开发者或者安全研究人员将APK文件转换回源代码形式,便于理解和研究。"Android反编译工具包"提供了这样的功能,包含了多种实用工具,如"Androidfby"和"apk2java"。 ...
### 安卓反编译dex文件格式实例分析 #### 第一部分:创造一个可供分析的Hello.dex ##### 测试环境 为了进行本次实验,我们需要搭建一个可靠的测试环境。本实验使用了以下配置: - **操作系统**: Ubuntu 12.04 64...
由于编译过程通常会丢失一些元数据,反编译并不总是能完全恢复原始代码,但apk2java通过复杂的算法和映射策略尽可能地还原代码结构和逻辑。 3. **APK文件结构**:APK是Android应用的打包格式,包含.dex文件(Dalvik...
通过查看反编译后的代码,可以发现潜在的安全漏洞,例如硬编码的API密钥、敏感数据明文存储、不安全的网络通信等。 5. **逆向工程应用**:开发者可以利用ApkDecompiler进行逆向工程,学习其他应用的优秀设计,或者...
在Android开发领域,APK反编译是一种常见技术,它涉及到对APK文件进行解包、解析和逆向工程,以获取应用的源代码、资源文件、字符串常量等信息。这一过程通常用于安全分析、漏洞挖掘、学习借鉴他人的编程技巧,以及...
jclasslib不仅能够展示类的结构,如字段、方法、常量池等,还可以将字节码反编译为接近原始源代码的格式,尽管它可能不完全相同于原始的Java源代码。 Kotlin是近年来越来越受欢迎的静态类型编程语言,与Java高度...
总的来说,.NET反编译必备IL指令集是提升开发者技能的重要部分,它提供了一种底层视角来理解和操作.NET代码,是.NET开发者进阶道路上不可或缺的知识。通过学习和掌握IL指令集,你可以更好地优化代码,解决复杂问题,...
- 常量应该是不可变的,这意味着它们一旦被赋值,就不能更改。这可以通过使用`final`关键字和避免任何可能改变状态的操作来实现。 8. **避免使用`public static final`的类属性**: - 尽管这可以创建全局常量,但...
Dll2C的反编译引擎可能采用了静态分析和动态分析相结合的方式,以尽可能准确地还原DLL的原始C代码结构。 标签“Dll2C”强调了这个工具的独特性和专一性,它是专门为DLL文件设计的反编译解决方案。这意味着Dll2C可能...
反编译是将已编译的代码转换回高级语言的过程,尽管不总是能完全恢复原始代码,但在逆向工程中具有重要意义。 总结,编译与开发设计是一门深奥且实用的技术,涵盖了从源代码到可执行程序的整个过程,包括各种语言...
apktool是一款强大的Android应用反编译工具,由布拉德...除非你拥有应用的源代码或者得到了作者的许可,否则不应随意对他人应用进行反编译。总的来说,apktool是一个强大的工具,但使用时需谨慎并尊重他人的知识产权。
十进制形式由数字和小数点组成,如0.888、3345.345、0.0,整数或小数部分可以为0,但是小数点不能省略。指数形式的写法是[±]数字[。数字]e[±]数字,其中e前后的内容为可选,但e及其前面的数字必须有,例如...
逆向工程不仅仅局限于简单的反编译操作,还包括深入理解程序的行为、逻辑以及潜在的安全漏洞。 **关键知识点:** 1. **静态分析**:通过对源代码或字节码进行分析,查找潜在的问题,如安全漏洞、编码错误等。静态...
- **逆向工程工具**:用于反编译或反汇编程序,以便理解其功能或查找漏洞。 综上所述,编译原理是一门涉及多个领域的综合性学科,对于软件开发人员来说具有极高的实用价值。通过深入学习编译原理,不仅可以更好地...