[250728] 개발 일지 - 리패키지 아키텍쳐 요약
[250728] 개발 일지 - 리패키지 아키텍쳐 요약
0. 그 이후…
다시 문제를 해결하고, 다시 리패키지 해서 적용시켜보았다. 다행히 정상적으로 적용되었다. 모든 이미지가 정상적으로 로드되어 있다.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: 재구성된 파일 저장
바로 전에는 왼쪽의 ROG 로고와
UEFI BIOS Utility - EZ Mode
라는 문구, 마우스 커서가 보이지 않았다. ↩︎
이 포스트는 저작권자의 CC BY 4.0 라이센스를 따릅니다.