initramfs가 내장된 커널이 있습니다. 나는 그것을 추출하고 싶다.
x86 boot sector
이 작업을 수행하면 출력이 표시됩니다.file bzImage
이 커널 이미지에 대한 System.map 파일이 있습니다.
이 커널에서 내장된 initramfs 이미지를 추출하는 방법이 있습니까?시스템 다이어그램문서?
흥미로운 문자열 찾기시스템 다이어그램파일은 다음과 같습니다. (도움이 될 경우를 대비해)
57312:c17fd8cc T __initramfs_start
57316:c19d7b90 T __initramfs_size
답변1
젠투 위키에는 이에 대한 정보가 있습니다:https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging
binwalk
매우 좋은 결과를 가지고 사용하는 것이 좋습니다 .
예를 들어 빠르게 살펴보겠습니다.
먼저 binwalk를 사용하여 bzImage 파일의 압축을 풉니다.
> binwalk --extract bzImage
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Microsoft executable, portable (PE)
18356 0x47B4 xz compressed data
9772088 0x951C38 xz compressed data
나는 세 개의 파일 로 끝났습니다 47B4
.47B4.xz
951C38.xz
> file 47B4
47B4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa47c6853b19e9242401db60d6ce12fe84814020, stripped
이제 binwalk를 다시 실행해 보겠습니다 47B4
.
> binwalk --extract 47B4
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 ELF, 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
9818304 0x95D0C0 Linux kernel version "4.4.6-gentoo (root@host) (gcc version 4.9.3 (Gentoo Hardened 4.9.3 p1.5, pie-0.6.4) ) #1 SMP Tue Apr 12 14:55:10 CEST 2016"
9977288 0x983DC8 gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00)
<snip>
반환된 결과는 발견된 경로와 잠재적으로 흥미로운 여러 파일의 긴 목록입니다. 한 번 보자.
> file _47B4.extracted/*
<snip>
_47B4.extracted/E9B348: ASCII cpio archive (SVR4 with no CRC)
파일은 E9B348
우리가 찾고 있는 (압축이 풀린) cpio 아카이브입니다! 빙고!
압축되지 않은 cpio 아카이브(initramfs!)를 현재 디렉토리에 압축 해제하려면 다음을 실행하세요.
> cpio -i < E9B348
너무 쉽습니다. binwalk
확실히 당신이 찾고 있는 도구입니다. 참고로 여기서는 v2.1.1을 사용하고 있습니다.
답변2
내가 아는 한, initramfs cpio 아카이브는 커널에 링크되어 있습니다.
그래서 이것은 작동합니다 :
dd
와 사이의 범위를 추출하는 데 사용됩니다 .c17fd8cc
c19d7b90
- CPIO 언패커를 사용하여 결과 데이터를 언팩합니다.
답변3
"dd를 사용하여 c17fd8cc와 c19d7b90 사이의 범위를 추출"하면 작동하지 않습니다. 이는 커널 가상 주소이고 이미지가 물리적 공간에 있기 때문입니다. 이것이 작동하려면 이미지 오프셋으로 변환해야 합니다. 일반적으로 가상 오프셋(이 경우 0xC0000000과 유사)을 빼고 PHYS_OFFSET(보통 0x8000)을 추가할 수도 있지만 이는 커널에 따라 다릅니다.