[转]U盘隐藏文件恢复程序+源码

    有时要帮朋友处理一下U盘,他们的U盘经常被病毒感染后,U盘内的所有文件都不见了,只有一些快捷方式,偶尔一次还可以接受,经常干这样的事就觉得很麻烦了,尤其是被隐藏的文件特别多的时候。今天中午还有个朋友让我帮他恢复U盘中的隐藏文件。。。
所以今天抽空写了个程序,把这些活让程序去干。
程序说明:
1.程序可以自动检测U盘盘符,自己也可以进行更改
2.程序可以恢复U盘中的所有隐藏数据
3.程序会删除U盘中所有的快捷方式和inf文件

将源程序公布出来,想用的朋友可以根据自己的需求改改,然后自己编译就行。

      源码如下:

 

/********************************************************************
*本程序用于恢复U盘或移动硬盘中被病毒隐藏的文件
*本人不承诺所有文件均能恢复,也不对因使用此程序造成的数据损失负责
*作者:flyreally
*http://hi.baidu.com/flyreally
**********************************************************************/

#include <windows.h>
#include <stdio.h>
#include <string.h>

int main()
{
    char              DriveLetterString[128];   //用于存放各盘的逻辑盘符,
    char              usb_name[4];
    char              cmd[MAX_PATH + 14] = "attrib -s -h ";
    char              *p = DriveLetterString;     
    char              tmp;
    DWORD             num;  
    unsigned int      times;
    WIN32_FIND_DATA   findData;
    HANDLE            hFind;  
   
    puts("本程序用于恢复您的U盘或移动硬盘中被病毒隐藏的文件");
    puts("本人不保证所有文件均能恢复,也不对因用此程序造成的数据损失负责");
    puts("Author: flyreally\nhttp://hi.baidu.com/flyreally");
   
    memset(DriveLetterString,0,128);    
    GetLogicalDriveStrings(128,DriveLetterString);//取得所有盘符      
    //判断是否存在软驱A、B
    if ('A' == *DriveLetterString || 'a' == *DriveLetterString)
    {
            p = DriveLetterString + 4;             

            if ('B' == *(DriveLetterString + 4) || 'b' == *(DriveLetterString + 4))
            {
                    p = DriveLetterString + 8;                              
            }        
    }
   
    //取得盘符数目,每位代表一个盘符,
    num = GetLogicalDrives();                                     
    /*统计盘符数量*/
    for (num >>= 2, times = 0; 0 != num; num >>= 1, ++times)
            ;
   
    /*遍历所有盘符寻找USB盘符*/
    while (1)
    {        
          /*获取设备类型并判读是否为USB设备*/
          if (DRIVE_REMOVABLE == GetDriveType(p + 4 * (times - 1)))       
          {
                   strcpy(usb_name, p + 4 * (times - 1));   
                   break;        
          }
          /*未发现USB设备*/
          if (0 == --times)
          {
                  printf("您的PC上未发现USB设备,请插入后重新运行本程序!\n");
                  getchar();
                  exit(1);         
          }          
    }
   
    printf("您的USB盘符为%s ,确认请按回车键,否则请输入您的USB盘符(仅需输入盘符字母):\n", usb_name);
    /* 如果检测到的USB盘符不对,则重新设置盘符*/
    if ('\n' != (tmp = getchar()))
    {
            *usb_name = tmp;             
    }
   
    puts("U盘清理中...");
   
    /*讲USB盘符设置为当前目录*/
    SetCurrentDirectory(usb_name);
   
    /*查找第一个文件*/
    hFind = FindFirstFile("*.*", &findData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        /*获取到文件信息*/
        do
        {     
                /*判断是否为隐藏文件或文件夹*/
                if (FILE_ATTRIBUTE_DIRECTORY & findData.dwFileAttributes ||
                    FILE_ATTRIBUTE_HIDDEN    & findData.dwFileAttributes ||                
                    FILE_ATTRIBUTE_SYSTEM    & findData.dwFileAttributes )
                {
                        strcpy(cmd, "attrib -s -h ");
                        strcat(cmd, findData.cFileName);
                        system(cmd);                            
                }
           
                /*删除autorun.inf和病毒创建的快捷方式*/
                if (FILE_ATTRIBUTE_ARCHIVE & findData.dwFileAttributes)
                {
                        static char *q = NULL;
                   
                        q = findData.cFileName + strlen(findData.cFileName) - 3;
                  
                        if ((0 == strcmp(q, "lnk")) || (0 == strcmp(q, "inf")) ||
                            (0 == strcmp(q, "LNK")) || (0 == strcmp(q, "INF")) )
                        {
                                remove(findData.cFileName);
                        }                                                        
                }  
        } while (FindNextFile(hFind,&findData));
    }
    FindClose(hFind);  

    puts("清理完毕!");
   
    getchar();

    return 0;
}

posted @ 2010-08-06 16:42  tokeep  阅读(543)  评论(0编辑  收藏  举报