포렌식 시간에 C언어로 vhd 파일(디스크 이미지 파일)을 읽어서 섹터 단위(512Byte)로 출력하는 프로그램을 구현하였다.
먼저, MBR(Master Boot Record)에 대해 정리해보자.
MBR은 저장매체의 첫 번째 섹터 (LBA 0)에 위치하는 512 바이트 크기의 영역이다.
처음 446 바이트는 부트 코드 (boot code) 영역, 64 바이트는 파티션 테이블 (partition table) 영역, 마지막 2 바이트는 시그니처 (signature)를 나타낸다.
아래는 프로그램을 C언어로 구현한 코드이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE* fp = NULL;
int menuNumber = 0;
char filePath[100];
int fileSize = 0;
int sectorCount = 0;
// Using for print sector info
int i, j, ch = 0;
int columnNum = 0;
int offset = 0;
int curSec = 0;
char data[20] = {};
data[19] = '\0';
printf(" 파일 경로 입력 : ");
scanf("%s", &filePath);
if ((fp = fopen(filePath, "rb")) == NULL) {
printf("File Open Error!");
} else {
printf("\n");
printf(" 파일 오픈 성공!\n\n");
fseek(fp, 0, SEEK_END); // 파일 포인터를 파일의 끝으로 이동시킴
fileSize = ftell(fp);
sectorCount = (fileSize / 512);
fseek(fp, 0, SEEK_SET);
}
printf(" 출력할 섹터 위치를 입력해주세요(0 ~ %d) : ", sectorCount);
scanf("%d", &curSec);
for (int k = 0; k < curSec; k++) {
offset += 512;
}
// 선택한 섹터로 이동
fseek(fp, offset, SEEK_SET);
printf("offset(h) ");
// 열 번호 출력 (16진수로 0 - 16까지)
for (columnNum = 0; columnNum < 16; columnNum++) {
printf("%02X ", columnNum);
}
printf("\n\n");
for (i = 0; i < 32; i++) {
// 행 주소 출력 (시작 offset)
printf("%08X ", offset);
offset += 16;
for (j = 0; j < 16; j++) {
if ((ch = fgetc(fp)) != 'EOF') {
printf(" %02X", ch);
if (int(ch) <= 15 || int(ch) >= 127) {
data[j] = '.';
} else {
data[j] = char(ch);
}
}
}
// 16진수 코드를 char로 바꾼 데이터 출력
printf(" %s\n", data);
}
printf("\n\n");
}
1바이트 씩 읽어서 한 줄에 16바이트씩 32줄로 출력했다. 아래는 출력화면을 캡처한 사진이다.
먼저, vhd 이미지 파일이 위치한 경로를 입력한 후, 파일이 정상적으로 open 되었다면 출력할 섹터 위치를 입력한다.
(섹터 구간은 0부터 섹터 개수-1까지)
섹터 위치를 입력하면 다음과 같이 Hex값이 출력된다.
'과제' 카테고리의 다른 글
[forensic] 디스크 이미지 분석 프로그램 (2) (0) | 2019.03.22 |
---|