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

时间:2025-03-23 08:18:44

 

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

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

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

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

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

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

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

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

文件夹运行即可.

/attachment/56/50307/65187/2333/

 

以下是主要用到的递归函数.调用时传入用户选择的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(,".") && (strcmp(,"..")) && ( & FILE_ATTRIBUTE_DIRECTORY)){
   //是目录但不是"."和".."
   process(dir+"//"+);
  }
  else if( strcmp(, ".") && strcmp(, ".."))     //不是"."和"..",只能是文件
  {
   CString srcFile = dir+"//"+;
   CFile cf(srcFile,CFile::modeRead);
   if(().Find(".class") > 0){          //是class文件
    CString path = (this->());
    CString destPath = this->destDir + path;
    {           //我喜欢把需要即时消失的操作放在{}中
     CFileFind cff;
     if(!(destPath)) SHCreateDirectoryEx(NULL,destPath,NULL); //mkdir -p
     ();
    }
    CString tmpDir = this->destDir +"//tmp"+ path;
    {
     CFileFind cff;
     if(!(tmpDir)) SHCreateDirectoryEx(NULL,tmpDir,NULL);
     ();
    }
    CFile cf1(tmpDir + "//" + ,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
    //copy class文件以便修改版本
    byte buf[512];
    int x = (buf,512);
    if(x > 8){
     buf[7] = 46;               //修改为1.4版
     (buf,x);
    }
    while(x = (buf,512)){
     (buf,x);
    }
    ();
    ();

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

   }
   else ();
  } 
 }
 while(FindNextFile(hFile,&fd));
}