FAT32 파일을 읽을 때 데이터가 업데이트되지 않음
11709 단어 USB,filesystemLinux,Windows,FAT32,
저번의 글의 계속.
이런 조사가 필요한 경과를 알고 싶은 사람은 지난번 페이지를 보십시오.
범죄 현장. - 이상한 증거를 남긴 용의자.
저번 글에서는 리눅스를 이용해 위조 USB 메모리를 만들어 기계 A에서 파일을 쓴 파일을 수집 서버로 보내는 장치에 대해 논의했다.
A~C의 3가지 방식을 설계하고 실험하였으며, 성능 면에서 우수한inotify API의 방식 C를 채택하였다.
사용방식 C의 동작 테스트를 위해 기기 A 대신 Windows 10의 PC를 연결해 테스트한다.안정적으로 읽고 쓸 수 있는지 확인하기 위해 큰 mpeg 파일을 위조 USB 메모리에 복사해 애니메이션 재생 소프트웨어로 위조 USB 메모리에 있는 mpeg 파일을 문제없이 재생할 수 있는지 확인했다.
어느 날, 애니메이션 재생 테스트를 하는 도중에 실행 방식 C의 처리를 잊어버린 것을 발견했다.실행을 시작한 후 이상한 현상이 발생하였다.
파일을 열면 첫 번째 MODIFY 이벤트만 나타납니다.
나는 파일의 최종 방문 날짜가 업데이트되었기 때문인 줄 알았는데, 만약 그렇다면 두 번째 방문에서도 MODIFY 사건이 발생할 것이다.근데 안 일어나요.
다행히도 이런 이상한 동작이 일어나도 새 파일을 수집 서버에 보내는 기기 자체에는 영향을 주지 않는다.나는 그날 조사를 포기했다.
다음날 다시 시도해보니 어제 모디프 활동이 없었던 파일에 모디프 활동이 나왔다.두 번 다시 안 나와.다른 파일로 해봐도 마찬가지야.
동작에 지장이 없다고는 하지만 원인 불명의 행동을 하는 기계를 본 공연에서 사용하고 싶지는 않다.
용의자를 찾아라.
잠입수사 - Wireshark USB 패킷 캡처
도대체 뭘 썼는지 조사하기 위해 윈도 PC에 와이어싱을 설치하고 USB 패키지를 꺼냈다.쓰기의 경우 SCSI Write 명령이 있어야 합니다.
그 행위를 더욱 잘 이해하기 위해 우리는 아날로그 USB 메모리의 환경을 조사했다.
USB 스토리지의 0x6000(=24576) 섹터에서 8개의 섹터를 썼습니다.
들여다보다mpg、2.mpg 등 파일 이름을 볼 수 있습니다.디렉토리 엔트리(Explorer에서 볼 수 있는 파일 일람)에 기록된 것으로 보입니다.
나는 다른 파일을 재생성하려고 시도해도 0x6000에서 온 데이터를 다시 쓴다는 것을 알았다.
과학수사-어떻게 개작
그럼 도대체 무엇에서 무엇으로 개작한 걸까.mpeg 재생 전후를 비교해 보세요.
mpeg가 재생성되기 전에 시스템 B에 디렉터리 항목의 정보를 저장합니다. 재생성 후의 정보와 비교하면
$ printf "%d\n" 0x6000
24576
$ sudo dd if=/dev/mmcblk2p9 of=before skip=24576 count=8
ここでWindows上で2.mpgを動画再生
$ sudo dd if=/dev/mmcblk2p9 of=after skip=24576 count=8
$ hexdump -C before > before.txt
$ hexdump -C after > after.txt
$ diff -u before.txt after.txt
--- before.txt 2020-08-25 05:38:20.931494077 +0000
+++ after.txt 2020-08-25 05:40:56.488613081 +0000
@@ -5,7 +5,7 @@
00000040 53 59 53 54 45 4d 7e 31 20 20 20 16 00 42 94 86 |SYSTEM~1 ..B..|
00000050 16 51 16 51 00 00 95 86 16 51 03 00 00 00 00 00 |.Q.Q.....Q......|
00000060 31 20 20 20 20 20 20 20 4d 50 47 20 10 6d 9c 86 |1 MPG .m..|
-00000070 16 51 18 51 00 00 00 9b dc 50 06 00 00 90 f0 0d |.Q.Q.....P......|
+00000070 16 51 19 51 00 00 00 9b dc 50 06 00 00 90 f0 0d |.Q.Q.....P......|
00000080 32 20 20 20 20 20 20 20 4d 50 47 20 10 66 ac 86 |2 MPG .f..|
00000090 16 51 18 51 00 00 00 9b dc 50 8b 6f 00 90 f0 0d |.Q.Q.....P.o....|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
데이터를 보면 디렉토리 엔트리 32바이트가 파일 1개의 양인 것 같습니다.2. mpg 시작 0x12 바이트에서 0x18에서 0x19로 변경합니다.
이 값은 무엇입니까?위키백과로 찾아보니 Last Access Date, 즉 마지막으로 파일에 방문한 연월일인 것 같다.
https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system#Directory_entry
확실히 0x18=24, 0x19=25, 어제는 24일, 오늘은 25일입니다.
불량이 아니라 규격입니다.용의자는 범죄를 저지르지 않았다.
알았어. 다시 쓰는 게 마지막 방문 날이야.최종적으로 '날짜 시간' 을 방문하는 것이 아니라, 시간이 포함되지 않은 연월일까지의 정보입니다.
이날 처음 파일을 참조하면 MODIFY 사건이 발생하고, 같은 날 같은 파일을 참조해도 MODIFY 사건이 발생하지 않는 이유를 뒤늦게 알게 된다.
현장조사-혐의가 해소된 용의자와 함께
위키백과는 누구나 편집할 수 있기 때문에 내용의 신뢰성이 매우 낮다.이게 정말 방문 시간인가요, 더 확실한 정보로 확인하세요.
Linux는 FAT32의 파일 시스템을 읽고 쓸 수 있습니다.Linux 코어 소스 FAT32의 처리를 보면 알 수 있을 것 같습니다.
기기 B에서 사용하는 Linux kerner는 4.4.194입니다.FAT32 처리에서 최종 방문일(atime) 장소를 발췌 처리해 보았다.
디렉토리 엔트리의 데이터 구조
kernel/include/uapi/linux/msdos_fs.h
#define MSDOS_NAME 11 /* maximum name length */
struct msdos_dir_entry {
__u8 name[MSDOS_NAME];/* name and extension */
__u8 attr; /* attribute bits */
__u8 lcase; /* Case for base and extension */
__u8 ctime_cs; /* Creation time, centiseconds (0-199) */
__le16 ctime; /* Creation time */
__le16 cdate; /* Creation date */
__le16 adate; /* Last access date */ // 最終アクセス年月日
__le16 starthi; /* High 16 bits of cluster in FAT32 */
__le16 time,date,start;/* time, date and first cluster */
__le32 size; /* file size (in bytes) */
};
디렉터리 항목의 파일의 데이터 구조입니다.u8은 1바이트,le16은 2바이트입니다.32바이트 파일 1개.offset0x12에서 2바이트는 최종 방문 날짜입니다.
위의 차분 데이터에서 0x19 0x51은 이와 같습니다.
액세스 날짜 업데이트 처리
linux/fs/fat/inode.c: 최종 방문 날짜 업데이트
void fat_time_unix2fat(struct msdos_sb_info *sbi, struct timespec *ts,
__le16 *time, __le16 *date, u8 *time_cs)
{
// 一部略
fat_time_unix2fat(sbi, &inode->i_atime, &atime,
&raw_entry->adate, NULL);
linux/fs/fat/misc.c:unix time를 연월일의 2byte로 변환합니다.void fat_time_unix2fat(struct msdos_sb_info *sbi, struct timespec *ts,
__le16 *time, __le16 *date, u8 *time_cs)
{
// 一部略
/* from 1900 -> from 1980 */
tm.tm_year -= 80;
/* 0~11 -> 1~12 */
tm.tm_mon++;
*date = cpu_to_le16(tm.tm_year << 9 | tm.tm_mon << 5 | tm.tm_mday);
위의 절차에 따라 0x19 0x51을 날짜로 변환해 보십시오.2020년 8월 25일.이것은 서류를 읽는 날이다.방문시간하고 맞나봐요.용의자를 석방해라.
증거가 바로 눈앞에 있다
실제로 익스플로러에서 USB 메모리에 있는 mpeg 파일의 속성을 열면 방문 날짜를 볼 수 있다.
날짜만 있고 시간이 없다는 것도 알고.
처음부터 이걸 봤다면 이유를 알 수 있었을 거야.
도구 사용
Reference
이 문제에 관하여(FAT32 파일을 읽을 때 데이터가 업데이트되지 않음), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/diizuka-biz/items/dbefefc92d026d1cc0a3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)