본문 바로가기
디지털 파일 검증 연구소 디지털 파일 검증 연구소

7z 파일 구조 분석|시그니처·Start Header·Next Header 검증 방법

디지털 파일 검증 연구소 읽는 시간 약 37분

7z는 높은 압축 효율과 다양한 압축 알고리즘을 지원하는 아카이브 파일 형식이다.

일반적으로 .7z 확장자를 사용하며 여러 파일과 폴더를 하나의 압축 파일에 저장하는 데 활용된다.

7z 파일은 단순히 압축 데이터만 연속해서 저장하는 구조가 아니다. 파일 시작에는 형식 식별을 위한 시그니처와 버전 정보가 있으며, 이어서 Start Header가 Next Header의 위치와 크기를 지정한다.

Next Header에는 압축 파일에 포함된 데이터 스트림, 압축 방식, 파일 목록 등 아카이브 구조를 해석하는 데 필요한 정보가 저장될 수 있다.

특히 7z 형식은 Start Header CRC와 Next Header CRC를 분리하여 관리한다는 특징이 있다.

따라서 7z 파일 구조 분석에서는 시그니처, 버전, Start Header, Next Header 오프셋, 데이터 길이, CRC-32 및 실제 파일 경계를 함께 확인해야 한다.

이번 글에서는 7z 파일의 전체 구조와 주요 헤더, 데이터 저장 방식, 압축 알고리즘, CRC 검증 원리와 손상 분석 방법을 알아본다.

또한 Windows PowerShell 5.1을 기준으로 작성한 읽기 전용 코드로 7z 파일의 시그니처와 Start Header를 확인하고, Next Header 범위 및 CRC-32를 검사하며 SHA-256 해시값을 계산하는 방법을 설명한다.


1. 7z 파일 구조 분석이 필요한 이유

7z 파일은 확장자가 정상이어도 내부 헤더나 압축 데이터가 손상되었을 수 있다.

다음과 같은 상황에서 구조 분석이 도움이 된다.

  • 7z 파일이 열리지 않는 경우
  • 압축 해제 도중 오류가 발생하는 경우
  • 파일이 일부 잘렸는지 확인하려는 경우
  • 압축 파일의 시작 시그니처를 확인하려는 경우
  • Next Header 위치가 정상인지 점검하려는 경우
  • Start Header CRC가 일치하는지 확인하려는 경우
  • Next Header CRC가 일치하는지 확인하려는 경우
  • 파일 전송 후 원본과 동일한지 확인하려는 경우

7z 구조 분석의 핵심은 Start Header가 가리키는 Next Header의 위치와 크기가 실제 파일 범위에 맞는지, 그리고 저장된 CRC 값이 계산 결과와 일치하는지 확인하는 것이다.

단, 헤더 CRC가 일치한다고 해서 모든 압축 데이터가 정상적으로 해제되거나 파일의 안전성이 보장되는 것은 아니다.

2. 7z 파일의 기본 개념과 특징

7z는 7-Zip 프로젝트와 함께 널리 알려진 아카이브 파일 형식이다.

주요 특징은 다음과 같다.

  • 여러 파일과 폴더 저장
  • 다양한 압축 알고리즘 지원
  • LZMA 및 LZMA2 압축 지원
  • 솔리드 압축 지원
  • 압축 데이터와 메타데이터를 구분하는 구조
  • 헤더 데이터의 압축 가능
  • 암호화 기능 지원
  • CRC 기반 오류 탐지 정보 사용

7z는 파일의 종류와 압축 설정에 따라 내부 구성이 달라질 수 있다.

따라서 모든 7z 파일의 내부 데이터가 동일한 순서와 압축 방식으로 저장된다고 가정해서는 안 된다.

3. 7z 파일의 전체 구조

일반적인 7z 파일은 다음과 같은 형태로 이해할 수 있다.

7z Archive
│
├── Signature Header (32 bytes)
│   ├── Signature (6 bytes)
│   ├── Version (2 bytes)
│   ├── Start Header CRC (4 bytes)
│   └── Start Header (20 bytes)
│       ├── Next Header Offset (8 bytes)
│       ├── Next Header Size (8 bytes)
│       └── Next Header CRC (4 bytes)
│
├── Packed Data / Streams
│
└── Next Header
    ├── Archive Properties
    ├── Streams Information
    ├── Files Information
    └── Other Header Structures

위 구조는 개념을 설명하기 위한 일반적인 배치다.

실제 Next Header는 압축되거나 암호화된 헤더 정보를 참조할 수 있으며, 내부 스트림과 파일 정보의 구성도 달라질 수 있다.

핵심은 파일 시작 32바이트의 Signature Header를 통해 Next Header의 위치와 크기를 찾을 수 있다는 점이다.

4. 7z 파일 시그니처와 시작 바이트

7z 파일은 일반적으로 다음 6바이트 시그니처로 시작한다.

37 7A BC AF 27 1C

이 바이트 배열은 7z 파일 형식을 식별하는 데 사용된다.

파일 시작 구조는 다음과 같다.

37 7A BC AF 27 1C
Major Version
Minor Version
Start Header CRC
Start Header

시그니처가 일치한다면 7z 파일일 가능성이 높다.

그러나 시그니처만으로 파일 전체가 정상인지 판단할 수는 없다.

또한 이번 글의 실습은 파일 시작 위치 0에 7z 시그니처가 있는 일반적인 단일 파일을 대상으로 한다.

5. Signature Header의 32바이트 구조

7z 파일 시작 부분의 Signature Header는 32바이트다.

오프셋크기필드
06바이트Signature
61바이트Major Version
71바이트Minor Version
84바이트Start Header CRC
128바이트Next Header Offset
208바이트Next Header Size
284바이트Next Header CRC

Start Header는 Signature Header 내부의 마지막 20바이트를 가리킨다.

여기에는 Next Header의 상대 오프셋, 크기와 CRC 값이 저장된다.

6. 7z 버전 필드

7z 파일의 시그니처 뒤에는 두 개의 버전 바이트가 존재한다.

Major Version
Minor Version

일반적인 7z 형식에서는 Major Version 값으로 0이 사용된다.

하지만 버전 필드가 존재한다는 사실만으로 모든 버전의 세부 구조를 동일하게 해석할 수 있는 것은 아니다.

따라서 분석 프로그램은 지원하는 버전 범위를 명확하게 정해야 한다.

이번 글의 PowerShell 코드는 버전 값을 읽어 표시하지만, 모든 버전의 호환성을 보장하는 전체 7z 파서는 아니다.

7. Start Header의 역할

Start Header는 20바이트로 구성된다.

Start Header (20 bytes)
│
├── Next Header Offset (8 bytes)
├── Next Header Size (8 bytes)
└── Next Header CRC (4 bytes)

이 필드들은 리틀엔디언 방식으로 저장된다.

Start Header는 실제 Next Header를 찾아가는 기본적인 위치 정보다.

따라서 7z 파일을 분석할 때는 이 20바이트가 손상되지 않았는지 확인하는 것이 중요하다.

8. Next Header Offset 계산 원리

Next Header Offset은 파일 시작 위치를 기준으로 한 절대 오프셋이 아니다.

Signature Header 32바이트가 끝나는 위치를 기준으로 하는 상대 오프셋이다.

따라서 Next Header의 시작 위치는 다음과 같이 계산한다.

Next Header Start =
    32 + Next Header Offset

예를 들어 다음 값이 저장되어 있다고 가정하자.

Next Header Offset = 1000
Next Header Size   = 200

계산 결과는 다음과 같다.

Next Header Start = 32 + 1000
                  = 1032

Next Header End   = 1032 + 200
                  = 1232

여기서 End는 마지막 데이터 바이트 다음 위치를 뜻한다.

파일 길이가 1200바이트라면 Next Header의 끝 위치가 파일 범위를 초과하므로 정상적인 데이터 범위를 확보할 수 없다.

9. Next Header Size의 의미

Next Header Size는 Next Header의 바이트 크기를 나타낸다.

이 값은 8바이트 리틀엔디언 정수로 저장된다.

Next Header의 시작과 끝 위치를 계산하면 다음 항목을 확인할 수 있다.

  • Next Header 시작 위치
  • Next Header 끝 위치
  • 실제 파일 범위 초과 여부
  • CRC 계산에 필요한 데이터 길이

다만 Next Header가 파일 범위 안에 있다는 사실만으로 내부 구조가 올바르다고 판단할 수는 없다.

Next Header의 내부 식별자와 스트림 정보를 추가로 해석해야 한다.

10. Start Header CRC의 의미

Signature Header의 오프셋 8에는 4바이트 Start Header CRC가 저장된다.

이 CRC는 오프셋 12~31의 20바이트 Start Header를 대상으로 계산한다.

즉, 다음 세 필드가 CRC 계산 대상이다.

Next Header Offset (8 bytes)
Next Header Size   (8 bytes)
Next Header CRC    (4 bytes)

7z에서 사용하는 CRC-32는 일반적인 반사형 CRC-32 방식이다.

대표적으로 다음 조건을 사용한다.

Polynomial (reflected) = 0xEDB88320
Initial Value          = 0xFFFFFFFF
Final XOR              = 0xFFFFFFFF

Start Header CRC가 일치하지 않는다면 위치·크기 정보 또는 CRC 필드가 손상되었을 가능성이 있다.

11. Next Header CRC의 의미

Start Header 안에는 별도의 Next Header CRC 필드가 있다.

이 값은 Next Header의 저장된 바이트 데이터에 대해 계산한 CRC-32다.

Start Header CRC와 Next Header CRC는 서로 검증 대상이 다르다.

구분Start Header CRCNext Header CRC
저장 위치오프셋 8오프셋 28
검증 대상Start Header 20바이트Next Header 데이터
주요 목적위치·크기 정보 오류 탐지헤더 데이터 오류 탐지
암호학적 인증불가불가

Next Header CRC가 일치하더라도 압축 데이터 전체가 정상적으로 복원되는지는 별도로 확인해야 한다.

12. Next Header의 내부 구성

Next Header에는 아카이브를 해석하기 위한 다양한 정보가 포함될 수 있다.

대표적으로 다음과 같은 요소가 있다.

Next Header
│
├── Header
│   ├── Archive Properties
│   ├── Main Streams Information
│   └── Files Information
│
└── Encoded Header (possible)

7z는 헤더 자체를 인코딩하거나 압축할 수 있다.

따라서 Next Header 시작 바이트만 읽는 것으로 파일 목록과 압축 알고리즘을 모두 확인할 수는 없다.

특히 Encoded Header가 사용되면 별도의 스트림 해석과 압축 해제가 필요할 수 있다.

13. 7z 파일의 주요 압축 알고리즘

7z는 여러 압축 및 필터 방식을 조합할 수 있다.

대표적인 예시는 다음과 같다.

방식주요 특징
LZMA높은 압축률을 목표로 하는 방식
LZMA2LZMA 계열의 개선된 압축 방식
PPMd문맥 모델 기반 압축
BZip2블록 기반 압축
Deflate널리 사용되는 압축 방식
Copy압축하지 않고 데이터 저장

실제 아카이브에서 어떤 방식이 사용되었는지는 내부 Folder·Coder 정보 등을 해석해야 확인할 수 있다.

파일 확장자만으로 압축 알고리즘을 확정해서는 안 된다.

14. 솔리드 압축과 파일 복원

7z는 솔리드 압축을 지원한다.

솔리드 압축에서는 여러 파일의 데이터가 하나의 연속된 압축 스트림으로 처리될 수 있다.

이 방식은 유사한 데이터가 많은 파일을 함께 압축할 때 압축 효율을 높일 수 있다.

그러나 특정 파일 하나만 추출하려는 경우에도 앞부분의 압축 데이터를 함께 처리해야 할 수 있다.

또한 압축 스트림 일부가 손상되면 여러 파일의 복원에 영향을 줄 수 있다.

따라서 솔리드 압축 아카이브의 손상 분석은 단순한 파일별 오프셋 확인보다 복잡할 수 있다.

15. 7z 파일의 암호화와 헤더 보호

7z는 암호화 기능을 지원한다.

설정에 따라 파일 데이터뿐 아니라 파일 이름 등 헤더 정보도 암호화할 수 있다.

헤더가 암호화되어 있으면 비밀번호 없이 파일 목록을 확인하기 어려울 수 있다.

다만 파일 시작의 Signature Header는 기본 구조 분석에 필요한 정보를 제공한다.

따라서 암호화된 7z 파일에서도 시그니처, Start Header 및 Next Header의 기본 범위와 CRC를 점검할 수 있는 경우가 있다.

그러나 CRC가 일치한다는 사실이 비밀번호의 정확성이나 복호화 성공을 의미하지는 않는다.

16. 7z 파일의 기본 구조 검증 순서

7z 파일을 분석할 때는 다음 순서로 확인하는 것이 좋다.

① 파일 길이 확인

최소 32바이트 Signature Header가 존재하는지 확인한다.

② 시그니처 확인

시작 6바이트가 37 7A BC AF 27 1C인지 확인한다.

③ 버전 확인

Major Version과 Minor Version을 읽는다.

④ Start Header CRC 확인

오프셋 12~31의 20바이트를 대상으로 CRC를 계산한다.

⑤ Next Header 위치 계산

32바이트 기준 위치에 Next Header Offset을 더한다.

⑥ Next Header 범위 확인

Next Header Size를 더해 파일 범위를 초과하지 않는지 확인한다.

⑦ Next Header CRC 확인

Next Header 데이터에 대한 CRC를 계산해 저장값과 비교한다.

⑧ 내부 헤더 구조 확인

필요한 경우 압축 방식, 파일 목록, 스트림 구조를 별도로 해석한다.

⑨ 파일 전체 무결성 확인

신뢰할 수 있는 원본 SHA-256 값과 비교한다.

17. PowerShell 5.1로 7z 시그니처와 Start Header 확인하기

첫 번째 실습에서는 7z 파일의 시작 32바이트를 읽어 시그니처, 버전, Start Header 정보를 확인한다.

① 실습 파일

C:\FileTest\sample.7z

실행할 때 실제 7z 파일 경로로 변경한다.

② PowerShell 코드

$path = "C:\FileTest\sample.7z"

$stream = [System.IO.File]::OpenRead($path)

try {
    $reader = New-Object System.IO.BinaryReader($stream)

    if ($stream.Length -lt 32) {
        throw "7z signature header is incomplete."
    }

    $signature = $reader.ReadBytes(6)
    $expected = [byte[]]@(0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C)

    for ($i = 0; $i -lt 6; $i++) {
        if ($signature[$i] -ne $expected[$i]) {
            throw "Invalid 7z signature."
        }
    }

    $majorVersion = $reader.ReadByte()
    $minorVersion = $reader.ReadByte()

    $startHeaderCRC = $reader.ReadUInt32()
    $nextHeaderOffset = $reader.ReadUInt64()
    $nextHeaderSize = $reader.ReadUInt64()
    $nextHeaderCRC = $reader.ReadUInt32()

    [PSCustomObject]@{
        SignatureHex = [BitConverter]::ToString($signature)
        MajorVersion = $majorVersion
        MinorVersion = $minorVersion
        StartHeaderCRC = ("0x{0:X8}" -f $startHeaderCRC)
        NextHeaderOffset = $nextHeaderOffset
        NextHeaderSize = $nextHeaderSize
        NextHeaderCRC = ("0x{0:X8}" -f $nextHeaderCRC)
        FileSize = $stream.Length
    }
}
finally {
    $stream.Dispose()
}

③ 출력 예시

SignatureHex     : 37-7A-BC-AF-27-1C
MajorVersion     : 0
MinorVersion     : 4
StartHeaderCRC   : 0x12345678
NextHeaderOffset : 1000
NextHeaderSize   : 200
NextHeaderCRC    : 0xABCDEF12
FileSize         : 1232

위 값은 구조 설명을 위한 예시이며 실제 CRC 값과 파일 크기는 달라질 수 있다.

④ 코드 해석

파일 시작의 시그니처와 버전을 읽고 Start Header에 저장된 Next Header의 상대 위치, 크기 및 CRC 필드를 출력한다.

⑤ 코드의 한계

이 코드는 헤더에 저장된 값을 읽는 기본 분석 코드다.

CRC를 직접 계산하거나 Next Header가 파일 범위 안에 있는지 검증하지 않는다.

18. PowerShell 5.1로 Next Header 위치와 파일 경계 확인하기

두 번째 실습에서는 Start Header의 위치와 크기 정보를 이용해 Next Header의 실제 파일 범위를 확인한다.

① PowerShell 코드

$path = "C:\FileTest\sample.7z"

$stream = [System.IO.File]::OpenRead($path)

try {
    $reader = New-Object System.IO.BinaryReader($stream)

    if ($stream.Length -lt 32) {
        throw "7z signature header is incomplete."
    }

    $signature = $reader.ReadBytes(6)
    $expected = [byte[]]@(0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C)

    for ($i = 0; $i -lt 6; $i++) {
        if ($signature[$i] -ne $expected[$i]) {
            throw "Invalid 7z signature."
        }
    }

    $majorVersion = $reader.ReadByte()
    $minorVersion = $reader.ReadByte()

    $startHeaderCRC = $reader.ReadUInt32()
    $nextHeaderOffset = $reader.ReadUInt64()
    $nextHeaderSize = $reader.ReadUInt64()
    $nextHeaderCRC = $reader.ReadUInt32()

    $fileSize = [uint64]$stream.Length
    $availableBytes = $fileSize - [uint64]32

    $offsetValid = $nextHeaderOffset -le $availableBytes

    $sizeValid = $false

    if ($offsetValid) {
        $remaining = $availableBytes - $nextHeaderOffset
        $sizeValid = $nextHeaderSize -le $remaining
    }

    $nextHeaderStart = $null
    $nextHeaderEnd = $null

    if ($offsetValid -and $sizeValid) {
        $nextHeaderStart = [uint64]32 + $nextHeaderOffset
        $nextHeaderEnd = $nextHeaderStart + $nextHeaderSize
    }

    [PSCustomObject]@{
        FileSize = $fileSize
        NextHeaderOffset = $nextHeaderOffset
        NextHeaderSize = $nextHeaderSize
        NextHeaderStart = $nextHeaderStart
        NextHeaderEnd = $nextHeaderEnd
        OffsetWithinFile = $offsetValid
        SizeWithinFile = $sizeValid
    }
}
finally {
    $stream.Dispose()
}

② 출력 예시

FileSize         : 1232
NextHeaderOffset : 1000
NextHeaderSize   : 200
NextHeaderStart  : 1032
NextHeaderEnd    : 1232
OffsetWithinFile : True
SizeWithinFile   : True

위 값은 설명을 위한 예시다.

③ 코드 해석

파일 길이에서 Signature Header의 32바이트를 제외하고, Next Header Offset과 Size가 남은 범위를 초과하지 않는지 확인한다.

특히 덧셈으로 인한 정수 범위 문제를 피하기 위해 먼저 사용 가능한 바이트 수와 비교한다.

④ 코드의 한계

이 코드는 Next Header의 위치와 크기만 확인한다.

Start Header CRC 또는 Next Header CRC가 일치하는지는 검증하지 않는다.

19. PowerShell 5.1로 Start Header와 Next Header CRC-32 검증하기

세 번째 실습에서는 7z 파일의 두 가지 CRC 값을 계산해 저장된 값과 비교한다.

7z에서 사용하는 일반적인 CRC-32 계산 규칙을 적용한다.

① PowerShell 코드

$path = "C:\FileTest\sample.7z"

function Get-Crc32 {
    param(
        [byte[]]$Data
    )

    [uint64]$crc = 0xFFFFFFFF
    [uint64]$poly = 0xEDB88320

    foreach ($value in $Data) {
        $crc = $crc -bxor [uint64]$value

        for ($bit = 0; $bit -lt 8; $bit++) {
            if (($crc -band 1) -ne 0) {
                $crc = ($crc -shr 1) -bxor $poly
            }
            else {
                $crc = $crc -shr 1
            }
        }
    }

    return [uint32]($crc -bxor 0xFFFFFFFF)
}

$stream = [System.IO.File]::OpenRead($path)

try {
    $reader = New-Object System.IO.BinaryReader($stream)

    if ($stream.Length -lt 32) {
        throw "7z signature header is incomplete."
    }

    $signature = $reader.ReadBytes(6)
    $expected = [byte[]]@(0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C)

    for ($i = 0; $i -lt 6; $i++) {
        if ($signature[$i] -ne $expected[$i]) {
            throw "Invalid 7z signature."
        }
    }

    $majorVersion = $reader.ReadByte()
    $minorVersion = $reader.ReadByte()

    $storedStartCRC = $reader.ReadUInt32()
    $startHeaderBytes = $reader.ReadBytes(20)

    $calculatedStartCRC = Get-Crc32 -Data $startHeaderBytes

    $nextHeaderOffset = [BitConverter]::ToUInt64($startHeaderBytes, 0)
    $nextHeaderSize = [BitConverter]::ToUInt64($startHeaderBytes, 8)
    $storedNextCRC = [BitConverter]::ToUInt32($startHeaderBytes, 16)

    $fileSize = [uint64]$stream.Length
    $availableBytes = $fileSize - [uint64]32

    if ($nextHeaderOffset -gt $availableBytes) {
        throw "Next Header offset exceeds file length."
    }

    $remaining = $availableBytes - $nextHeaderOffset

    if ($nextHeaderSize -gt $remaining) {
        throw "Next Header size exceeds file length."
    }

    if ($nextHeaderSize -gt [int]::MaxValue) {
        throw "Next Header too large for this example."
    }

    $stream.Position = [long]([uint64]32 + $nextHeaderOffset)
    $nextHeaderBytes = $reader.ReadBytes([int]$nextHeaderSize)

    $calculatedNextCRC = Get-Crc32 -Data $nextHeaderBytes

    [PSCustomObject]@{
        StoredStartCRC = ("0x{0:X8}" -f $storedStartCRC)
        CalculatedStartCRC = ("0x{0:X8}" -f $calculatedStartCRC)
        StartCRCMatch = ($storedStartCRC -eq $calculatedStartCRC)
        StoredNextCRC = ("0x{0:X8}" -f $storedNextCRC)
        CalculatedNextCRC = ("0x{0:X8}" -f $calculatedNextCRC)
        NextCRCMatch = ($storedNextCRC -eq $calculatedNextCRC)
    }
}
finally {
    $stream.Dispose()
}

② 출력 예시

StoredStartCRC     : 0xXXXXXXXX
CalculatedStartCRC : 0xXXXXXXXX
StartCRCMatch      : True
StoredNextCRC      : 0xYYYYYYYY
CalculatedNextCRC  : 0xYYYYYYYY
NextCRCMatch       : True

위 출력은 CRC가 정상인 파일에서 기대할 수 있는 형태를 설명한 예시다.

③ 코드 해석

Start Header 20바이트에 대해 CRC를 계산하고 저장된 Start Header CRC와 비교한다.

이어서 Next Header Offset과 Size를 이용해 Next Header 데이터를 읽고 해당 CRC를 계산한다.

④ 코드의 한계

이 코드는 두 헤더 영역의 CRC만 확인한다.

압축 데이터의 CRC, 암호화된 내용의 복호화, 내부 파일 목록 또는 압축 해제 가능 여부는 검증하지 않는다.

또한 예제의 단순화를 위해 Next Header가 매우 큰 파일은 처리하지 않는다.

20. 7z 파일 손상 시 확인할 항목

7z 파일이 열리지 않거나 압축 해제 중 오류가 발생한다면 다음 항목을 확인할 수 있다.

점검 항목확인 목적
7z Signature파일 형식 식별
Major·Minor Version버전 정보
Signature Header Size시작 헤더 길이
Start Header CRC위치·크기 필드 오류 탐지
Next Header OffsetNext Header 위치
Next Header SizeNext Header 크기
Next Header CRC헤더 데이터 오류 탐지
Packed Streams압축 데이터 구조
Compression Method압축 알고리즘
Solid Compression연속 압축 구조
Encryption암호화 여부
SHA-256파일 전체 동일성

대표적인 손상 상황

① 시그니처 오류

시작 6바이트가 일치하지 않으면 일반적인 7z 파일로 해석하기 어렵다.

② Start Header CRC 불일치

Next Header 위치, 크기 또는 CRC 필드가 변경되었을 가능성이 있다.

③ Next Header 범위 오류

오프셋과 크기가 실제 파일 길이를 초과하면 파일이 잘렸거나 헤더 정보가 손상되었을 수 있다.

④ Next Header CRC 불일치

저장된 Next Header 바이트가 변경되었을 가능성이 있다.

⑤ 압축 데이터 손상

헤더 CRC가 정상이어도 압축 스트림이 손상되어 파일 복원이 실패할 수 있다.

⑥ 암호화 관련 오류

암호화된 아카이브에서는 비밀번호가 틀리거나 암호화 데이터가 손상되어 해제에 실패할 수 있다.

21. 7z 구조 검증과 SHA-256 무결성 검증

7z 헤더 구조 분석, CRC 검사와 SHA-256 비교는 목적이 다르다.

구조 분석

시그니처와 버전, Start Header 및 Next Header의 위치와 크기를 확인한다.

CRC 검사

Start Header와 Next Header의 CRC를 계산해 저장된 값과 비교한다.

SHA-256 검증

파일 전체의 바이트를 대상으로 해시를 계산해 신뢰할 수 있는 원본과 비교한다.

PowerShell 5.1 코드

$path = "C:\FileTest\sample.7z"

Get-FileHash -LiteralPath $path -Algorithm SHA256 |
    Format-List Algorithm, Hash, Path

검증 방식 비교

구분구조 분석7z 헤더 CRCSHA-256
검증 대상시그니처·오프셋헤더 영역파일 전체
파일 경계 확인가능계산 전 필요직접 확인하지 않음
우발적 오류 탐지제한적가능기준값 비교 시 가능
압축 해제수행하지 않음수행하지 않음수행하지 않음
원본 동일성확인 불가보장하지 않음기준값과 비교 가능
파일 안전성보장 불가보장 불가보장 불가

SHA-256 값이 신뢰할 수 있는 기준값과 일치한다면 파일 전체의 바이트 내용이 동일하다고 매우 높은 신뢰도로 판단할 수 있다.

하지만 SHA-256 값만으로 아카이브 내부 파일이 정상적으로 복원되는지 또는 안전한지를 확인할 수는 없다.

22. 자주 묻는 질문

Q1. 7z 파일은 무엇인가요?

여러 파일과 폴더를 압축해 저장할 수 있는 아카이브 형식이다.

Q2. 7z 파일의 시그니처는 무엇인가요?

일반적인 7z 파일은 37 7A BC AF 27 1C로 시작한다.

Q3. Signature Header는 몇 바이트인가요?

파일 시작의 기본 Signature Header는 32바이트다.

Q4. Start Header는 무엇인가요?

Next Header의 상대 오프셋, 크기와 CRC를 저장하는 20바이트 영역이다.

Q5. Next Header Offset은 파일 시작 기준인가요?

아니다. 32바이트 Signature Header가 끝나는 위치를 기준으로 한다.

Q6. Start Header CRC와 Next Header CRC는 같은가요?

아니다. 각각 Start Header 20바이트와 Next Header 데이터에 대해 계산한다.

Q7. 7z 파일의 헤더도 압축될 수 있나요?

가능하다. Encoded Header 구조를 이용해 헤더를 압축하거나 암호화할 수 있다.

Q8. CRC가 일치하면 압축 파일은 정상인가요?

헤더 CRC가 일치하더라도 압축 데이터가 손상되었거나 해제에 실패할 수 있다.

Q9. PowerShell 5.1만으로 7z 파일 전체를 검증할 수 있나요?

이번 코드로는 시그니처, 헤더 범위, Start Header와 Next Header CRC 및 파일 전체 SHA-256을 확인할 수 있다. 압축 스트림과 내부 파일의 완전한 검증에는 추가 분석 또는 압축 해제 검사가 필요하다.

마무리

7z는 고정된 시그니처와 Start Header, Next Header 및 압축 데이터 스트림으로 구성되는 아카이브 형식이다.

7z 파일 구조 분석에서는 6바이트 시그니처, 32바이트 Signature Header, 20바이트 Start Header, Next Header의 상대 오프셋과 크기, CRC-32를 순서대로 확인하는 것이 중요하다.

특히 Next Header Offset은 파일 시작이 아니라 32바이트 Signature Header 이후를 기준으로 계산한다는 점을 기억해야 한다.

Start Header CRC와 Next Header CRC는 각각 다른 헤더 영역을 검사하며, 이 값들이 일치하더라도 압축 데이터의 정상 복원이나 파일의 안전성이 보장되는 것은 아니다.

따라서 7z 구조 분석, 헤더 CRC 검증, 실제 압축 해제 검사와 SHA-256 비교를 목적에 맞게 구분해 사용하는 것이 바람직하다.

관련 글 함께 읽기

압축 파일의 구조와 무결성 검증 원리를 더 자세히 이해하려면 ZIP 파일 구조 분석 글을 함께 참고할 수 있다.


핵심 내용 3줄 요약

  • 7z는 6바이트 시그니처, 32바이트 Signature Header, Start Header와 Next Header를 이용해 아카이브 구조를 관리한다.
  • Next Header Offset과 Size로 파일 경계를 확인하고, Start Header CRC와 Next Header CRC를 계산하면 헤더 영역의 오류를 탐지할 수 있다.
  • 헤더 CRC 검증과 SHA-256 비교는 압축 데이터의 완전한 복원이나 파일 안전성 검증과 구분해야 한다.

공식 및 기술 참고자료

  1. 7-Zip 공식 사이트 — 7z Format
    https://www.7-zip.org/7z.html
  2. Microsoft Learn — BinaryReader Class
    https://learn.microsoft.com/dotnet/api/system.io.binaryreader
  3. Microsoft Learn — BitConverter Class
    https://learn.microsoft.com/dotnet/api/system.bitconverter
  4. Microsoft Learn — Get-FileHash (PowerShell 5.1)
    https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-5.1

※ 본문의 PowerShell 코드는 7z 파일의 기본 헤더 구조와 CRC를 읽기 전용으로 분석하는 학습용 예시다. 압축 데이터를 실제로 복원하거나 암호화된 내부 정보를 해독하는 전체 7z 파서는 아니며, Windows PowerShell 5.1 실제 실행 테스트는 별도로 필요하다.

디지털 파일 검증 연구소

디지털 파일 검증 연구소
디지털 파일 검증 연구소는 파일 형식, 확장자, 무결성 확인, 데이터 손상 예방 및 디지털 자료 관리 방법을 다루는 정보 사이트입니다. 파일 오류의 원인과 점검 절차를 이해하기 쉽게 정리하고, 공식 문서와 검증 가능한 자료를 바탕으로 실생활에 도움이 되는 해결 방법을 안내합니다.
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.