做了一个java5.0/6.0的反编译工具.随意试用吧.

本文介绍了一个针对Java 5.0/6.0版本的反编译工具,该工具通过修改class文件版本并调用jad进行反编译。文章详细展示了递归处理目录结构以完成批量反编译的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

做了一个java5.0/6.0的反编译工具.随意试用吧.

其实就是做了一个外壳.对class文件修改版本后调用jad来反编译.

调用jad的过程用SW_SHOW显示到前台,目的是为了目标文件中已经存在相同的java文件,比如上一次

已经反编译了一次,没有删除时,jad提示要覆盖,如果在后台没有手工确认jad进程就死在进程列表中了.

最好是在反编译前前目标文件夹清空.

另外没有将临时文件夹自动清空是因为在循环调用ShellExecute时,WaitForSingleObject仍然会产生冲突.

而且程序递归牧举一次临时目录还不如手动在tmp上右键->删除来得方便.

使用的时候把jad5.exe和jad.exe放在相同目录下或将jad.exe放在PATH环境变量中.选择class所在文件夹和目标

文件夹运行即可.

http://www.cnjbb.org/attachment/56/50307/65187/2333/release.rar

 

以下是主要用到的递归函数.调用时传入用户选择的class文件的目录,也就是函数中的

this->srcDir.

函数中的this->destDir是目标目录.

 void Cjad5Dlg::process(CString dir){

 WIN32_FIND_DATA  fd;  
 ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));
 HANDLE   hFile;  
 hFile = FindFirstFile(dir+"//*",&fd);  
 do{
  if(strcmp(fd.cFileName,".") && (strcmp(fd.cFileName,"..")) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
   //是目录但不是"."和".."
   process(dir+"//"+fd.cFileName);
  }
  else if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, ".."))     //不是"."和"..",只能是文件
  {
   CString srcFile = dir+"//"+fd.cFileName;
   CFile cf(srcFile,CFile::modeRead);
   if(cf.GetFileName().Find(".class") > 0){          //是class文件
    CString path = dir.Mid(this->srcDir.GetLength());
    CString destPath = this->destDir + path;
    {           //我喜欢把需要即时消失的操作放在{}中
     CFileFind cff;
     if(!cff.FindFile(destPath)) SHCreateDirectoryEx(NULL,destPath,NULL); //mkdir -p
     cff.Close();
    }
    CString tmpDir = this->destDir +"//tmp"+ path;
    {
     CFileFind cff;
     if(!cff.FindFile(tmpDir)) SHCreateDirectoryEx(NULL,tmpDir,NULL);
     cff.Close();
    }
    CFile cf1(tmpDir + "//" + fd.cFileName,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
    //copy class文件以便修改版本
    byte buf[512];
    int x = cf.Read(buf,512);
    if(x > 8){
     buf[7] = 46;               //修改为1.4版
     cf1.Write(buf,x);
    }
    while(x = cf.Read(buf,512)){
     cf1.Write(buf,x);
    }
    cf1.Close();
    cf.Close();

    ShellExecute(NULL,NULL,"jad.exe"," -s java "+tmpDir+"//"+fd.cFileName,destPath,SW_SHOW);
    //调用jad返编译

   }
   else cf.Close();
  } 
 }
 while(FindNextFile(hFile,&fd));
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值