이 커널 이미지는 어떤 형식입니까? 커널 코드를 추출할 수 없나요?

이 커널 이미지는 어떤 형식입니까? 커널 코드를 추출할 수 없나요?

다음을 포함하는 Android 이미지가 있습니다.

-rwxr-xr-x 1 root root  69206016 Dec 16 17:01 cache.img
-rwxr-xr-x 1 root root   6024864 Mar 23  2016 Image
-rwxr-xr-x 1 root root   1108329 Mar  7  2016 ramdisk.img
-rwxr-xr-x 1 root root 943718400 Mar  7  2016 system.img
-rwxr-xr-x 1 root root 576716800 Dec 16 17:02 userdata.img

Android 에뮬레이터를 통해 시작할 수 있습니다.

./emulator64-ranchu-arm64 -system ./system.img -data ./userdata.img -ramdisk ./ramdisk.img -kernel ./Image -cache ./cache.img     -sysdir ./ -no-window  -verbose -show-kernel

또는 qemu를 직접 사용하십시오:

./qemu/linux-x86_64/qemu-system-aarch64 -cpu cortex-a57 -machine type=ranchu -m 512 -append 'console=ttyAMA0,38400 keep_bootcon earlyprintk=ttyAMA0' -serial mon:stdio -kernel .//Image -initrd .//ramdisk.img -drive index=0,id=sdcard,file=.//system.img -device virtio-blk-device,drive=sdcard -drive index=1,id=userdata,file=.//.//userdata.img -device virtio-blk-device,drive=userdata -drive index=2,id=cache,file=.//cache.img -device virtio-blk-device,drive=cache -drive index=3,id=system,file=.//system.img -device virtio-blk-device,drive=system -netdev user,id=mynet -device virtio-net-device,netdev=mynet -show-cursor -nographic -L lib/pc-bios

이제 커널 코드를 추출하고 싶지만 이 이미지는 다른 것 같습니다. 일반적인 단계: gzip 데이터의 오프셋을 찾고, 분할을 사용하고 dd, gzip을 사용하여 vmlinux를 가져오지만 작동하지 않습니다. 이 이미지에서 얻은 정보는 다음과 같습니다.

root@Debian:~$ file Image
Image: data

root@Debian:~$ binwalk Image

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
4395136       0x431080        Linux kernel version "3.10.0+ (root@jiayy) (gcc version 4.9.x-google 20140827 (prerelease) (GCC) ) #63 SMP PREEMPT Wed Mar 23 11:27:47 CST 2016"
4407688       0x434188        gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00)
5270000       0x5069F0        Unix path: /data2/kernel/goldfish/arch/arm64/include/asm/pgalloc.h
5347656       0x519948        Ubiquiti partition header, header size: 56 bytes, name: "PARTNAME=%s", base address: 0x63697479, data size: 0 bytes
5367856       0x51E830        Unix path: /lib/firmware/updates/3.10.0+
5382775       0x522277        Unix path: /net/ethernet/smsc/smc91x.c
5410863       0x52902F        Unix path: /staging/android/ion/ion.c
5412463       0x52966F        Unix path: /staging/android/ion/ion_heap.c
5412663       0x529737        Unix path: /staging/android/ion/ion_page_pool.c
5412823       0x5297D7        Unix path: /staging/android/ion/ion_system_heap.c
5443853       0x53110D        Copyright string: "Copyright (c) 2006-2007 BalaBit IT Ltd."
5483104       0x53AA60        Neighborly text, "NeighborSolicits"
5483128       0x53AA78        Neighborly text, "NeighborAdvertisementsErrors"
5488754       0x53C072        Neighborly text, "neighbor %.2x%.2x.%pM lost rename link %s to %s"
5710184       0x572168        ASCII cpio archive (SVR4 with no CRC), file name: "dev", file name length: "0x00000004", file size: "0x00000000"
5710300       0x5721DC        ASCII cpio archive (SVR4 with no CRC), file name: "dev/console", file name length: "0x0000000C", file size: "0x00000000"
5710424       0x572258        ASCII cpio archive (SVR4 with no CRC), file name: "root", file name length: "0x00000005", file size: "0x00000000"
5710540       0x5722CC        ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
5754880       0x57D000        ELF, 64-bit LSB shared object, version 1 (SYSV)
5760064       0x57E440        CRC32 polynomial table, little endian


root@Debian:~$ xxd -g 1 Image|head
0000000: 10 00 00 14 00 00 00 00 00 00 08 00 00 00 00 00  ................
0000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0000030: 00 00 00 00 00 00 00 00 41 52 4d 64 00 00 00 00  ........ARMd....
0000040: f5 03 00 aa 72 00 00 94 0e 00 00 94 16 00 38 d5  ....r.........8.
0000050: e0 03 16 aa fb 00 00 94 f7 03 00 aa 97 1e 00 b4  ................
0000060: 0a 01 00 94 73 00 00 94 9b 1a 00 58 3e 0b 00 10  ....s......X>...
0000070: ec 0a 40 f9 8c 01 1c 8b 80 01 1f d6 1f 20 03 d5  ..@.......... ..
0000080: 40 42 38 d5 1f 20 00 f1 04 18 49 fa 20 17 00 58  @B8.. ....I. ..X
0000090: 00 00 1c 8b 60 00 00 54 1f 00 00 b9 c0 03 5f d6  ....`..T......_.

커널 구성 파일은 오프셋 0x434188(binwalk 출력의 두 번째 세그먼트에 해당)에서 추출할 수 있습니다. 또한 Google git에서 extract-vmlinux.sh를 사용해 보았습니다(https://android.googlesource.com/kernel/goldfish/+/android-goldfish-3.10-m-dev/scripts/extract-vmlinux) 하지만 그것도 작동하지 않습니다.

그렇다면 이 커널 이미지의 형식은 무엇이며 여기에서 커널 코드를 추출하는 방법은 무엇입니까?

답변1

나는 파티에 조금 늦었다는 것을 알고 있지만 질문자의 이미지와 매우 유사한 vmlinux 이미지를 다루고 있습니다. 당신이 가진 전부는 aarch64-linux-gnu-objdump -b binary -maarch64 -EL -D vmlinux.

다행히 몇몇 아름다운 영혼들이 원시 vmlinux 이미지를 ELF 바이너리 형식으로 변환하는 도구를 작성했습니다. 이미지는 실행 가능하지 않지만 gdb와 같은 디버거/디스어셈블러에서 사용할 수 있습니다.. 또한 내장된 기호를 찾아 출력 ELF 파일에서 확인하려고 시도합니다. vmlinux-to-elf라는 도구를 찾을 수 있습니다여기

링크:

절단기 다운로드

vmlinux-to-elf 다운로드

답변2

이 커널 이미지는 vmlinux의 부팅 가능한 원시 바이너리 부분이므로 완전한 ELF 파일이 아닙니다. 커널 코드를 얻으려면 처음부터 분해하면 됩니다.

관련 정보