資源簡介
給定一個文件,輸出該文件的目錄項和文件所占的所有簇號,目前調試通過卷標為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?<“文件名稱:“?< cout?<“文件字節:“?<
//創建時間
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!“?< DWORD?ret?=?GetLastError();
cout?<“error“?< }
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起始簇號:“?<
//設置到MFT的第一個簇,得到關于MFT表項的自己屬性和分塊
LARGE_INTEGER?locate3;
locate3.QuadPart?=?((DWORD64)mftlocal*8*512);
BOOL?o3?=?SetFilePointerEx(hDev?locate3?0?FILE_BEGIN);
if(o3==0)
{
cout?<“指針設置失敗“?< }?
unsigned?char?Buffer3[1024]?=?{0};
DWORD?dwRet3?=?0;//將讀取成功的字節數放在里面?
ReadFile(hDev?Buffer3?1024?&dwRet3?0);
//如果讀文件失敗
if(dwRet3?0)
{
cout?<“ReadFile?Error!“?< DWORD?ret?=?GetLastError();
cout?<“error“?< }
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!“?< DWORD?ret?=?GetLastError();
cout?<“error“?< }
//找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
評論
共有 條評論