首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

[原创]文件删除[FAT32篇]解决方法

2012-03-03 
[原创]文件删除[FAT32篇]http://hi.baidu.com/baiganbybaiganmail:yymingh#gmail.com本人水平很菜,欢迎讨

[原创]文件删除[FAT32篇]
http://hi.baidu.com/baigan

by       baigan

mail   :   yymingh   #   gmail   .   com

本人水平很菜,欢迎讨论(代码写的极其丑陋,只是测试了一下功能)

最近用了一下金山文件粉碎器,这个软件号称如何如何强大,其实恐怕连简单的Ring3   HOOK都可以fack它.

在我的电脑上试用的过程中发现其不能够删除NTFS分区上的Running   File       (这部分也没细看),   可能是我的电脑的毛病也可能是金山的BUG   ,简单的说一下其在FAT32区上删除Running   File大致思路,

省略n多字....   CreateFile打开文件所在的盘   ,ReadFile读第一扇区的内容,定位一些数据得到根目录.

在根目录中搜索子目录(如果有),定位文件设置删除       ,猜想其说的不能恢复是遍历文件在硬盘的所有簇清除数据(只是猜测   ,   每看   ,也没实现这个),大概就这些,贴一段测试代码删除正在运行的文件(代码写的极其丑陋,hehe水平比较菜).但愿排版不会很乱


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

openDiskdelFile(PCHAR   chr);


int   main()
{
char   szBuffer[MAX_PATH]= "0 ";

          OPENFILENAME   file={0};
          file.lStructSize=sizeof(file);
          file.lpstrFile=szBuffer;
          file.nMaxFile=256;
          file.lpstrFilter= "All   Files\0*.* ";
          file.nFilterIndex=1;
printf( "-------------------------------------------- ");
printf( "\n ");
printf( "用于删除文件 ");
printf( "警告:\n ");
printf( "\t   1   .   只能运用在FAT32文件系统分区   \n ");
printf( "\t   2   .   稳定性我不敢保证 ");
printf( "\n ");
printf( "-------------------------------------------- ");

int   sc=0;
printf( "输入   7   转到删除文件   \n ");
scanf( "%d ",&sc);

if(sc==7)
{
if(::GetOpenFileName(&file))
{

      char   *pbuffer=strupr(file.lpstrFile);

      openDiskdelFile(pbuffer);
}
}


return   0;
}


//-----------------------------------------------------------
//-----------------------------------------------------------
//------------------------
//定义根目录结构体
typedef   struct   _FAT_32{
CHAR   name[11];
BYTE   attr;
BYTE   nouse1;
BYTE   nouse2;
BYTE   nouse3[2];
BYTE   nouse4[2];
BYTE   nouse5[2];
BYTE   nouse6[2];
BYTE   nouse7[2];
BYTE   nouse8[2];
BYTE   nouse9[2];
BYTE   nouse10[4];

}FAT_32,*PFAT_32;


//-------------------------
//定义全局变量
//求每扇区的字节数v
int   v;
//根目录所在的第一个簇号k
int   k;
//数据区起始m
int   m;
//每簇的扇区数j
int   j;
//数据开始地址n
int   n;
//根目录开始地址c
int   c;
//FAT表地址b
int   b;
//目录起始偏移地址p
int   p;
//缓冲区bBfuffer
//BYTE   bBuffer[512   *   32]   =   {0}   ;
BYTE   *   bBuffer;
//
char   ptrname[128][12]={0};


//-------------------------
void   delRunningFile(HANDLE   hDisk   ,int   execname,   int   caddr   ,int   x);
char   *   charto83ds(char   *   chr);
char   *   charto83ex(char   *   chr);
//-------------------------

openDiskdelFile(PCHAR   chr)


{
HANDLE   hDisk   ;
char   *   ptr;

char   shortchar[MAX_PATH];
char   pDiskPath[10]   =   "\\\\.\\ ";
BYTE   buffer[512]   =   {0}   ;

::GetShortPathName(chr,shortchar,MAX_PATH);
strncat(pDiskPath,shortchar,2);

bBuffer=(unsigned   char   *)malloc(512*32);//分配不成功导致Relrese版本失败

//   int   tsize=1;
//   while(tsize!=0)
//   {
ptr=strchr(shortchar, '\\ ');
ptr=ptr+1;
int   tsize=strcspn(ptr, "\\ ");
strncpy(ptrname[0],ptr,tsize);
//   }

int   i=1;
while(tsize!=0)
{
      ptr=strchr(ptr, '\\ ');
      if(ptr==NULL)
      {
        break;
      }
      ptr=ptr+1;
      tsize=strcspn(ptr, "\\ ");
      strncpy(ptrname[i],ptr,tsize);
      i++;
}

int   execname=i-1;


      __try   {
       
          hDisk   =   CreateFile   (   pDiskPath,   GENERIC_READ   |   GENERIC_WRITE,   \
              FILE_SHARE_READ|FILE_SHARE_WRITE,   NULL,   OPEN_EXISTING,   0,   0   )   ;
       
if   (   hDisk   ==   INVALID_HANDLE_VALUE   )
          {
              MessageBox   (   0,   "磁盘打开错误! ",   0,   0   )   ;
              return   0;
          }
       
          SetFilePointer   (   hDisk,   0,   0,   FILE_BEGIN   )   ;
          DWORD   dwReadByte   ;

ReadFile   (   hDisk,   (LPVOID)buffer,   512,   &dwReadByte,   NULL   )   ;

          if   (   dwReadByte   ==   0   )
          {
              MessageBox   (   0,   "磁盘读取错误! ",   0,   0   )   ;
              return   0;
          }
//----
//得到关键数据
v=buffer[12]   *   0x0100   +   buffer[11];
k=buffer[47]*0x01000000   +   buffer[46]*0x010000   +buffer[45]*0x0100+buffer[44];
int   BPB_RsvdSecCnt=buffer[15]   *   0x0100   +   buffer[14];
int   BPB_NumFATs=buffer[16];
int   BPB_FATSz32=buffer[39]*0x01000000   +   buffer[38]*0x010000   +buffer[37]*0x0100+buffer[36];
m=   BPB_RsvdSecCnt+BPB_NumFATs*BPB_FATSz32;
j=buffer[13];
n=m   *   v;
c=n;
b=BPB_RsvdSecCnt   *   v;
p=(m-k*j)*v;
//------

delRunningFile(hDisk   ,execname,   c   ,   0);


}//__try


__finally{
      CloseHandle   (   hDisk   )   ;
}
       

}


void   delRunningFile(HANDLE   hDisk   ,int   execname,   int   caddr   ,int   x)


{

//hDisk磁盘卷句柄,caddr目录地址
//用递归调用
unsigned   long   dwReadByte;

if(x <execname)
{

      //目录\\得到目录簇号
      //递归调用delRunningFile
   
      SetFilePointer   (   hDisk,caddr,   0,   FILE_BEGIN   )   ;
      memset(bBuffer,0,v*j);
      ReadFile   (   hDisk,   (LPVOID)bBuffer,   v   *   j,   &dwReadByte,   NULL   )   ;
      FAT_32   *   fat32;
      fat32=(FAT_32   *)bBuffer;
      int   nub=0;
      while(   nub <250)//*(fat32+nub*sizeof(FAT_32)   )!=0)
      {
//       if(   !   strncmp(fat32[nub].name,ptrname[x],11)   )
        char   pr1[11]={0x20};
        strncpy(pr1,charto83ds(ptrname[x]),11);
        pr1;
     
        if(   !   strncmp(fat32[nub].name,pr1,11)   )
        {
          int   mm=fat32[nub].attr;  
          WORD   mm7=fat32[nub].nouse6[1]*0x0100   +   fat32[nub].nouse6[0];
          WORD   mm8=fat32[nub].nouse9[1]*0x0100   +   fat32[nub].nouse9[0];

          DWORD   mm5=mm7*0x0100+mm8;
          int   mm6=mm5*j*v+p;   //子目录地址偏移

          //下一个目录

          x++;  
          delRunningFile(hDisk   ,execname,   mm6   ,   x);
          break;

        }
        nub++;

      }
      //读FAT确定目录所在的下一簇
      //以后添加该功能


}

else
{


      //找文件、删除文件

      SetFilePointer   (   hDisk,caddr,   0,   FILE_BEGIN   )   ;
      memset(bBuffer,0,v*j);
      ReadFile   (   hDisk,   (LPVOID)bBuffer,   v   *   j,   &dwReadByte,   NULL   )   ;
      FAT_32   *   fat32;
      fat32=(FAT_32   *)bBuffer;
         
      int   nub=0;
      while(nub <250)
      {
//         if(   !   strncmp(fat32[nub].name,ptrname[x],11)   )
        char   pr2[12]={0x20};
        strncpy(pr2,charto83ex(ptrname[x]),12);

        pr2;
        if(   !   strncmp(fat32[nub].name,pr2,11)   )
        {
          fat32[nub].name[0]=0xe5;  
          SetFilePointer   (   hDisk,caddr,   0,   FILE_BEGIN   )   ;
          WriteFile(hDisk,(LPVOID)bBuffer,   v   *   j,   &dwReadByte,   NULL   )   ;
          break;


        }
        nub++;

      }


}


}


char   *   charto83ds(char   *   chr)
{
char   name[12]={0};
char   nastr[12]={0x20};
strcpy(name,chr);

for(int   x=0;x <12;x++)
{
      if(name[x]!=0)
      {
        nastr[x]=name[x];
      }
      else
      {
        nastr[x]=0x20;
      }

}

return   nastr;

}


char   *   charto83ex(char   *   chr)
{

char   name[12]={0};
char   nastr[12]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
char   *   ptr;

strncpy(name,chr,12);

for(int   x=0;x <12;x++)
{
      if(name[x]!=0)
      {
        if(name[x]==0x2e)
        {
          nastr[8]=name[x+1];
          nastr[9]=name[x+2];
          nastr[0xa]=name[x+3];

          break;

        }
        nastr[x]=name[x];
      }
      else
      {
        nastr[x]=0x20;
      }

}


return   nastr;
}


 


[解决办法]
太长了,有空再看
[解决办法]
ditto........
[解决办法]
国产软件 都这样
[解决办法]
en,有兴趣的话请到我的blog看看
[解决办法]
最近用了一下金山文件粉碎器,这个软件号称如何如何强大,其实恐怕连简单的Ring3 HOOK都可以fack它.

这年头的人都爱用洋文来骂人,虽然洋文学得不咋的。跟哥们报告下,你这个洋文俺用金山词霸还没查出是啥意思呢。

另外本人始终认为:不要以为找到一个弱点破坏了一个系统就有多么不简单。建设的难度要远远大于破坏。windows漏洞一大堆,也没见人写个系统来替换之呀。
[解决办法]
同意楼上的
[解决办法]
喜欢这种程序-_-!

热点排行