如何使用C \ C ++隐藏显示隐藏文件和文件夹

时间:2010-02-05 21:45:08

标签: c++ c windows file

我想知道如何以编程方式隐藏文件,但仍然隐藏了文件或文件夹,并显示了从资源管理器的工具 - >文件夹选项启用显示隐藏文件和文件夹。

6 个答案:

答案 0 :(得分:4)

没有用户模式API来隐藏“显示隐藏文件”中的文件,这是一件好事。

执行此操作的唯一方法是让代码在内核中运行。几年前索尼“意外”安装在用户计算机上的rootkit,当他们试图阻止CD被发送时,可以做到这一点。但是,没有合法用于隐藏系统管理员和超级用户的文件。

答案 1 :(得分:3)

您希望#include'ing Windows.h提供SetFileAttributes函数:http://msdn.microsoft.com/en-us/library/aa365535%28VS.85%29.aspx

在代码中:

BOOL result = SetFileAttributes(L"c:\path\to\file", FILE_ATTRIBUTE_HIDDEN);

至于保持文件隐藏在“显示隐藏文件”选项中,这更加困难,而且我无法想到这样做的合理理由 - 唯一的程序是用于恶意目的的rootkit。

答案 2 :(得分:3)

我很确定这是不可能的,因为它会是一个安全漏洞(程序可能会将未知文件放在您无法看到或删除的硬盘上)。

甚至可以看到Windows系统文件。

答案 3 :(得分:2)

使用文件系统过滤器驱动程序。但既然你不得不问 - 就是不要这样做。不要试图在这里粗鲁,只是这是一项很难做到的任务。

答案 4 :(得分:0)

正如之前许多人所说,完全“隐藏”这样的文件没有直接的方法。

如果你可以接受不是真正隐藏文件而只是模糊它,你总是可以将它嵌入到一个虚拟文件中。获取要隐藏的文件,构建容器文件以保存它,并使用随机名称命名该虚拟文件。例如,您可以将实际文件的文件名放在虚拟文件的偏移512处,并将文件的内容从偏移1024开始,每1KB插入64字节的随机数据。用空格填充末尾到最近的4KB的倍数,用随机字节填充空白空间,并生成用于文件名的随机字符序列。现在,您可以“隐藏”文件,同时它仍然可以在文件系统中看到。

然而,这仅仅是“security by obscurity”,可以被一位聪明的攻击者用十六进制编辑器击败。

如果您只是想确保文件对临时文件系统浏览器不可见,您可以随时压缩文件,加密文件并随机化文件名。如果您需要能够在“隐藏”时按原样访问/执行该文件,那么您可能(希望)运气不佳。

答案 5 :(得分:0)

此程序用于显示系统驱动器中的所有隐藏文件和文件夹,即使系统受到病毒和蠕虫的影响,它也可以正常运行,通常,某些病毒会以隐藏状态更改文件和文件夹,这脚本将帮助您再次查看文件和文件夹。主要功能是无需安装即可播放。

请从我的技术博客中找到源代码-http://www.algonuts.info/how-to-show-hidden-files-and-folders-using-c.html

#include<iostream>
#include<conio.h>
#include<dirent.h>
#include<dir.h>
#include<process.h>
#include<string.h>
#include<stdio.h>
#include<io.h>
#include<dos.h>
#include<sys/stat.h>

struct ffblk vfile;
unsigned long int udata;
char ch,present[MAXPATH];

int next_directory(char *);
void scan_directory(char *);

char base[]="X:\\";

using namespace std;

int main(int account,char *arg[],char *env[])
{   
    clrscr();
    getcwd(present,MAXPATH);

    DIR *dir; 
    struct dirent *temp;
    cout<<"\nWelcome to Unhidden for identify the hidden files";
    cout<<"\n\nEnter drive:";
    cin>>ch;

    base[0]=ch;
    if((dir = opendir(base)) == NULL)
    { 
        clrscr();
        cout<<"\nError : Derive not found ";
        getch(); 
        exit(0); 
    }

    scan_directory(base);
    while((temp = readdir(dir)) != NULL)
    {
        char  *directory = (char *) malloc(3+strlen(temp->d_name)+1);
        strcpy(directory,base);
        strcat(directory,temp->d_name);
        next_directory(directory);
        free(directory);
    }
    closedir(dir);

    clrscr();
    cout<<"\nSystem: Successfully Unhidden it";
    sleep(3);

    return 0;
}

int next_directory(char *path)
{
    int count=0;
    DIR *dirtemp; 
    char *hold,*temp;
    struct dirent *ptemp;  

    hold=path;
    if ((dirtemp = opendir(path)) != NULL)
    scan_directory(path);
    else
    return 0;

    while((ptemp = readdir(dirtemp)) != NULL)
    {     
        char *directory = (char *) malloc(1+strlen(ptemp->d_name)+1);
        directory[0]='\\';
        strcpy(directory+1,ptemp->d_name);
        if(directory[1]!='\.')
        {
            count=strlen(hold);
            temp = (char *) malloc(strlen(hold)+strlen(directory)+1);
            strcpy(temp,hold);
            strcat(temp,directory);
            free(directory);
            if(opendir(temp)!=NULL)
            next_directory(temp); 
            temp[count]='\0'; 
            hold=temp;
        }
        else
        free(directory);
    }
    closedir(dirtemp);
    return 0;
}

void scan_directory(char *tempo)
{
    cout<<"\n"<<tempo;
    unsigned count;
    if(present[0]==tempo[0])
    chdir(tempo);  
    else
    {
        setdisk(tempo[0]-65);
        chdir(tempo); 
    }

    udata = findfirst("*.*",&vfile,0x02);
    while(!udata)
    {  
        _dos_getfileattr(vfile.ff_name,&count);
        if (count & _A_HIDDEN)
        {
            _dos_getfileattr(vfile.ff_name,&count);
            count=count & 248;
            _dos_setfileattr(vfile.ff_name,count);
        }
        udata=findnext(&vfile);
    }

    if(present[0]==tempo[0])    
    system("cd\\");
    chdir(present); 
}