资源简介

给定一个文件,输出该文件的目录项和文件所占的所有簇号,目前调试通过卷标为F:的U盘下任意文件的搜索,可能存在一些问题,仅供参考。 代码参考:https://www.debugrun.com/a/zAfLt9k.html

资源截图

代码片段和文件信息

/* 
Wang Guangren - Wuhan University - Cypherspace Security - Software - Task - 2018.03.26
Reference: https://www.debugrun.com/a/zAfLt9k.html - 用C语言完成对文件的定位和打印目录项以及所占簇号
*/ 
#include
#include
#include
#include
#include
#include
#include

#include
#include
using namespace std;

int main()
{
struct _finddata_t f;
int ok;

char filename[20];
cout<<“请输入一个F盘中完整的文件路径(例如F:\\find.txt)“< cin >> filename;
ok = _findfirst(filename &f);

cout<
cout<<“-----------文件基本信息-----------“<
cout<
cout << “文件名称:“ << f.name << endl;
cout << “文件字节:“ << f.size << endl;

//创建时间
struct tm *cp;
cp = gmtime(&f.time_create);
cout << “文件创建时间为:“ << (1900+cp->tm_year) << “年“ << (1+cp->tm_mon) << “月“ << (cp->tm_mday) << “日“<
//上一次访问时间 
struct tm *fp;
fp = gmtime(&f.time_access);
cout << “文件上一次访问时间为:“ << (1900+fp->tm_year) << “年“ << (1+fp->tm_mon) << “月“ << (fp->tm_mday) << “日“<
//上一次修改时间
struct tm *wp;
wp = gmtime(&f.time_write);
cout << “文件上一次修改时间为:“ << (1900+wp->tm_year) << “年“ << (1+wp->tm_mon) << “月“ << (wp->tm_mday) << “日“<


cout<
cout<<“-----------文件搜索信息-----------“<
cout<


//打开磁盘的0扇区
HANDLE hDev;
hDev = CreateFile(“\\\\.\\F:“ GENERIC_READ FILE_SHARE_WRITE|FILE_SHARE_READ 0 OPEN_EXISTING 0 0);
if(hDev == INVALID_HANDLE_VALUE)
{
cout << “CreateFile Error!“ << endl;
DWORD ret = GetLastError();
cout << “error“ << ret << endl;
}


unsigned char Buffers[1024] = {0};
DWORD startRet;
ReadFile(hDev Buffers 1024 &startRet 0);

DWORD mftlocal=0;
for(int i=0; i<4; i++)
{
mftlocal += Buffers[48+i]<<(i*8);
}
cout << “根MFT起始簇号:“ << mftlocal << endl;

//设置到MFT的第一个簇,得到关于MFT表项的自己属性和分块
LARGE_INTEGER locate3;
locate3.QuadPart = ((DWORD64)mftlocal*8*512);
BOOL o3 = SetFilePointerEx(hDev locate3 0 FILE_BEGIN);
if(o3==0)
{
cout << “指针设置失败“ << endl;

unsigned char Buffer3[1024] = {0};
DWORD dwRet3 = 0;//将读取成功的字节数放在里面 
ReadFile(hDev Buffer3 1024 &dwRet3 0);

//如果读文件失败
if(dwRet3 < 0)
{
cout << “ReadFile Error!“ << endl;
DWORD ret = GetLastError();
cout << “error“ << ret << endl;
}

int local2;
for(int i=0; i<1024; i++)
{
if(Buffer3[i]==128 && Buffer3[i+4]==72)
{
local2 = i;
}
}
local2 = local2+64; //定位到第一个rundata

//找到根目录的MFT 
LARGE_INTEGER locate;
locate.QuadPart = ((DWORD)(mftlocal*8+10)*512);
BOOL o=SetFilePointerEx(hDev locate 0 FILE_BEGIN);
if(o==0) cout << “指针设置失败“ <
//设置两个扇区大小来读取MFT
unsigned char Buffer[1024]={0};

DWORD dwRet = 0;
ReadFile(hDev Buffer 1024 &dwRet 0);

//如果读文件失败
if(dwRet < 0)
{
cout << “ReadFile Error!“ << endl;
DWORD ret = GetLastError();
cout << “error“ << ret << endl;
}

//找A0属性来确定根目录扇区 
int A0local=0;
for(DWORD i=0; i<1020; i++)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-03-26 14:23  pics_of_result\
     文件      106774  2018-03-26 14:21  pics_of_result\pic001.png
     文件       77370  2018-03-26 14:21  pics_of_result\pic002.png
     文件      106176  2018-03-26 14:22  pics_of_result\pic003.png
     文件      115332  2018-03-26 14:22  pics_of_result\pic004.png
     文件      148586  2018-03-26 14:22  pics_of_result\pic005.png
     文件        8386  2018-03-26 14:15  read.cpp
     文件     2261776  2018-03-26 14:15  read.exe

评论

共有 条评论