한땀한땀 정성들인 코딩

파일관리 본문

자격증/정보보안기사

파일관리

romance penguin 2017. 2. 7. 16:00
반응형

파일시스템 정의

-os에서 보조기억장치에 저장되는 파일을 관리하는 자료구조



윈도우


파일할당 테이블 FAT

-속해 있는 영역

-여유공간

-저장되어있는 디스크


FAT32

-윈도우98

-속도빠름

-파일 4gb이상 사용불가

-드라이브 32gb사용 불가


NTFS

-윈도우 xp

-보안성

-대용량 파일

-사용자 제한



FAT

-부트레코드 : 볼륨의 첫번쨰 섹터

-파일 할당 테이블 : 클러스터를 관리하는 테이블 저장공간

-루트 디렉토리 : fat16에만

(4) Data Area

Data Area는 실제 데이터들이 저장되는 영역을 말한다.
데이터는 클러스터 단위로 저장이 되는데 데이터가 한 개 클러스터 보다 크게 되면 클러스터를 더 할당하여 저장하게 된다.
이 경우 만약 저장 후 클러스터의 공간이 남아있다하더라도 이미 사용한 클러스터이기 때문에 다른 파일/디렉토리의 데이터를 저장할 수 없다.
실제 데이터를 저장할때는 파일이냐 디렉토리냐에 따라 저장 방식에 차이가 있는데 만약 파일이라면 클러스터에 파일의 내용이 직접적으로 저장이 되며
디렉토리라면 Directory Entry 라는 구조체 형식으로 저장이 된다.

[그림 4-9] Directory Entry 구조

- Name : 파일/디렉토리의 이름, 대문자로 최대 8자까지 넣을 수 있으며 남는 공간은 0x20으로 채워진다.
   단 만약 해당 파일/디렉토리가 지워진 경우에는 최고 상위 bit가 0xE5로 채워진다.
- Extender : 확장자, 대문자로 최대 3자리까지 입력이 가능하며 이 역시 남는 공간은 0x20으로 채워지는데 디렉토리의 
   경우에도 이 공간이 0x20으로 채워진다.
- Attribute : 해당 Directory Entry의 용도를 기록하는 항목으로 System File은 0x04로, 서브 디렉토리의 경우 0x10, 일반 
   파일은 0x20, LFN 이 적용되었다면 0xF0로 채워진다.
- NT Resource : Windows NT 의 예약된 공간으로 항상 0으로 채워져 있다.
- Create Time Tenth : 파일이 생성된 시간을 1/10 초 단위로 기록하는 항목.
- Create Time : 파일 생성 시간으로 상위 5bit는 초, 다음 6bit는 분, 마지막 5bit는 시를 의미한다. 다른 값은 일반적으로 
   식별하는 시간이 맞으나 초의 경우 값이 1증가할때마다 2초씩 증가한다.
- Create Date : 생성 날짜로 상위 5bit는 일, 다음 4bit는 월, 마지막 7bit는 년을 의미한다. 단 년도의 경우 1980년으로 
   부터의 오프셋인데 만약 11이라면 1980+11=1991년을 의미한다.
- Last Access Date : 가장 최근의 읽기/쓰기를 한 날자를 의미한다.
- First Cluster High 2Byte : 파일의 첫 번째 클러스터 번호의 상위 2Byte를 말한다.
- Write Time : 최근 파일 수정 시간을 말하며 파일 생성 역시 쓰기로 간주하기 때문에 파일 최소 생성 시에는 이 Write 
   Time과 Create Time 이 일치한다.
- Write Date : 최근 수정 일자로 파일 최초 생성시에는 Create Date와 일치한다.
- First Cluster Low 2Byte : 파일의 첫 번째 클러스터의 하위 2Byte를 말한다.
- File Size : 파일의 크기를 의미하며 단위는 Byte이다. 만약 디렉토리라면 이 항목은 0으로 채워진다.


출처: http://hyd3.tistory.com/125 [hYd3's Diary]


fat의 구조

(4) Data Area

Data Area는 실제 데이터들이 저장되는 영역을 말한다.
데이터는 클러스터 단위로 저장이 되는데 데이터가 한 개 클러스터 보다 크게 되면 클러스터를 더 할당하여 저장하게 된다.
이 경우 만약 저장 후 클러스터의 공간이 남아있다하더라도 이미 사용한 클러스터이기 때문에 다른 파일/디렉토리의 데이터를 저장할 수 없다.
실제 데이터를 저장할때는 파일이냐 디렉토리냐에 따라 저장 방식에 차이가 있는데 만약 파일이라면 클러스터에 파일의 내용이 직접적으로 저장이 되며
디렉토리라면 Directory Entry 라는 구조체 형식으로 저장이 된다.

[그림 4-9] Directory Entry 구조

- Name : 파일/디렉토리의 이름, 대문자로 최대 8자까지 넣을 수 있으며 남는 공간은 0x20으로 채워진다.
   단 만약 해당 파일/디렉토리가 지워진 경우에는 최고 상위 bit가 0xE5로 채워진다.
- Extender : 확장자, 대문자로 최대 3자리까지 입력이 가능하며 이 역시 남는 공간은 0x20으로 채워지는데 디렉토리의 
   경우에도 이 공간이 0x20으로 채워진다.
- Attribute : 해당 Directory Entry의 용도를 기록하는 항목으로 System File은 0x04로, 서브 디렉토리의 경우 0x10, 일반 
   파일은 0x20, LFN 이 적용되었다면 0xF0로 채워진다.
- NT Resource : Windows NT 의 예약된 공간으로 항상 0으로 채워져 있다.
- Create Time Tenth : 파일이 생성된 시간을 1/10 초 단위로 기록하는 항목.
- Create Time : 파일 생성 시간으로 상위 5bit는 초, 다음 6bit는 분, 마지막 5bit는 시를 의미한다. 다른 값은 일반적으로 
   식별하는 시간이 맞으나 초의 경우 값이 1증가할때마다 2초씩 증가한다.
- Create Date : 생성 날짜로 상위 5bit는 일, 다음 4bit는 월, 마지막 7bit는 년을 의미한다. 단 년도의 경우 1980년으로 
   부터의 오프셋인데 만약 11이라면 1980+11=1991년을 의미한다.
- Last Access Date : 가장 최근의 읽기/쓰기를 한 날자를 의미한다.
- First Cluster High 2Byte : 파일의 첫 번째 클러스터 번호의 상위 2Byte를 말한다.
- Write Time : 최근 파일 수정 시간을 말하며 파일 생성 역시 쓰기로 간주하기 때문에 파일 최소 생성 시에는 이 Write 
   Time과 Create Time 이 일치한다.
- Write Date : 최근 수정 일자로 파일 최초 생성시에는 Create Date와 일치한다.
- First Cluster Low 2Byte : 파일의 첫 번째 클러스터의 하위 2Byte를 말한다.
- File Size : 파일의 크기를 의미하며 단위는 Byte이다. 만약 디렉토리라면 이 항목은 0으로 채워진다.


출처: http://hyd3.tistory.com/125 [hYd3's Diary]
/10 초 단위로 기록하는 항목.
- Create Time : 파일 생성 시간으로 상위 5bit는 초, 다음 6bit는 분, 마지막 5bit는 시를 의미한다. 다른 값은 일반적으로 
   식별하는 시간이 맞으나 초의 경우 값이 1증가할때마다 2초씩 증가한다.
- Create Date : 생성 날짜로 상위 5bit는 일, 다음 4bit는 월, 마지막 7bit는 년을 의미한다. 단 년도의 경우 1980년으로 
   부터의 오프셋인데 만약 11이라면 1980+11=1991년을 의미한다.
- Last Access Date : 가장 최근의 읽기/쓰기를 한 날자를 의미한다.
- First Cluster High 2Byte : 파일의 첫 번째 클러스터 번호의 상위 2Byte를 말한다.
- Write Time : 최근 파일 수정 시간을 말하며 파일 생성 역시 쓰기로 간주하기 때문에 파일 최소 생성 시에는 이 Wri


출처: http://hyd3.tistory.com/125 [hYd3's Diary]

http://hyd3.tistory.com/125






NTFS

-부트레코드

-윈도우 부팅을 위한 기계어코드

-볼륨의 크기

-크럴스터 크기

-MFT시작주소

-1개의 섹터


-마스터 파일 테이블 MFT

-파일,디렉터리정보

-MFT entry의 집합

-MFT entry는 하나의 파일,디렉토리에 대한 내용

-파일의 정보가 많은경우 여러개의 MFT entry사용

-0~16 entry는 시스템 파일용


-데이터영역

-클러스터 단위로 읽기 쓰기 진행


#define    U8        unsigned char

#define    S8        char

#define    U16    unsigned short

#define    U32    unsigned    int

#define    S32    int

#define    U64    unsigned __int64

 

typedef    struct _VOL_struct{

    U32        Drive;

    U64        VolBeginSec;

    U64        MFTStartSec;

    U64        MFTMirrStartSec;

    U32        ClusSize;

    U32        SecPerClus;

    U64        TotalSec;

    U32        SizeOfMFTEntry;

    U32        SizeOfIndexRecord;

}Volstruct;

 

#pragma pack(1)

typedef struct _NTFS_BPB_struct{

    U8            JmpBoot[3];

    U8            OEMName[8];

    U16        BytsPerSec;

    U8            SecPerClus;

    U16        RsvdSecCnt;

    U8            Unused1[5];

    U8            Media;

    U8            Unsed2[18];

    U64        TotalSector;

    U64        StartOfMFT;

    U64        StartOfMFTMirr;

    S8            SizeOfMFTEntry;

    U8            Unused3[3];

    S8            SizeOfIndexRecord;

    U8            Unused4[3];

    U64        SerialNumber;

    U32        Unused;

 

    U8            BootCodeArea[426];

 

    U16        Signature;

}NTFS_BPB;

#pragma pack()




#include <stdio.h>

#include <windows.h>

#include <stdlib.h>

#include "ntfs.h"

 

U32 HDD_read(U8    drv, U32 SecAddr, U32 blocks, U8* buf);

U32 get_BPB_info(NTFS_BPB* pBPB, Volstruct * pVol);

 

Volstruct gVol;

 

int main(void){

    NTFS_BPB    boot;

 

    gVol.Drive = 0x0; //드라이브 설정

    gVol.VolBeginSec = 0x800; //섹터 설정

 

    //저장 장치로부터 부트 레코드가 담긴 섹터를 읽어 메모리로 올림

    if(HDD_read(gVol.Drive, gVol.VolBeginSec, 1, (U8*) &boot) == 0){

        printf("Boot Sector Read Failed \n");

        return 1;

    }

 

    get_BPB_info(&boot, &gVol); // 읽어 들인 정보 분석

 

    printf("[[[[[ Volume Information ]]]]]\n"); //정보 출력

    printf("Total Sector \t = %I64d\n",        gVol.TotalSec);

    printf("Cluster Size \t = %d\n",            gVol.ClusSize);

    printf("MFT Start Sec \t = %d \n",        gVol.MFTStartSec);

    printf("MFTMIRR Start Sec \t =%d \n", gVol.MFTMirrStartSec);

    printf("Size of MFT Entry \t = %d\n",    gVol.SizeOfMFTEntry);

    printf("Size of Index Record \t = %d\n",gVol.SizeOfIndexRecord);

 

    return 0;

}

 

U32 get_BPB_info(NTFS_BPB* pBPB, Volstruct* pVol){

    pVol->ClusSize = pBPB->SecPerClus * pBPB->BytsPerSec;

    pVol->SecPerClus = pBPB->SecPerClus;

    pVol->MFTStartSec = pBPB->StartOfMFT * pBPB->SecPerClus + pVol->VolBeginSec;

    pVol->MFTMirrStartSec = pBPB->StartOfMFTMirr * pBPB->SecPerClus + pVol->VolBeginSec;

    pVol->TotalSec = pBPB->TotalSector;

    if(pBPB->SizeOfMFTEntry < 0){

        pVol->SizeOfMFTEntry = 1 << (pBPB->SizeOfMFTEntry * -1);

    }else{

        pVol->SizeOfMFTEntry = pBPB->SizeOfMFTEntry * pVol->ClusSize;

    }

 

    pVol->SizeOfIndexRecord = pBPB->SizeOfIndexRecord * pVol->ClusSize;

    return 1;

}

 

 

U32 HDD_read (U8 drv, U32 SecAddr, U32 blocks, U8* buf){

    U32 ret;

    U32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread;

 

    char cur_drv[100];

    HANDLE g_hDevice;

 

    sprintf_s(cur_drv,sizeof(cur_drv),"\\\\.\\PhysicalDrive%d",(U32)drv);

    g_hDevice=CreateFile(cur_drv, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

      

    if(g_hDevice==INVALID_HANDLE_VALUE)    return 0;

 

    ldistanceLow = SecAddr << 9;

    ldistanceHigh = SecAddr >> (32 - 9);

    dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN);

      

    if(dwpointer != 0xFFFFFFFF)    {

        bytestoread = blocks * 512;

        ret = ReadFile(g_hDevice, buf, bytestoread, (unsigned long*)&numread, NULL);

        if(ret)    ret = 1;        

        else        ret = 0;        

    }

      

    CloseHandle(g_hDevice);

    return ret;

}


부트 레코드를 읽는 코드


반응형

'자격증 > 정보보안기사' 카테고리의 다른 글

패스워드 크래킹  (0) 2017.02.07
리눅스 파일구조  (0) 2017.02.07
RAID 주변장치관리  (0) 2017.02.07
스풀링  (0) 2017.02.07
디스크 스케줄링  (0) 2017.02.07