未知 arm linux 内核映像格式
Posted
技术标签:
【中文标题】未知 arm linux 内核映像格式【英文标题】:unknown arm linux kernel image format 【发布时间】:2013-02-10 17:32:46 【问题描述】:我有一个 ARM linux 内核映像文件。但我不确定 究竟是什么格式……
“文件”命令告诉我它是纯数据。
首先,我以为是vmlinuz,尝试解压。
我搜索了“gzip”标头签名和 从那里解压缩。
但我得到的只是遵循 makefile 脚本。
#
# Automatically generated make config: don't edit
# Linux/arm 2.6.38.7 Kernel Configuration
# Sat Apr 28 17:29:46 2012
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_HAVE_SCHED_CLOCK=y
CONFIG_ARCH_SCHED_CLOCK=y
# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_KTIME_SCALAR=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_HARDIRQS_SW_RESEND=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_VECTORS_BASE=0xffff0000
# CONFIG_ARM_PATCH_PHYS_VIRT is not set
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_CONSTRUCTORS=y
CONFIG_HAVE_IRQ_WORK=y
CONFIG_IRQ_WORK=y
#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_LZO is not set
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_HAVE_GENERIC_HARDIRQS=y
#
# IRQ subsystem
#
CONFIG_GENERIC_HARDIRQS=y
# CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED is not set
CONFIG_HAVE_SPARSE_IRQ=y
CONFIG_GENERIC_IRQ_SHOW=y
# CONFIG_GENERIC_PENDING_IRQ is not set
# CONFIG_AUTO_IRQ_AFFINITY is not set
# CONFIG_IRQ_PER_CPU is not set
CONFIG_SPARSE_IRQ=y
#
# RCU Subsystem
#
CONFIG_TREE_RCU=y
# CONFIG_PREEMPT_RCU is not set
# CONFIG_RCU_TRACE is not set
CONFIG_RCU_FANOUT=32
# CONFIG_RCU_FANOUT_EXACT is not set
# CONFIG_TREE_RCU_TRACE is not set
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=14
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
# CONFIG_CGROUP_NS is not set
# CONFIG_CGROUP_FREEZER is not set
# CONFIG_CGROUP_DEVICE is not set
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
# CONFIG_CGROUP_CPUACCT is not set
# CONFIG_RESOURCE_COUNTERS is not set
# CONFIG_CGROUP_SCHED is not set
# CONFIG_BLK_CGROUP is not set
CONFIG_NAMESPACES=y
# CONFIG_UTS_NS is not set
# CONFIG_IPC_NS is not set
# CONFIG_USER_NS is not set
# CONFIG_PID_NS is not set
# CONFIG_HAVE_GET_CYCLES is not set
# CONFIG_HAVE_TRACE_CLOCK is not set
CONFIG_HAVE_TRACE_CLOCK_GENERIC=y
CONFIG_HAVE_TRACE_CLOCK_32_TO_64=y
# CONFIG_HAVE_UNSYNCHRONIZED_TSC is not set
# CONFIG_SCHED_AUTOGROUP is not set
# CONFIG_SYSFS_DEPRECATED is not set
# CONFIG_RELAY is not set
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
# CONFIG_EXPERT is not set
# CONFIG_EMBEDDED is not set
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y
#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
# CONFIG_PERF_COUNTERS is not set
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_SLUB_DEBUG=y
CONFIG_COMPAT_BRK=y
# CONFIG_SLAB is not set
CONFIG_SLUB=y
CONFIG_PROFILING=y
# CONFIG_MARKERS is not set
CONFIG_OPROFILE=y
CONFIG_HAVE_OPROFILE=y
# CONFIG_KPROBES is not set
我用 hexdump 彻底查看了二进制文件。 我认为这是一个纯 ARM 二进制文件。
前几个字节被分解如下
msr CPSR_c, #211 ; 0xd3
mrc 15, 0, r9, cr0, cr0, 0
bl 0x000148e0
movs sl, r5
beq 0x00014924
add r3, pc, #44 ; 0x2c
ldm r3, r4, r8
sub r4, r3, r4
add r8, r8, r4
bl 0x00000154
bl 0x0000018c
bl 0x00000050
ldr sp, [pc, #12] ; 0x00000044
add lr, pc, #4
mov r8, r4
add pc, sl, #16
b 0x00014894
andhi r8, r0, r8, ror #3
andhi r8, r0, r8, asr #32
andhi r0, r0, r0
add r4, r8, #16384 ; 0x4000
mov r0, r4
mov r3, #0
add r6, r0, #16384 ; 0x4000
str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
teq r0, r6
bne 0x00000060
ldr r7, [sl, #8]
add r0, pc, #196 ; 0xc4
ldm r0, r3, r5, r6
sub r0, r0, r3
add r5, r5, r0
add r6, r6, r0
lsr r5, r5, #20
lsr r6, r6, #20
orr r3, r7, r5, lsl #20
str r3, [r4, r5, lsl #2]
cmp r5, r6
addcc r5, r5, #0
bcc 0x00000098
mov r3, pc
lsr r3, r3, #20
orr r3, r7, r3, lsl #20
add r0, r4, #8192 ; 0x2000
str r3, [r0, #0]!
ldr r6, [pc, #124] ; 0x00000144
add r0, r0, #4
add r6, r4, r6, lsr #18
cmp r0, r6
add r3, r3, #1048576 ; 0x100000
strls r3, [r0], #4
bls 0x000000cc
lsr r0, r2, #20
lsls r0, r0, #20
moveq r0, r8
sub r3, r0, r8
add r3, r3, #-2147483648 ; 0x80000000
add r3, r4, r3, lsr #18
orr r6, r7, r0
str r6, [r3]
mov r7, #36864 ; 0x9000
orr r3, r7, #-134217728 ; 0xf8000000
orr r7, r7, #268435456 ; 0x10000000
lsr r3, r3, #20
lsl r3, r3, #2
....
这是用于启动过程的内核映像文件 用于 ARM 模拟器(SoC 设计器)。而且效果很好。
我想要的是这个内核的ELF文件 我可以用 IDA 之类的反汇编程序打开它。
但我无法从此内核映像中检索原始 ELF 格式的文件...
我们将不胜感激。
提前谢谢你。
【问题讨论】:
IDA 不能直接打开任何二进制 blob,因为...? 你一般只能从构建的进程中获取vmlinux。 我可以用 IDA 作为二进制 blob 打开这个二进制文件。但我想要分析内核映像的 ELF 格式...查看函数与符号表、文本段、数据段...等之间的关系我假设内核 ELF 没有被剥离 你得到了/proc/config.gz内容,内核中嵌入的内核配置 【参考方案1】:ARM Linux 内核通常是自加载的普通二进制文件,通过从原始 ELF 中提取 code+rdata 部分并附加“piggy”加载程序而生成。它们由引导加载程序在内存中的某个位置加载,然后从那里运行。 piggy loader 将主要有效载荷解包/复制到最终地址并跳转到该地址。
从二进制文件中恢复 ELF 是可能的(最终运行时地址通常固定为 0xC0008000,您可以通过分析引导代码找出 .data/.bss 范围),但符号表比较棘手。最近的内核不按原样使用 ELF 符号表,而是采用压缩来节省空间。如果您可以引导内核,最简单的方法是读取/proc/ksyms
或/proc/kallsyms
,因为它将包含未压缩格式的符号。否则你必须在二进制文件和decompress it manually中找到压缩表。
【讨论】:
ow.. 这很令人沮丧,因为没有办法启动这个内核映像(它在特殊的模拟器上运行)......而且从这个映像重建 ELF 文件似乎需要大量的时间.还是谢谢你! @daehee 如果它在模拟器中运行,是否无法使用 qemu 启动它,或者这个模拟器适用于非常新的硬件? 我了解到 ARM Linux 或 android 通常在 0xC0008000 加载,那么 ARM64 呢? 这是我们在 arm64 中知道的一个非常古老的帖子,linux 内核图像从系统 ram 启动开始加载到 0x80000。以上是关于未知 arm linux 内核映像格式的主要内容,如果未能解决你的问题,请参考以下文章