FAT32 파일을 읽을 때 데이터가 업데이트되지 않음

개시하다
저번의 글의 계속.
이런 조사가 필요한 경과를 알고 싶은 사람은 지난번 페이지를 보십시오.
범죄 현장. - 이상한 증거를 남긴 용의자.
저번 글에서는 리눅스를 이용해 위조 USB 메모리를 만들어 기계 A에서 파일을 쓴 파일을 수집 서버로 보내는 장치에 대해 논의했다.
A~C의 3가지 방식을 설계하고 실험하였으며, 성능 면에서 우수한inotify API의 방식 C를 채택하였다.
사용방식 C의 동작 테스트를 위해 기기 A 대신 Windows 10의 PC를 연결해 테스트한다.안정적으로 읽고 쓸 수 있는지 확인하기 위해 큰 mpeg 파일을 위조 USB 메모리에 복사해 애니메이션 재생 소프트웨어로 위조 USB 메모리에 있는 mpeg 파일을 문제없이 재생할 수 있는지 확인했다.
어느 날, 애니메이션 재생 테스트를 하는 도중에 실행 방식 C의 처리를 잊어버린 것을 발견했다.실행을 시작한 후 이상한 현상이 발생하였다.
  • Windows PC에서 파일을 열어 위조 USB 메모리로 읽으면 inotifywait에서 MODIFY 이벤트
  • 가 발생합니다
  • 같은 파일을 즉시 다시 열고 읽으면 MODIFY 이벤트가 발생하지 않습니다
  • 다른 파일을 열어 읽을 때 MODIFY 이벤트가 처음 발생하고 두 번째 이후에는 발생하지 않습니다

  • 파일을 열면 첫 번째 MODIFY 이벤트만 나타납니다.
    나는 파일의 최종 방문 날짜가 업데이트되었기 때문인 줄 알았는데, 만약 그렇다면 두 번째 방문에서도 MODIFY 사건이 발생할 것이다.근데 안 일어나요.
    다행히도 이런 이상한 동작이 일어나도 새 파일을 수집 서버에 보내는 기기 자체에는 영향을 주지 않는다.나는 그날 조사를 포기했다.
    다음날 다시 시도해보니 어제 모디프 활동이 없었던 파일에 모디프 활동이 나왔다.두 번 다시 안 나와.다른 파일로 해봐도 마찬가지야.
    동작에 지장이 없다고는 하지만 원인 불명의 행동을 하는 기계를 본 공연에서 사용하고 싶지는 않다.
    용의자를 찾아라.
    잠입수사 - Wireshark USB 패킷 캡처
    도대체 뭘 썼는지 조사하기 위해 윈도 PC에 와이어싱을 설치하고 USB 패키지를 꺼냈다.쓰기의 경우 SCSI Write 명령이 있어야 합니다.
    그 행위를 더욱 잘 이해하기 위해 우리는 아날로그 USB 메모리의 환경을 조사했다.
  • FAT 32를 통해 위조 USB 메모리 포맷
  • mpeg 형식의 애니메이션을 준비합니다.
  • 1.mpg, 2.mpg, ... 이렇게 파일 이름을 바꾸면서 USB 메모리에 여러 개의 mpeg 애니메이션을 복사합니다
  • 대기 날짜의 변경
  • Wireshark를 시작합니다.USB 스토리지로 추정되는 USB 포트를 모니터링
  • 동작 재현 소프트웨어에서 위조 USB 메모리의mpeg
  • 재현
  • Wireshark에서 SCSI Write 명령 찾기
  • 쓰기 데이터 찾기
  • 캡처된 Write 데이터는 다음과 같습니다.

    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 파일의 속성을 열면 방문 날짜를 볼 수 있다.
    날짜만 있고 시간이 없다는 것도 알고.
    처음부터 이걸 봤다면 이유를 알 수 있었을 거야.

    도구 사용
  • Wireshark https://www.wireshark.org/download.html
  • 상표.
  • Windows는 미국 Microsoft의 등록 상표 또는 상표
  • 입니다.
  • Linux는 Linus Torvalds가 일본 및 기타 국가에서 등록한 상표나 상표이다.
  • Wireshark은 WIRESHARK FOUNDATION, INC. 미국 및 기타 국가의 등록 상표 또는 상표
  • 에 기재된 회사명, 제품명, 서비스명 등은 각 회사의 상표 또는 등록상표이다.
  • 좋은 웹페이지 즐겨찾기