分析jad反编译实例错码问题,希望能与大家讨论总结并得到指导.
具体实例反编译后出现错码的地方有:
1.类中的变量与方法错码:部分变量名与方法名使用了java程序中的保留关键字,语法上应该是错误的,部分代码如下
    public String new;
private String case;
private boolean goto;
private boolean g;
private long try;
private boolean else;
      public boolean ka()
{
return h.y();
} public boolean if()
{
return h.void();
} public int for()
{
return h.l();
}   问题分析:关于此类是一个软件的jar包中的class文件,该软件的运行使用此类文件,证明此类在该软件的运行环境中正常加载,故可断点此类无语法错误。但将此类引用到jdk的classpath环境或ide工具的工作环境,利用集成工具生成此类的实例,在实例中用“.”自动提示实例方法与变量中也与上拷贝代码一样,出现java保留关键字的变量与方法,此类应该在编译生成class文件时报错。如何生成了如前分析的正确jar包。个人分析源代码作者使用的jdk不可能从根本上改写了jdk的关键字,故此问题是否也因jad反编译的问题,加密?请各位兄弟姐妹,帮忙分析分析,谢谢!
   用jad.exe反编译命令的某些参数反编译得到的结果稍有不同,命令参数(参考:http://cnnt.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-119813-uid-42851.html)
      -pf <pfx>- 用数字名字给所有的成员变量加前缀 (default: _fld)
      -pe <pfx>-给没有用到的异常的名字加前缀
      -pl <pfx>- 给局部变量用数字名字加前缀 (default: _lcl)
      -pm <pfx>-给方法用数字名字加前缀 (default: _mth)
   得到java代码如下,将下java代码编译成class文件却不可以在原软件运行环境中使用,故代码的解析还原应该有问题,具体反编码得到的部分java源码如下:(截取部分,与上代码进行对照)
    public String _fldnew;

public int _mthfor()
{
return h.l();
}2.类中第二类错误代码,粘贴一方法反编码的代码 private String c()
throws FioranoException
{
RandomAccessFile raf = null;
String s;
raf = new RandomAccessFile(new, "r");
if (raf.length() <= 0L)
break MISSING_BLOCK_LABEL_35; s = raf.readLine();
return s;
String s1;
try
{
s1 = null;
}
catch (IOException e)
{
throw new FioranoException(e.getMessage());
}
return s1;
local;
try
{
if (raf != null)
raf.close();
}
catch (IOException e) { }
JVM INSTR ret 5;
}
    出现了break MISSING_BLOCK_LABEL_35;与JVM INSTR ret 5;代码,此部分代码作怎样的还原。关于JVM代码查找相关资料好像由于此部分代码由于jad无法反编译而不确定的部分,可能因为源程序加密。若是如此只能根据相关逻辑,推测改写还原代码了。java是强制性检验编译的,若仅有上问题一中java代码可否编码生成正常使用的class文件,请大家帮忙分析一下,若能正常编码通过,个人分析在上文中提到的软件环境中应能正常使用,因为根据上面分析此软件的其它相关类中引用的方法与该类中定义的一致。

解决方案 »

  1.   

    1,你的jar包是什么jar,不会是jdk里面的jar包吧。
    2,不明白你是什么意思
      

  2.   

    谢谢你的答复
    1.此class文件在软件的生成包解压出来的,此生成包由安装程序自动生成,格式为zip,软件执行时引用的此包内的class文件了。所以并非jdk的源程序包
    2.我要做的是打开此class的源码java文件进行一定的改写,以对此软件进行研究。故中间有个反编译class生成源码,再编译新java文件生成新class文件的过程,现在的问题是:在反编译过程中生成了有错误的java文件,怎样改正此错误,并进行编译成生成新的class(用此替代原包中的文件),达到我目的。
      

  3.   

    谢谢你的答复 
    1.此class文件在软件的生成包解压出来的,此生成包由安装程序自动生成,格式为zip,软件执行时引用的此包内的class文件了。所以并非jdk的源程序包 
    2.我要做的是打开此class的源码java文件进行一定的改写,以对此软件进行研究。故中间有个反编译class生成源码,再编译新java文件生成新class文件的过程,现在的问题是:在反编译过程中生成了有错误的java文件,怎样改正此错误,并进行编译成生成新的class(用此替代原包中的文件),达到我目的。
      

  4.   

    出现java保留关键字的变量与方法,是因为代码被混淆过了。这段时间我也在研究JAVA的反编译。不过也没有头绪。
      

  5.   

    由于jad的bug,它不能够完整的解析出来try-catch-finally 语句,所以编译出来的java文件不能够再次编译。详情他们的官网已经说了。至于java类我们也不必太强求了,仅仅是看它主要的东西就好了。-------------------------------------------
    网上找的答案..
      

  6.   

    哎,不知道如何才能还原那个class....有门!
      

  7.   

    我也遇到了乱七八糟的混淆代码..晕.,...
                break; /* Loop/switch isn't completed */
            }
            abyte2;
            JVM INSTR monitorexit ;
    //        a.a("[ProgressInputStream] run(): " + k + " Bytes gelesen");
    //        a.a("[ProgressInputStream] run(): insges. " + c + " Bytes uebertragen");
    _L1:
            if(!f) goto _L3; else goto _L2
    _L2:
            if(f)
            {
      

  8.   

    你反编译器有点落后,或者是你jdk版本不够。
      

  9.   

     private RBACCallbackHandler _$13370 = null;
      private static final RBACPolicy _$13371 = new RBACPolicy();
      private RBACRequestContext _$5929 = null;  static
      {
        Policy.setPolicy(_$13371);
      }怎么处理?
      

  10.   

    推荐JD-GUI,如果真的被混淆了,估计没啥办法了
      

  11.   

    这个反编译要jdk多少才能用???
      

  12.   

    这个东西很脑袋疼的,你研究源代码还不如研究一下软件功能,然后自己来重写一个~
    关于jd,我测试过一点代码,
    有次反编译出来的时候发现while死循环不见了~
    还有就是比较普遍的,io流读写的时候会在循环中加入int **=**,重复定义变量之嫌~
    再个就是内部类的问题,没有仔细研究,看着就烦
    不知道楼主有没有客服这些问题?