지령선에서 MP4 영상의 이진 파일을 만지작거리는 방법의 노트

MP4의 동영상 파일 구조를 살펴본 뒤 그때 사용했던 도구 등을 노트로 남기고 싶다.작업 환경은 Mac(OS X El Capitan)입니다.

모든 파일 16진수 덤프


Hexdump 사용 방법


OS X 표준 hexdump 명령을 사용할 수 있습니다.
> hexdump target.bin
0000000 0a 69 6e 74 20 6d 61 69 6e 28 29 20 7b 0a 09 70
0000010 72 69 6e 74 66 28 22 48 65 6c 6c 6f 20 57 6f 72
0000020 6c 64 22 29 3b 0a 7d 0a
0000028

문자 정보도 함께 덤프


문자가 포함될 수 있는 2진법을 보았을 때 16진수 덤프와 함께 문자 메시지를 보내는 것이 편리할 것이다. -C를 넣으세요.
> hexdump -C target.bin
00000000  0a 69 6e 74 20 6d 61 69  6e 28 29 20 7b 0a 09 70  |.int main() {..p|
00000010  72 69 6e 74 66 28 22 48  65 6c 6c 6f 20 57 6f 72  |rintf("Hello Wor|
00000020  6c 64 22 29 3b 0a 7d 0a                           |ld");.}.|
00000028

컨텐트를 요약하지 않는 행


기본적으로,hexdump는 연속적인 동일한 수송을 합친다.따라서 0 연속 데이터 등을 덤프하면 이 부분은 축소됩니다.
다음은 0x20 (공간) 을 많이 넣은 파일을 뒤집는 모습입니다.
> hexdump target.bin
0000000 0a 69 6e 74 20 6d 61 69 6e 28 29 20 7b 0a 09 70
0000010 72 69 6e 74 66 28 22 48 65 6c 6c 6f 20 57 6f 72
0000020 6c 64 22 29 3b 0a 7d 0a 20 20 20 20 20 20 20 20
0000030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
*
0000080 20 20 20 20 20 20 20 0a
0000088
주소 0x000040~0x000070의 줄이 생략되었습니다.이 작업을 중지하려면 -v 옵션을 선택합니다.
> hexdump -v target.bin
0000000 0a 69 6e 74 20 6d 61 69 6e 28 29 20 7b 0a 09 70
0000010 72 69 6e 74 66 28 22 48 65 6c 6c 6f 20 57 6f 72
0000020 6c 64 22 29 3b 0a 7d 0a 20 20 20 20 20 20 20 20
0000030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0000040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0000050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0000060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0000070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0000080 20 20 20 20 20 20 20 0a
0000088

주소 정보를 포함하지 않고 간단한 16진수 문자열을 얻습니다


Hexdump의 간단한 옵션을 사용할 수 없습니다. -전자 옵션은 출력 형식을 자유롭게 결정하고 그것을 사용하여 실현할 수 있다.
줄 바꿈 없이 한 줄 내보내기
> hexdump -v -e '1 "%02x"' target.bin
0a696e74206d61696e2829207b0a097072696e7466282248656c6c6f20576f726c6422293b0a7d0a
옵션을 추가해야 합니다. 주의하십시오.위에서 말한 바와 같이hexdump는 기본적으로 연속된 같은 출력 줄을 한데 모으고 0연속된 데이터 등을 저장하면 이 부분은 축소됩니다.
만약 큰 이진 파일이라면 중간에 줄을 바꾸는 것이 비교적 보기 쉽다.
16바이트 줄 바꿈
> hexdump -v -e '16/1 "%02x" "\n"' target.bin
0a696e74206d61696e2829207b0a0970
72696e7466282248656c6c6f20576f72
6c6422293b0a7d0a

xxd 명령 사용 방법


hexdump가 아니거나 OS X에 표준 설치된 xxd 명령을 사용할 수 있습니다.

문자 정보도 함께 덤프


단순히 명령에 파일을 전달할 뿐이다.
> xxd target.bin
0000000: 0a69 6e74 206d 6169 6e28 2920 7b0a 0970  .int main() {..p
0000010: 7269 6e74 6628 2248 656c 6c6f 2057 6f72  rintf("Hello Wor
0000020: 6c64 2229 3b0a 7d0a 2020 2020 2020 2020  ld");.}.
0000030: 2020 2020 2020 2020 2020 2020 2020 2020
0000040: 2020 2020 2020 2020 2020 2020 2020 2020
0000050: 2020 2020 2020 2020 2020 2020 2020 2020
0000060: 2020 2020 2020 2020 2020 2020 2020 2020
0000070: 2020 2020 2020 2020 2020 2020 2020 2020
0000080: 2020 2020 2020 200a                             .

주소 정보를 포함하지 않고 간단한 16진수 문자열을 얻습니다


-p 옵션만 추가하면 됩니다.Hexdump 같은 격식의 복잡도와 - v의 올가미 등은 매우 간단하다.
> xxd -p target.bin
0a696e74206d61696e2829207b0a097072696e7466282248656c6c6f2057
6f726c6422293b0a7d0a2020202020202020202020202020202020202020
202020202020202020202020202020202020202020202020202020202020
202020202020202020202020202020202020202020202020202020202020
2020202020202020202020202020200a
항상 xxd는hexdump보다 사용하기 쉽다고 생각해요...

MP4 비디오를 거꾸로 돌리는 구조


비디오 파일은 Box라고 불리는 바이너리 정보 블록을 모아 만든 것이다.Box는
  • 4자 ASCII로 표시되는 유형
  • Box 포함 가능
  • 4바이트(32비트) 길이 정보
  • 길이는 아이의 박스 길이도 포함하기 때문에 구조가 알 수 없는 박스에서도 간단하게 건너뛸 수 있다
  • 이런 특징이 있다.나는 이것들을 그림으로 총결하였다.

    실제 MP4 애니메이션 파일에 박스 구조를 저장하려면 MP4 박스 명령을 사용하십시오.홈brew에서 설치할 수 있습니다.
    > brew install mp4box
    
    이렇게 MP4Box 명령을 설치합니다.

    XML로 Box 구성 내보내기

    > MP4Box -std -diso test.mp4
    <?xml version="1.0" encoding="UTF-8"?>
    <!--MP4Box dump trace-->
    <IsoMediaFile Name="test.mp4">
    <FileTypeBox MajorBrand="isom" MinorVersion="512">
    <BoxInfo Size="32" Type="ftyp"/>
    <BrandEntry AlternateBrand="isom"/>
    <BrandEntry AlternateBrand="iso2"/>
    <BrandEntry AlternateBrand="avc1"/>
    <BrandEntry AlternateBrand="mp41"/>
    </FileTypeBox>
    <FreeSpaceBox size="0">
    <BoxInfo Size="8" Type="free"/>
    </FreeSpaceBox>
    <MediaDataBox dataSize="1051459">
    <BoxInfo Size="1051467" Type="mdat"/>
    </MediaDataBox>
    <MediaDataBox dataSize="0">
    <BoxInfo Size="8" Type="mdat"/>
    </MediaDataBox>
    <MovieBox>
    <BoxInfo Size="4221" Type="moov"/>
        :
    
    왜 표준 오류 출력이 발생했는지,less로 파일을 수신하거나 출력하려면 교통 정리가 필요합니다.
    Bash의 경우
    > MP4Box -std -diso test.mp4 2>&1 | less
    > MP4Box -std -diso test.mp4 2> output.xml
    
    tcsh의 경우
    > MP4Box -std -diso test.mp4 |& less
    > MP4Box -std -diso test.mp4 >& output.xml
    
    출력 결과는 상당히 거대한 XML로 축소되지 않았다.파일에 빠지고 브라우저에 꽂으면 열거나 닫을 수 있어 보기 쉽다.

    텍스트 편집기에서 원하는 방식으로 모든 바이너리 파일을 처리합니다


    xxd-r 옵션


    16진법 저장된 파일을 다시 이진법 파일로 돌아가면 되겠다. 그러고 보니 xxd의-r 옵션(reverse 옵션)으로 찾아보면 간단하지 않겠는가!
    주소와 문자 정보가 첨부된 저장 결과를 출력해 보았는데, 그렇게 -r로 복원해 보았다.나는 MD5값이 변하지 않았다는 것을 알고 싶다.
    > md5 target.bin
    MD5 (target.bin) = 3314ce32426c77a086fa7290a9374fb4
    
    > xxd target.bin | xxd -r | md5
    3314ce32426c77a086fa7290a9374fb4
    
    수동으로 다루려면 순수 16진 저장 파일이 비교적 쓰기 좋다.
    > echo -n "Hello" | xxd -p
    48656c6c6f
    
    공백(0x20)을 반복하여 입력합니다.
    > echo "48656c6c6f2048656c6c6f" | xxd -p -r
    Hello Hello
    

    MP4의 바이너리 파일을 수동으로 가지고 놀면서 나의 UUID 라벨을 추가해 보세요.


    MP4의 Box에는 "uuid"라는 유형이 있습니다.이 박스는 무작위로 생성되는 UID 값을 담아 다른 사람과 부딪치지 않는 나만의 박스를 만들 수 있어 편리하다.
    격식은 이런 느낌.

    이걸로'헬로'5자 데이터가 있는 나 박스를 만들어 봐.
    > echo "0000001d" > mybox.hex
    > echo -n "uuid" | xxd -p >> mybox.hex
    > uuidgen >> mybox.hex
    > echo -n "Hello" | xxd -p >> mybox.hex
    > cat mybox.hex
    0000001d
    75756964
    b310c7b9-2bd3-4908-b6d5-03542cdeb01d
    48656c6c6f
    
    xxd-r로 이것을 2진법으로 만들어 보세요.
    > xxd -p -r mybox.hex | xxd
    0000000: 0000 001d 7575 6964 b310 c7b9 2bd3 4908  ....uuid....+.I.
    0000010: b6d5 0354 2cde b01d 4865 6c6c 6f         ...T,...Hello
    
    uidgen으로 만든 UID 값에 문자가 섞여 있지만 문제 없이 넘어가 읽었습니다.상상했던 것과 같은 바이너리를 만들 수 있다.
    그럼 이거 MP4 파일 끝에 붙여놓을게요.먼저 MP4 파일 전체를 hex 파일로 변환합니다.
    > xxd -p test.mp4 > test-with-mybox.mp4.hex
    
    텍스트 편집기에서 추가합니다.
    > vi test-with-mybox.mp4.hex
        :
    0000006075647461000000586d657461000000000000002168646c720000
    0000000000006d6469726170706c0000000000000000000000002b696c73
    7400000023a9746f6f0000001b6461746100000001000000004c61766635
    332e32342e32
    
    0000001d
    75756964
    b310c7b9-2bd3-4908-b6d5-03542cdeb01d
    48656c6c6f
    
    줄과 빈칸을 적당히 넣어도 문제없다.
    가공된 파일을 2진법으로 복원하세요.
    > xxd -p -r test-with-mybox.mp4.hex > test-with-mybox.mp4
    
    완성된 MP4는 문제없이 애니메이션으로 재생성됩니다.
    또한 라벨이 정확하게 식별되는지 확인하기 위해 MP4Box를 다시 사용하여 분석해 주십시오.
    > MP4Box -std -diso test-with-mybox.mp4
        :
    </HandlerBox>
    <ItemListBox>
    <BoxInfo Size="43" Type="ilst"/>
    <ToolBox value="Lavf53.24.2" >
    <FullBoxInfo Version="0" Flags="0x1"/>
    <BoxInfo Size="35" Type=".too"/>
    </ToolBox>
    </ItemListBox>
    </MetaBox>
    </UserDataBox>
    </MovieBox>
    <!--ERROR: Invalid Top-level Box Found ("uuid")-->
    <UnknownBox>
    <BoxInfo Size="29" UUID="{B310C7B9-2BD34908-B6D50354-2CDEB01D}"/>
    </UnknownBox>
    </IsoMediaFile>
    
    UnknownBox 형식이지만 파일의 마지막 부분에 추가된 제 UID Box가 정확하게 읽었다는 것을 알고 있습니다.

    감상

  • xxd 좋은 느낌
  • MP4의 파일 구조는 매우 이해하기 쉽고 조작이 간단하다.
  • (JPEG나 EXIF에 비해...)
  • 좋은 웹페이지 즐겨찾기