포스트

[250728] 개발 일지 - 리패키지 아키텍쳐 요약

[250728] 개발 일지 - 리패키지 아키텍쳐 요약

0. 그 이후…

다시 문제를 해결하고, 다시 리패키지 해서 적용시켜보았다. example 다행히 정상적으로 적용되었다. 모든 이미지가 정상적으로 로드되어 있다.1

이번 게시글에서는 이번 프로그램의 상세 구조도를 소개할 것이다.

모든 mermaid diagram은 클릭 / 터치 시 확대가 가능하다.
(최대 500% 까지)

🏗️ 전체 시스템 아키텍쳐

sequenceDiagram
    participant User as 👤 사용자
    participant Main as 🏠 메인 프로그램
    participant Analyzer as 🔍 BinaryFileAnalyzer
    participant FileSystem as 💾 파일시스템

    User->>Main: 프로그램 실행
    Main->>User: 파일 경로 요청
    User->>Main: BIOS 파일 경로 입력
    Main->>FileSystem: 파일 존재 검증
    FileSystem-->>Main: 검증 결과
    Main->>Analyzer: 분석기 인스턴스 생성
    Main->>User: 메뉴 옵션 표시 (1-6)
    User->>Main: 옵션 선택
    
    alt 옵션 1: 파일 분석 및 이미지 추출
        Main->>Analyzer: run_analysis() 호출
        Analyzer->>Analyzer: 매직바이트, 패턴, 구조 분석
        Analyzer->>FileSystem: 분석 보고서 저장
        Main->>User: 이미지 추출 여부 확인
        User->>Main: 추출 선택 (y/n)
        alt 추출 선택시
            Main->>Analyzer: extract_embedded_files() 호출
            Analyzer->>FileSystem: 이미지 파일들 저장
        end
    
    else 옵션 2: 이미지 합치기 (같은 크기)
        Main->>Analyzer: load_file() 호출
        Main->>User: 추출 디렉터리 경로 요청
        User->>Main: 디렉터리 경로 입력
        Main->>Analyzer: merge_extracted_files() 호출
        Analyzer->>FileSystem: 추출된 파일들 읽기
        Analyzer->>Analyzer: 크기 검증 및 바이트 교체
        Analyzer->>FileSystem: 수정된 BIOS 파일 저장
    
    else 옵션 3: 크기 변화 허용 재구성
        Main->>Analyzer: load_file() 호출
        Main->>User: 추출 디렉터리 경로 요청
        User->>Main: 디렉터리 경로 입력
        Main->>Analyzer: rebuild_with_size_adjustment() 호출
        Analyzer->>FileSystem: 추출된 파일들 읽기
        Analyzer->>Analyzer: 구조 재계산 및 재구성
        Analyzer->>FileSystem: 재구성된 BIOS 파일 저장
    
    else 옵션 4: 분석만 수행
        Main->>Analyzer: run_analysis() 호출
        Analyzer->>Analyzer: 전체 분석 수행
        Analyzer->>FileSystem: 분석 보고서 저장
    
    else 옵션 5: ASUS Packer 추출
        Main->>Analyzer: load_file() 호출
        Main->>Analyzer: extract_asus_packed_images() 호출
        Analyzer->>Analyzer: ASUS 패키지 감지
        Analyzer->>FileSystem: 패키지별 이미지 추출
        Analyzer->>FileSystem: 패키지 정보 파일 생성
    
    else 옵션 6: ASUS Packer 재패키징
        Main->>Analyzer: load_file() 호출
        Main->>User: 재패키징 방식 선택 (1-4)
        User->>Main: 방식 선택
        alt 방식 1: 최대 구조 보존
            Main->>Analyzer: rebuild_asus_packer_preserve_structure() 호출
        else 방식 2: 원본 구조 보존  
            Main->>Analyzer: rebuild_asus_packer_with_original_structure() 호출
        else 방식 3: 완전 재구성
            Main->>Analyzer: rebuild_asus_packer_format() 호출
        else 방식 4: 구조 검증
            Main->>Analyzer: verify_asus_structure_preservation() 호출
        end
        Analyzer->>FileSystem: 재패키징된 파일 저장
        Main->>User: 구조 검증 제안
    end
    
    Main->>User: 작업 완료 알림

🔍 1. 프로그램 시작 및 초기화 로직

sequenceDiagram
    participant User as 👤 사용자
    participant Main as 🏠 main()
    participant Validator as ✅ validate_file_path()
    participant FileSystem as 💾 파일시스템

    User->>Main: 프로그램 실행
    
    alt 드래그 앤 드롭으로 파일 전달
        Main->>Main: sys.argv[1]에서 파일 경로 추출
        Main->>Validator: 파일 경로 검증
        Validator->>FileSystem: 파일 존재 확인
        FileSystem-->>Validator: 존재 여부 반환
        Validator-->>Main: 검증 결과
        alt 검증 실패
            Main->>User: 오류 메시지 출력
            Main->>Main: 프로그램 종료
        end
    else 수동 파일 선택
        Main->>User: 파일 경로 입력 요청
        User->>Main: 파일 경로 입력
        Main->>Validator: 파일 경로 검증
        Validator-->>Main: 검증 결과
    end
    
    Main->>Main: BinaryFileAnalyzer 인스턴스 생성
    Main->>User: 메뉴 옵션 표시

📊 2. 파일 분석 및 이미지 추출 로직 (옵션 1)

sequenceDiagram
    participant User as 👤 사용자
    participant Main as 🏠 main()
    participant Analyzer as 🔍 BinaryFileAnalyzer
    participant FileOps as 📁 파일 작업
    participant Reporter as 📝 보고서 생성

    User->>Main: 옵션 1 선택
    Main->>Analyzer: run_analysis() 호출
    
    Analyzer->>Analyzer: load_file() - 파일을 메모리 로드
    Analyzer->>Analyzer: analyze_magic_bytes() - 매직바이트 분석
    Analyzer->>Analyzer: find_patterns() - 패턴 검색
    Analyzer->>Analyzer: analyze_embedded_files() - 임베디드 파일 찾기
    Analyzer->>Analyzer: analyze_entropy() - 엔트로피 분석
    Analyzer->>Analyzer: analyze_structure() - 구조 분석
    Analyzer->>Analyzer: generate_summary() - 요약 생성
    
    Analyzer->>Reporter: save_analysis_results_txt() 호출
    Reporter->>FileOps: TXT 보고서 저장
    Analyzer->>Reporter: save_analysis_results_md() 호출
    Reporter->>FileOps: Markdown 보고서 저장
    
    Analyzer-->>Main: 분석 완료
    Main->>User: 이미지 추출 여부 확인
    
    alt 사용자가 추출 선택
        User->>Main: 'y' 입력
        Main->>User: 출력 디렉터리 경로 요청
        User->>Main: 디렉터리 경로 입력 (또는 기본값)
        Main->>Analyzer: extract_embedded_files() 호출
        
        loop 각 이미지 타입별
            Analyzer->>Analyzer: PNG 이미지 검색 및 추출
            Analyzer->>Analyzer: JPEG 이미지 검색 및 추출
            Analyzer->>Analyzer: BMP 이미지 검색 및 추출
            Analyzer->>FileOps: 이미지 파일 저장
        end
        
        Analyzer-->>Main: 추출 완료 (추출된 파일 수)
        Main->>User: 추출 결과 보고
    else 사용자가 추출 거부
        User->>Main: 'n' 입력
        Main->>User: 추출 건너뛰기 알림
    end

🔄 3. 이미지 합치기 로직 (옵션 2 - 같은 크기)

sequenceDiagram
    participant User as 👤 사용자
    participant Main as 🏠 main()
    participant Analyzer as 🔍 BinaryFileAnalyzer
    participant FileOps as 📁 파일 작업
    participant Validator as ✅ 검증

    User->>Main: 옵션 2 선택
    Main->>Analyzer: load_file() 호출
    Analyzer->>FileOps: 원본 파일 메모리 로드
    
    Main->>User: 추출 디렉터리 경로 요청
    User->>Main: 디렉터리 경로 입력
    Main->>Validator: 디렉터리 존재 확인
    Validator-->>Main: 검증 결과
    
    alt 디렉터리 존재하지 않음
        Main->>User: 오류 메시지 출력
        Main->>Main: 함수 종료
    end
    
    Main->>FileOps: 이미지 파일 개수 확인
    FileOps-->>Main: PNG/BMP 파일 개수
    Main->>User: 발견된 파일 개수 표시
    Main->>User: 출력 파일명 요청
    User->>Main: 파일명 입력 (또는 자동 생성)
    
    Main->>Analyzer: merge_extracted_files() 호출
    
    loop 각 추출된 파일
        Analyzer->>FileOps: 파일명에서 오프셋 추출
        Analyzer->>FileOps: 새 파일 데이터 읽기
        Analyzer->>Analyzer: 원본 위치에서 크기 확인
        
        alt PNG 파일
            Analyzer->>Analyzer: PNG 시그니처 검증
            Analyzer->>Analyzer: IEND 마커로 원본 크기 계산
        else BMP 파일
            Analyzer->>Analyzer: BMP 시그니처 검증  
            Analyzer->>Analyzer: 헤더에서 원본 크기 읽기
        end
        
        alt 크기가 동일
            Analyzer->>Analyzer: 바이트 단위 직접 교체
        else 크기가 다름
            Analyzer->>User: 경고 메시지 출력 (교체 건너뛰기)
        end
    end
    
    Analyzer->>FileOps: 수정된 데이터를 파일로 저장
    Analyzer-->>Main: 작업 결과 (성공/실패)
    Main->>User: 합치기 결과 보고

🏗️ 4. 크기 변화 허용 재구성 로직 (옵션 3)

sequenceDiagram
    participant User as 👤 사용자
    participant Main as 🏠 main()
    participant Analyzer as 🔍 BinaryFileAnalyzer
    participant ImageCollector as 📷 이미지 수집기
    participant Reconstructor as 🔧 재구성기

    User->>Main: 옵션 3 선택
    Main->>Analyzer: load_file() 호출
    Main->>User: 추출 디렉터리 경로 요청
    User->>Main: 디렉터리 경로 입력
    
    Main->>Analyzer: rebuild_with_size_adjustment() 호출
    
    Analyzer->>ImageCollector: 원본 이미지 정보 수집 시작
    
    loop PNG 이미지 수집
        ImageCollector->>ImageCollector: PNG 시그니처 검색
        ImageCollector->>ImageCollector: IEND 마커로 크기 계산
        ImageCollector->>ImageCollector: 이미지 정보 저장
    end
    
    loop BMP 이미지 수집
        ImageCollector->>ImageCollector: BMP 시그니처 검색
        ImageCollector->>ImageCollector: 헤더에서 크기 읽기
        ImageCollector->>ImageCollector: 이미지 정보 저장
    end
    
    ImageCollector->>Analyzer: 원본 이미지 리스트 반환
    
    Analyzer->>Analyzer: 추출된 교체 파일들 수집
    
    loop 파일명에서 오프셋 추출
        Analyzer->>Analyzer: 정규식으로 오프셋 파싱
        Analyzer->>Analyzer: 교체 파일 데이터 로드
    end
    
    Analyzer->>Reconstructor: 새 데이터 구성 시작
    
    loop 각 원본 이미지 순서대로
        Reconstructor->>Reconstructor: 이미지 이전 데이터 복사
        
        alt 교체 파일 존재
            Reconstructor->>Reconstructor: 새 이미지 데이터 추가
        else 교체 파일 없음
            Reconstructor->>Reconstructor: 원본 이미지 데이터 유지
        end
        
        Reconstructor->>Reconstructor: 현재 위치 업데이트
    end
    
    Reconstructor->>Reconstructor: 마지막 남은 데이터 추가
    Reconstructor->>Analyzer: 새 바이너리 데이터 반환
    
    Analyzer->>Analyzer: 출력 파일 저장
    Analyzer-->>Main: 재구성 결과
    Main->>User: 재구성 완료 보고

🔍 5. ASUS Packer 추출 로직 (옵션 5)

sequenceDiagram
    participant User as 👤 사용자
    participant Main as 🏠 main()
    participant Analyzer as 🔍 BinaryFileAnalyzer
    participant PackageDetector as 📦 패키지 감지기
    participant Extractor as 📤 추출기
    participant InfoGenerator as 📋 정보 생성기

    User->>Main: 옵션 5 선택
    Main->>Analyzer: load_file() 호출
    Main->>User: 출력 디렉터리 경로 요청
    User->>Main: 디렉터리 경로 입력
    
    Main->>Analyzer: extract_asus_packed_images() 호출
    Analyzer->>PackageDetector: detect_asus_packer_format() 호출
    
    PackageDetector->>PackageDetector: ASUS 시그니처 패턴 검색
    Note over PackageDetector: 패턴: \x00\x00\x00\x00\x20\x00\x00\x00\xFF\xFF...
    
    loop 각 발견된 패키지
        PackageDetector->>PackageDetector: 헤더 이후 메타데이터 파싱
        
        loop 패키지 내 각 이미지
            PackageDetector->>PackageDetector: 이미지 크기/오프셋 읽기 (Little-Endian)
            PackageDetector->>PackageDetector: 특별 헤더 패턴 검증
            PackageDetector->>PackageDetector: 이미지 데이터 추출
            PackageDetector->>PackageDetector: 이미지 타입 감지 (PNG/BMP/JPG 등)
            PackageDetector->>PackageDetector: 이미지 정보 저장
        end
        
        PackageDetector->>PackageDetector: 패키지 정보 구조체 생성
    end
    
    PackageDetector-->>Analyzer: ASUS 패키지 리스트 반환
    
    alt 패키지 발견되지 않음
        Analyzer-->>Main: 0 반환 (추출 실패)
        Main->>User: "ASUS Packer 형식의 이미지를 찾을 수 없습니다"
    else 패키지 발견됨
        Analyzer->>Extractor: 추출 작업 시작
        
        loop 각 패키지별
            Extractor->>Extractor: 패키지별 디렉터리 생성
            
            loop 패키지 내 각 이미지
                Extractor->>Extractor: 표준 파일명 생성
                Note over Extractor: 형식: image_nr{번호}_off0x{오프셋}.{확장자}
                Extractor->>Extractor: 이미지 파일 저장
            end
            
            Extractor->>InfoGenerator: 패키지 정보 파일 생성
            InfoGenerator->>InfoGenerator: TXT 정보 파일 생성
            InfoGenerator->>InfoGenerator: Markdown 정보 파일 생성
        end
        
        Analyzer-->>Main: 추출된 이미지 수 반환
        Main->>User: 추출 완료 보고
    end

🔄 6. ASUS Packer 재패키징 로직 (옵션 6)

sequenceDiagram
    participant User as 👤 사용자
    participant Main as 🏠 main()
    participant Analyzer as 🔍 BinaryFileAnalyzer
    participant ModDetector as 🔍 수정 감지기
    participant DirectReplacer as ⚡ 직접 교체기
    participant StructureRebuilder as 🏗️ 구조 재구성기
    participant Verifier as ✅ 검증기

    User->>Main: 옵션 6 선택
    Main->>Analyzer: load_file() 호출
    Main->>User: 추출 디렉터리 경로 요청
    User->>Main: 디렉터리 경로 입력
    Main->>User: 재패키징 방식 선택 (1-4)
    User->>Main: 방식 선택
    
    alt 방식 1: 최대 구조 보존
        Main->>Analyzer: rebuild_asus_packer_preserve_structure() 호출
        
        Analyzer->>Analyzer: 1단계 - 원본 ASUS 패키지 구조 분석
        Note over Analyzer: 🔧 개선: 원본 특별 패턴 24바이트 완전 보존
        Note over Analyzer: 🔧 개선: 정확한 32바이트 메타데이터 구조 파싱
        Note over Analyzer: 🔧 개선: special_pattern_offset 필드 추가
        Analyzer->>ModDetector: 2단계 - 수정된 이미지 감지
        
        loop 각 패키지별
            ModDetector->>ModDetector: 추출된 파일과 원본 비교
            ModDetector->>ModDetector: 이미지 형식 검증 (PNG→PNG, BMP→BMP)
            Note over ModDetector: 🆕 새기능: _validate_image_replacement() 메서드
            Note over ModDetector: 🆕 원본 형식과 교체 이미지 형식 일치 확인
            ModDetector->>ModDetector: 바이너리 레벨 일치 검사
            
            alt 파일이 수정됨 AND 형식 일치
                ModDetector->>ModDetector: 수정 정보 기록
            else 파일이 동일함 OR 형식 불일치
                ModDetector->>ModDetector: 변경없음 카운트
                Note over ModDetector: ⚠️ 형식 불일치 시 경고 출력 및 건너뛰기
            end
        end
        
        ModDetector-->>Analyzer: 수정된 이미지 정보 반환
        
        Analyzer->>Analyzer: 3단계 - 크기 변화 분석
        
        alt 총 크기 변화 = 0
            Analyzer->>DirectReplacer: 바이트 단위 직접 교체
            DirectReplacer->>DirectReplacer: 원본 데이터 복사
            DirectReplacer->>DirectReplacer: 형식 재검증 (이중 안전장치)
            Note over DirectReplacer: 🆕 교체 전 이미지 형식 재확인
            DirectReplacer->>DirectReplacer: 역순으로 이미지 교체
            Note over DirectReplacer: 오프셋 변화 방지를 위한 역순 처리
            DirectReplacer->>DirectReplacer: 수정된 파일 저장
        else 총 크기 변화 ≠ 0
            Analyzer->>StructureRebuilder: 구조 보존 재구성
            
            loop 각 패키지별
                StructureRebuilder->>StructureRebuilder: 패키지 전 데이터 보존
                StructureRebuilder->>StructureRebuilder: ASUS 헤더 완전 보존 (32바이트)
                
                loop 각 이미지별 (번호 순)
                    alt 수정된 이미지
                        StructureRebuilder->>StructureRebuilder: 새 이미지 데이터 사용
                        Note over StructureRebuilder: 🔧 크기 필드에 새 크기 반영
                    else 원본 이미지
                        StructureRebuilder->>StructureRebuilder: 원본 데이터 보존
                        Note over StructureRebuilder: 🔧 원본 크기 필드 유지
                    end
                    
                    StructureRebuilder->>StructureRebuilder: 메타데이터 엔트리 생성
                    Note over StructureRebuilder: 크기(4바이트) + 상대오프셋 0x20(4바이트)
                    StructureRebuilder->>StructureRebuilder: 🔥 핵심 개선: 원본 특별 패턴 완전 보존
                    Note over StructureRebuilder: 1단계: 저장된 원본 특별패턴 사용
                    Note over StructureRebuilder: 2단계: 원본파일에서 직접 추출 (Fallback)  
                    Note over StructureRebuilder: 3단계: 기본패턴 사용 (최후수단)
                    Note over StructureRebuilder: ❌ 하드코딩된 고정 패턴 사용 금지
                    StructureRebuilder->>StructureRebuilder: 이미지 데이터 추가
                    StructureRebuilder->>StructureRebuilder: 4바이트 정렬 패딩
                    Note over StructureRebuilder: padding = (4 - (크기 % 4)) % 4
                end
                
                StructureRebuilder->>StructureRebuilder: 패키지 완료
            end
            
            StructureRebuilder->>StructureRebuilder: 패키지 후 데이터 보존
            StructureRebuilder->>StructureRebuilder: 재구성된 파일 저장
        end
        
        Analyzer-->>Main: 재패키징 결과
        
    else 방식 2: 원본 구조 보존
        Main->>Analyzer: rebuild_asus_packer_with_original_structure() 호출
        Note over Analyzer: 원본 구조 기반 재구성 (개선된 방식)
        
    else 방식 3: 완전 재구성
        Main->>Analyzer: rebuild_asus_packer_format() 호출
        Note over Analyzer: 전체 재작성 (기존 방식)
        
    else 방식 4: 구조 검증
        Main->>User: 원본 파일 경로 요청
        User->>Main: 원본 파일 경로
        Main->>User: 비교할 재구성 파일 경로 요청
        User->>Main: 재구성 파일 경로
        Main->>Analyzer: verify_asus_structure_preservation() 호출
        
        Analyzer->>Verifier: 원본 파일 구조 분석
        Analyzer->>Verifier: 재구성 파일 구조 분석
        Verifier->>Verifier: 패키지 개수 비교
        Verifier->>Verifier: 헤더 오프셋 비교
        Verifier->>Verifier: 이미지 개수 비교
        Verifier->>Verifier: 메타데이터 바이트별 비교
        Note over Verifier: 🆕 새기능: 특별 패턴 보존 검증
        Note over Verifier: 🆕 이미지 형식 검증 결과 확인
        Verifier->>Verifier: 크기 필드 정확성 검증
        Verifier-->>Analyzer: 검증 결과
        Analyzer-->>Main: 검증 완료
        Main->>Main: 함수 종료 (return)
    end
    
    alt 재패키징 성공
        Main->>User: 작업 완료 알림
        Main->>User: 구조 검증 수행 여부 확인
        
        alt 사용자가 검증 선택
            User->>Main: 'y' 입력
            Main->>Analyzer: verify_asus_structure_preservation() 호출
            Analyzer->>Verifier: 구조 검증 수행
            Verifier->>Verifier: 헤더 직후 6바이트 비교 검증
            Note over Verifier: 🔍 크기 필드 변경이 정상인지 확인
            Verifier-->>Main: 검증 결과
        end
        
    else 재패키징 실패
        Main->>User: 작업 실패 알림
    end

🔧 7. 핵심 컴포넌트별 상세 로직

7.1 ASUS 패키지 감지 로직

sequenceDiagram
    participant Detector as 🔍 PackageDetector
    participant Parser as 📋 MetadataParser
    participant TypeDetector as 🏷️ ImageTypeDetector

    Detector->>Detector: ASUS 시그니처 패턴 검색
    Note over Detector: \x00\x00\x00\x00\x20\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF...
    
    loop 각 발견된 시그니처
        Detector->>Parser: 헤더 이후 메타데이터 파싱 시작
        Parser->>Parser: 이미지 번호 = 1로 초기화
        
        loop 메타데이터 엔트리 파싱
            Parser->>Parser: 4바이트 이미지 크기 읽기 (Little-Endian)
            Parser->>Parser: 4바이트 오프셋 읽기 (Little-Endian)
            Parser->>Parser: 🆕 개선: 24바이트 특별 패턴 추출 및 저장
            Note over Parser: special_pattern_offset = head + 8
            Note over Parser: special_pattern = data[offset:offset+24]
            
            alt 크기 = 0 또는 오프셋 = 0
                Parser->>Parser: 루프 종료 (패키지 끝)
            end
            
            Parser->>Parser: 특별 헤더 패턴 검증
            Note over Parser: 패턴: 00000000300009040000000000000000
            
            alt 패턴 불일치
                Parser->>Parser: 루프 종료 (잘못된 구조)
            end
            
            Parser->>Parser: 이미지 데이터 위치 계산
            Parser->>Parser: 이미지 데이터 추출
            Parser->>TypeDetector: 이미지 타입 감지 요청
            
            TypeDetector->>TypeDetector: 헤더 바이트 검사
            alt PNG 시그니처 (89504E47)
                TypeDetector-->>Parser: "png" 반환
            else BMP 시그니처 (424D)
                TypeDetector-->>Parser: "bmp" 반환
            else JPEG 시그니처 (FFD8FF)
                TypeDetector-->>Parser: "jpg" 반환
            else 기타
                TypeDetector-->>Parser: "img" 반환
            end
            
            Parser->>Parser: 이미지 정보 구조체 생성
            Note over Parser: 🆕 추가 필드: special_pattern_offset, special_pattern
            Parser->>Parser: 🆕 개선: 정확한 32바이트 단위 다음 위치 계산
            Note over Parser: next_pos = head + 32 + 이미지크기 + 패딩
            Parser->>Parser: 이미지 번호 증가
        end
        
        Parser->>Detector: 패키지 정보 반환
        Detector->>Detector: 패키지 리스트에 추가
        Detector->>Detector: 다음 패키지 검색 위치 설정
    end

7.2 수정된 이미지 감지 로직

sequenceDiagram
    participant Detector as 🔍 ModificationDetector
    participant FileReader as 📖 FileReader
    participant Comparator as ⚖️ BinaryComparator

    loop 각 원본 패키지
        Detector->>Detector: 패키지 디렉터리 경로 구성
        Note over Detector: 형식: asus_pack_{패키지번호}
        
        loop 패키지 내 각 이미지
            Detector->>Detector: 표준 파일명 구성
            Note over Detector: image_nr{번호}_off0x{오프셋}.{확장자}
            
            Detector->>FileReader: 추출된 파일 존재 확인
            
            alt 파일 존재
                FileReader->>FileReader: 추출된 파일 데이터 읽기
                FileReader-->>Detector: 파일 데이터 반환
                
                Detector->>Detector: 🆕 이미지 형식 검증 수행
                Note over Detector: _validate_image_replacement() 호출
                Note over Detector: 원본 형식과 교체 이미지 형식 비교
                
                alt 형식 불일치
                    Detector->>Detector: 경고 메시지 출력 및 건너뛰기
                    Detector->>Detector: unchanged_count 증가
                else 형식 일치
                    Detector->>Comparator: 바이너리 비교 수행
                    Comparator->>Comparator: 원본 데이터와 추출 데이터 비교
                    
                    alt 데이터 일치
                        Comparator-->>Detector: "변경없음" 반환
                        Detector->>Detector: unchanged_count 증가
                    else 데이터 불일치
                        Comparator-->>Detector: "수정됨" 반환
                        Detector->>Detector: modified_count 증가
                        Detector->>Detector: 수정 정보 기록
                        Note over Detector: 원본 이미지, 새 데이터, 크기 차이 저장
                    end
                end
                
            else 파일 없음
                Detector->>Detector: 경고 메시지 출력
                Detector->>Detector: missing_count 증가
            end
        end
    end
    
    Detector->>Detector: 수정 통계 생성
    Note over Detector: 총 이미지, 변경없음, 수정됨, 누락됨

7.3 구조 보존 재구성 로직

sequenceDiagram
    participant Builder as 🏗️ StructureBuilder
    participant HeaderPreserver as 📋 HeaderPreserver
    participant ImageProcessor as 🖼️ ImageProcessor
    participant AlignmentHandler as 📐 AlignmentHandler

    Builder->>Builder: 새 바이너리 데이터 초기화
    Builder->>Builder: 현재 위치 = 0으로 설정
    
    loop 각 원본 패키지 순서대로
        Builder->>HeaderPreserver: 패키지 전 데이터 보존
        HeaderPreserver->>HeaderPreserver: 이전 위치부터 패키지 시작까지 복사
        HeaderPreserver-->>Builder: 보존된 데이터
        
        Builder->>HeaderPreserver: ASUS 헤더 완전 보존
        HeaderPreserver->>HeaderPreserver: 32바이트 원본 헤더 복사
        HeaderPreserver-->>Builder: 헤더 데이터
        
        Builder->>ImageProcessor: 이미지별 구조 재구성 시작
        
        loop 각 이미지 (번호 순 정렬)
            ImageProcessor->>ImageProcessor: 절대 오프셋으로 수정 여부 확인
            
            alt 수정된 이미지
                ImageProcessor->>ImageProcessor: 새 이미지 데이터 사용
            else 원본 이미지
                ImageProcessor->>ImageProcessor: 원본 데이터 보존
            end
            
            ImageProcessor->>ImageProcessor: 메타데이터 엔트리 생성
            Note over ImageProcessor: 크기(4바이트) + 고정오프셋(4바이트)
            
            ImageProcessor->>ImageProcessor: 🆕 개선: 원본 특별 패턴 완전 보존
            Note over ImageProcessor: 1순위: img_info['special_pattern'] 사용
            Note over ImageProcessor: 2순위: 원본 파일에서 직접 추출
            Note over ImageProcessor: 3순위: 기본 패턴 (최후 수단)
            
            alt 원본 특별 패턴 존재 AND 길이 = 24바이트
                Note over ImageProcessor: 저장된 원본 패턴 사용 ✅
            else 패턴 없음 OR 잘못된 길이
                alt 원본 파일에서 추출 가능
                    Note over ImageProcessor: metadata_start + 8:32에서 추출 ✅
                else 추출 불가능
                    Note over ImageProcessor: ⚠️ 기본 패턴 사용 (최후 수단)
                    alt 첫 번째 이미지
                        Note over ImageProcessor: FFFF0A00FFFF004000000000300009040000000000000000
                    else 나머지 이미지
                        Note over ImageProcessor: 00FFFF0A00FFFF0200000000300009040000000000000000
                    end
                end
            end
            
            ImageProcessor->>ImageProcessor: 이미지 데이터 추가
            ImageProcessor->>AlignmentHandler: 4바이트 정렬 요청
            
            AlignmentHandler->>AlignmentHandler: 패딩 크기 계산
            Note over AlignmentHandler: padding = (4 - (크기 % 4)) % 4
            
            alt 패딩 필요
                AlignmentHandler->>AlignmentHandler: NULL 바이트 패딩 추가
            end
            
            AlignmentHandler-->>ImageProcessor: 정렬 완료
        end
        
        ImageProcessor-->>Builder: 패키지 재구성 완료
        Builder->>Builder: 현재 위치 업데이트
    end
    
    Builder->>Builder: 마지막 패키지 후 데이터 보존
    Builder->>Builder: 재구성된 파일 저장

  1. 바로 전에는 왼쪽의 ROG 로고와 UEFI BIOS Utility - EZ Mode 라는 문구, 마우스 커서가 보이지 않았다. ↩︎

이 포스트는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

인기 태그