![다시 빌드하지 않고 vmlinux.bin(내장 initramfs)에서 파일 시스템 이미지를 다시 패키지하시겠습니까?](https://linux55.com/image/104624/%EB%8B%A4%EC%8B%9C%20%EB%B9%8C%EB%93%9C%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20vmlinux.bin(%EB%82%B4%EC%9E%A5%20initramfs)%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC%20%EB%8B%A4%EC%8B%9C%20%ED%8C%A8%ED%82%A4%EC%A7%80%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
존재하다vmlinux.bin에서 파일 시스템 이미지를 추출하는 방법은 무엇입니까?그리고https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging커널 이미지에 포함된 내장 initramfs/initrd를 얻고 압축을 푸는 방법을 제공합니다.
cpio
이제 수정된 파일 시스템( +예: 패키징 사용 가능 lzma
)을 다시 컴파일하지 않고 커널 실행 파일에 삽입하고 싶습니다 . 이런 방식으로 커널의 ELF 이미지를 수정할 수 있습니까? 그렇다면 어떨까요? 단순히 바이트를 바꾸는 경우(어쩌면 해싱으로?) 뭔가를 보존해야 합니까?
objdump-h
산출:
vmlinux.64.orig: file format elf64-big
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 004162b8 ffffffff80100000 ffffffff80100000 00010000 2**7
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 __ex_table 000063a0 ffffffff805162c0 ffffffff805162c0 004262c0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .notes 00000024 ffffffff8051c660 ffffffff8051c660 0042c660 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .rodata 0041f700 ffffffff8051d000 ffffffff8051d000 0042d000 2**8
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .pci_fixup 00000d40 ffffffff8093c700 ffffffff8093c700 0084c700 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 __ksymtab 0000a430 ffffffff8093d440 ffffffff8093d440 0084d440 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 __ksymtab_gpl 00004ff0 ffffffff80947870 ffffffff80947870 00857870 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 __ksymtab_strings 00010f14 ffffffff8094c860 ffffffff8094c860 0085c860 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 __init_rodata 00000500 ffffffff8095d778 ffffffff8095d778 0086d778 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 __param 00001388 ffffffff8095dc78 ffffffff8095dc78 0086dc78 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .data 000508c0 ffffffff80960000 ffffffff80960000 00870000 2**14
CONTENTS, ALLOC, LOAD, DATA
11 .init.text 0002b084 ffffffff809b1000 ffffffff809b1000 008c1000 2**5
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .init.data 00bc6d78 ffffffff809dc088 ffffffff809dc088 008ec088 2**3
CONTENTS, ALLOC, LOAD, DATA
13 .exit.text 000019e0 ffffffff815a2e00 ffffffff815a2e00 014b2e00 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .data.percpu 00003680 ffffffff815a5000 ffffffff815a5000 014b5000 2**7
CONTENTS, ALLOC, LOAD, DATA
15 .bss 00068fb0 ffffffff815b0000 ffffffff815b0000 014b8680 2**16
ALLOC
16 .mdebug.abi64 00000000 ffffffff81618fb0 ffffffff81618fb0 014b8680 2**0
CONTENTS, READONLY
17 .comment 0000cd74 0000000000000000 0000000000000000 014b8680 2**0
CONTENTS, READONLY
18 .gnu.attributes 00000010 0000000000000000 0000000000000000 014c53f4 2**0
답변1
예, 가능합니다. 하지만 커널의 ELF 실행 파일이 가상 주소와 정적으로 연결되어 있으므로 .init.ramfs 섹션 크기와 주소를 변경하는 것만으로는 충분하지 않습니다.시작과 끝initramfs 섹션.
Linux 소스 코드에서 관련 코드는 iniramfs.c 소스 파일에 있습니다.
void __init populate_rootfs(void)
{
char *err = unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start, 0);
...
}
따라서 .init.text 섹션에 있는 unpack_to_rootfs() 함수를 호출하는 기계어 코드에서도 이 두 오프셋을 변경해야 합니다. (재배치 테이블에 관련 항목이 있는지 확인하세요! ...있는 경우)
또한 Icarus의 답변을 참조하면 initramfs 섹션 크기, 파일 오프셋 및 시작 가상 주소에 대한 작업과 위의 두 오프셋(unpack_to_rootfs() 함수의 매개변수)을 통해 사용자 정의를 직접 추가할 수 있습니다.더 큰initramfs 섹션은 ELF 파일의 최대 가상 주소 위에 로드됩니다. 프로그램 헤더(PHeader)의 "메모리 크기" 필드도 이전 가상 주소 공간 끝에 추가된 더 큰 initramfs 섹션을 반영하도록 수정되어야 합니다.
폴리스티렌 원래 init.ramfs 섹션을 새로운 높은 시작 가상 주소로 이동한 후 커널 가상 주소 공간에 남아 있는 "구멍"은 아무런 해를 끼치지 않습니다. 연결된 메모리는 나중에 init에 정의된 free_initmem(void) 함수에 의해 해제되기 때문입니다. .c 소스 파일.
답변2
답변에서 언급했듯이reverseengineering.se에서 논의된 ELF 부품 교체에 대한 비슷한 질문dd
어떤 경우에는 단순히