|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 lovemengx 于 2011-3-10 17:52 编辑
以下是修复程序代码:- #include <windows.h>
- #include <stdlib.h>
- #include <stdio.h>
- //#include <conio.h>
- //#include<unistd.h>
- bool scanvir(const char *filename,long offset,int length,void *vir);
- int viewfiles(char *directory,long offset,int length,void *vir);
- int pe_(const char *filename),pian();
- int att(const char *filename);
- char pe[]={0x00,0x00};
- int dell=0,count=0,i=0,a=0,g=0,r=0;
- char directory[MAX_PATH];//存储盘符或目录路径
- int main()
- {
- system("COLOR 0a");
- system("title 欢迎使用由【遲、钝dè豬】设计的程序~~");
- printf("\t程序名:【修复程序】\n");
- printf("*******************************************************************************");
- printf("\n\n\n\t\t\t\t【说明】");
- printf("\n\n\n\t此修复程序只对【破坏程序】的破坏起作用,仅仅只是针对其进行逆向修改...");
- printf("\n\n\t设计此程序的目的只是纯粹为了验证自己对病毒破坏原理的理解...");
- printf("\n\n\t作者保证本程序在不被恶意修改下所破坏的文件可以100%%恢复...");
- printf("\n\n\t此程序只修复PE文件,可以扩展其他文件...");
- printf("\n\n\t此代码公开只为技术交流...");
- printf("\n\n\n\t\t\t\t\t\t遲、钝dè豬 QQ:1007566569\n\n");
- printf("\t\t\t\t\t\t2010年12月16日 23:10 设计\n\n");
- printf("*******************************************************************************");
- system("pause");
- system("cls");
- printf("请输入要修复的分区或目录的绝对路径 [直接按回车键,默认C盘]:");
- gets(directory);
- pian();
- printf("共扫描了【%d】个文件\n\n",r);
- printf("发现了【%d】个PE文件\n\n",g);
- printf("修复成功【%d】个文件\n\n",i);
- printf("修复失败【%d】个文件\n\n",a);
- system("pause");
- }
-
- /************************************/
- /*-------------文件格式判断-----------*/
- /************************************/
- int pian()
- {
- /*-------------------PE文件--------------------------*/
- dell=1;
- count=viewfiles(directory,0x0,0x2,pe);
- if(count==0)dell=0;
- /*------------------可扩展其他格式文件--------------*/
- }
- /************************************/
- /*-------------修复动作选择-----------*/
- /************************************/
- int diao(const char *filename)
- {
- switch(dell)
- {
- /*--------------匹配文件格式进行对应破坏动作---------*/
- case 1: pe_(filename);g++; break;
- /*------------------可扩展其他格式文件--------------*/
- }
- }
- /************************************/
- /*-------------PE修复动作-----------*/
- /************************************/
- int pe_(const char *filename)
- {
- FILE *fp;
- char cih[]={0x4D,0x5A};
- if((fp=fopen(filename,"rb+"))==NULL)
- {
- printf("【修复失败】[%s]\n\n",filename);
- a++;
- }
- else
- {
- fseek(fp,0,0);
- fwrite(cih,sizeof(cih),1,fp);
- fclose(fp);
- printf("【修复成功】[%s]\n\n",filename);i++;
- }
- }
- /************************************/
- /*-------------匹配文件动作-----------*/
- /************************************/
- bool scanvir(const char *filename,long offset,int length,void *vir)
- {
- FILE *fp;
- char *rvir;
- bool b=false;
- fp=fopen(filename,"rb");//以只读二进制模式打开文件
- if(fp!=NULL)
- {
- fseek(fp,0,2);//将指针(光标)指向文件尾端
- if(offset+length<=ftell(fp))//文件偏移地址加长度<=指针(光标)尾端位置 判断文件是否存在特征代码段 即特征码的偏移量地址和长度
- {
- fseek(fp,offset,0);//将指针指向文件起始的offset偏移地址....
- rvir=new char[length];
- fread(rvir,length,1,fp);//读取 length 长度的代码并存入rvir变量
- b=memcmp(vir,rvir,length)==0;//把提取的代码与预定义的特征码比较
- delete[] rvir;
- }
- fclose(fp);
- }
- return b;
- }
- /************************************/
- /*-------------文件遍历函数-----------*/
- /************************************/
- int viewfiles(char *directory,long offset,int length,void *vir)
- {
- WIN32_FIND_DATA fdFindData;
- HANDLE hFind;
- char *filename;
- int count=0;
- BOOL done;
- filename=new char[strlen(directory)+5];
- strcpy(filename,directory);
- strcat(filename,"\\*.*");
- hFind=FindFirstFile(filename,&fdFindData);
- delete[] filename;
- done=hFind!=INVALID_HANDLE_VALUE;
- while(done)
- {
-
- if(strcmp(fdFindData.cFileName,".") && strcmp(fdFindData.cFileName,".."))
- {
- filename=new char[strlen(directory)+strlen(fdFindData.cFileName)+2];
- strcpy(filename,directory);
- strcat(filename,"\");
- strcat(filename,fdFindData.cFileName);
- if((fdFindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY)
- count+=viewfiles(filename,offset,length,vir);
- else
- {r++;
- if(scanvir(filename,offset,length,vir))
- {
- diao(filename);
- }
- }
- delete[] filename;
- }
- done=FindNextFile(hFind,&fdFindData);
- }
- FindClose(hFind);
- return(count);
- }
复制代码 编译环境是 DEV C++ 5.0 |
评分
-
查看全部评分
|