BPB, File System 분석 (FAT 12)
File System 분석
db 0xEB 0x58 0x90
; jmp 0x58
; nop
BS_jmpBoot / 오프셋 0바이트 / 크기 3바이트 / 0xeb는 오프셋 1바이트(1바이트 채워주기 위해 0x90 nop(no operation)을 사용한다. 0xe9는 오프셋 2바이트
db 0x57 0x49 0x4E 0x49 0x4D 0x41 0x47 0x45
아스키 코드 값이 들어감
0x57 = W 0x49 = I 0x4E = N 0x49 = I 0x4D = M 0x41 = A 0x47 = G 0x45 = E
BS_OEMName / 오프셋 3바이트 / 크기 8바이트 / WINIMAGE가 들어가있다. 이 부분에 호환성 문제로 보통 MSWIN4.1을 넣는다.
db 0x00 0x02
<------------ Little-endian
BPB_BytsPerSec / 오프셋 11바이트 / 크기 2 바이트 / 섹터당 바이트수 /512, 1024, 2048, 4096을 넣을 수 있다. 호환성 문제로 512를 사용한다.
db 0x01
BPB_SecPerClus / 오프셋 13바이트 / 크기 1바이트 / 클러스터당 섹터수 / 이부분은 0보다 커야하고 1,2,4,8,16,32,64,128이 허용된다.
db 0x01
0x00
BPB_RsvdSecCnt / 오프셋 14바이트
/ 크기 2바이트
/ reserved된 섹터수 /
이 필드는 0이되면안되는데
FAT12, FAT16에서 1이여야
한다. MBR이 첫번째 섹터를
차지하기 때문에 reserved 해준다.
db 0x02
BPB_NumFATs / 오프셋 16바이트 / 크기 1바이트 / FAT Entry개수. FAT File System 에서 이 필드는 항상 2를 가지고 있는데 FAT Entry가 날아가면 나머지 한개를 참조한다.
db 0xE0 0x00
00E0 = 224
BPB_R ootEntCnt / 오프셋 17바이트 / 크기 2바이트 / 루트 디렉토리의 32바이트짜리의 디렉토리 요소 항목의 수이다.
Db 0x40 db0x0b
BPB_TotSec16 / 오프셋 19바이트 / 크기 2바이트 / 볼륨의 모든 4개 부분에 있는 총 16비트짜리인섹터의 개수이다.
db 0xf0
BPB_Media / 오프셋 21바이트 / 크기 1바이트 / 0xF8은 고정된 매체의 표준 값이다. Removable media에 0xF0이 자주 쓰임. 여기서 fat12 (floppy disk) 파일 시스템이기 때문에 0xf0이다.
Db 0x09 0x00
BPB_FATSz16 / 오프셋 22바이트 / 크기 2바이트 / 한개의 FAT에서 차지하고 있는 FAT12, FAT16의 16비트 개수.
Db 0x12 0x00
BPB_SecPerTrk / 오프셋 22바이트 / 크기 2바이트 / 인터럽트13번을 위한 트랙당 섹터수.
Db 0x02 0x00
BPB_NumHeads / 오프셋 26바이트 / 크기 2바이트 / 인터럽트 13번을 위한 헤드의 수
db 0x00 0x00 0x00 0x00
BPB_HiddSec / 오프셋 28바이트 / 크기 4바이트 / 숨겨진 섹터의 개수이다. 이 섹터들은 파티션이 없으면 항상 0이어야한다.
Db 0x00 0x00 0x00 0x00
BPB_TotSec32 / 오프셋 32 바이트 / 크기 4바이트 볼륨에 있는 섹터의 총32비트의 개수
db 0x0
BS_DrvNum / 오프셋 36바이트 / 크기 1바이트 / 인터럽트 13번의 드라이브 번호이다. 플로피 디스크일경우 0x00, 하드디스크일 경우 0x80으로 인터럽트13번에서 세팅한다.
Db 0x0
BS_Reserved1 / 오프셋 37바이트 / 크기 1바이트 / Reserved해놓는다. Windows NT 에서 사용.
FAT 형식은 반드시 0으로 세팅되야함
db 0x29
BS_BootSig / 오프셋 38바이트 / 크기 1바이트 / 확장된 부트 표시이다.
Db 0x19 0x34 0x10 0x25
BS_VolID / 오프셋 39바이트 / 크기 4바이트 / 볼륨 시리얼 넘버이다.
Db 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
BS_VolLab / 오프셋 43바이트 / 크기 1바이트 / 루트디렉토리 안에 11바이트의 볼륨라벨이 기록된다.
Db 0x46 0x41 0x54 0x31 0x32 0x20 0x20 0x20
BS_FilSysType / 오프셋 54바이트 / 크기 8바이트 / “FAT12 “ 여기에 기록된다고 해도 BPB에 영향을 주지 못하고 단지 정보만 알려주는 문자열이다.
"GOODJOB "은 DIR_NAME(짧은 이름)이다.
0x10은 DIR_Attr를 말한다.(0x10 디렉토리임)
그 후 1바이트는 DIR_NTRes로서, Window NT가 아니므로 0이다.
그 후 1바이트는 1/10초 단위의 파일 생성 시각으로, 0으로 되어있다.
그 후 2바이트는 파일이 생성된 시간으로, 0으로 되어있다.
그 후 2바이트는 파일이 생성된 날짜로, 0으로 되어있다.
그 후 2바이트는 최근에 접근한 날자로, 0으로 되어있다.
그 후 2바이트는 엔트리의 첫번째 클러스터 번호이다. FAT12에선 항상 0이다.
그 후 2바이트는 최근에 쓰여진 시간으로, 0xA399, 41881로 되어있다.
그 후 2바이트는 최근에 쓰여진 날짜로, 0x395F, 14687로 되어있다.
그 후 2바이트는 엔트리의 첫번째 클러스터 번호로, 로우 0x2이다.
으 후 4바이트는 FileSize로, 0으로 되어있다.
20
그 다음 있는 파일은
"ABC TXT"은 DIR_NAME(짧은 이름)이다.
0x10은 DIR_Attr를 말한다.(0x0 파일임)
그 후 1바이트는 DIR_NTRes로서, Window NT를 위해서 0x18이다.
그 후 1바이트는 1/10초 단위의 파일 생성 시각으로, 0x8E65, 36453으로 되어있다.
그 후 2바이트는 파일이 생성된 시간으로, 0x5FAC, 24492로 되어있다.
그 후 2바이트는 파일이 생성된 날짜로, 0x39, 57로 되어있다.
그 후 2바이트는 최근에 접근한 날자로, 0으로 되어있다.
그 후 2바이트는 엔트리의 첫번째 클러스터 번호이다. FAT12에선 항상 0이다.
그 후 2바이트는 최근에 쓰여진 시간으로, 0xA399, 41881로 되어있다.
그 후 2바이트는 최근에 쓰여진 날짜로, 0x395F, 14687로 되어있다.
그 후 2바이트는 엔트리의 첫번째 클러스터 번호로, 로우 0x4이다.
으 후 4바이트는
FileSize로,
16byte으로 되어있다.
(Reference)
FAT(File Allocation Table) 영문 문서
- pdf. MS에서 제공한 FAT 문서. 원제 "General Overview of On-Disk Format".