2013-02-10 3 views
2

ARM Linux 커널 이미지 파일이 있습니다. 하지만 확실하지 않습니다 정확히 어떤 종류의 형식입니까?알 수없는 arm linux 커널 이미지 형식

'file'명령은 순수한 데이터라고합니다.

먼저 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 

나는 16 진수 덤프로 이진을 철저히 조사했다. 이것은 순수한 ARM 바이너리 파일이라고 생각합니다. 이 ARM 시뮬레이터 (SoC 디자이너)에 대한 프로세스 부팅 사용 커널 이미지 파일

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 

....

다음과 같이

처음 몇 바이트 분해 하였다. 그리고 그것은 잘 작동합니다.

내가 원하는 것은 IDA와 같은 디스어셈블러로 열 수있는이 커널의 ELF 파일 입니다.

하지만이 커널 이미지에서 원래 ELF 형식의 파일을 검색하지 못할 ...

도움을 주시면 감사하겠습니다.

미리 감사드립니다.

+0

IDA는 다음과 같은 이유로 이진 BLOB를 열 수 없습니다 ...? – JosephH

+0

일반적으로 vmlinux는 빌드 된 프로세스에서만 가져옵니다. – auselen

+0

IDA를 바이너리 BLOB로 열 수 있습니다. 하지만 내가 원하는 것은 커널 이미지의 ELF 포맷을 분석하는 것입니다 ... 심볼 테이블, 텍스트 세그먼트, 데이터 세그먼트 등의 함수들 사이의 관계를 봅니다. ELF가 제거되지 않았다고 가정합니다. – daehee

답변

5

ARM Linux 커널은 일반적으로 자체 ELF에서 코드 + rdata 섹션을 추출하고 "돼지"로더를 추가하여 생성되는 자체로드 일반 바이너리입니다. 부트 로더에 의해 메모리의 일부 위치에서로드되고 거기에서 실행됩니다. piggy loader는 메인 페이로드를 최종 주소로 풀고 복사하여 그 주소로 점프합니다.

바이너리에서 ELF를 복원하는 것이 가능할 수도 있습니다 (최종 런타임 주소는 일반적으로 0xC0008000으로 고정되며 부팅 코드를 분석하여 .data/.bss 범위를 찾을 수 있지만 심볼 테이블은 더 까다 롭습니다). 최근 커널은 ELF 심볼 테이블을 그대로 사용하지 않고 공간을 절약하기 위해 압축을 사용합니다. 커널을 부팅 할 수 있다면 가장 쉬운 방법은 /proc/ksyms 또는 /proc/kallsyms으로 기호를 압축 해제 형식으로 읽으므로 읽는 것이 가장 좋습니다. 그렇지 않으면 바이너리에서 압축 된 테이블을 찾아 수동으로 압축을 풀어야합니다.

+0

ow ..이 커널 이미지를 부팅 할 방법이 없으므로 실망 스럽습니다 (특수 시뮬레이터 위에 실행됩니다) ... 그리고 ELF를 재구성하는 데 엄청난 시간이 필요합니다. 파일을이 이미지에서 가져옵니다. 어쨌든 고마워요! – daehee

+0

@daehee 에뮬레이터에서 실행되는 경우 qemu로 부팅 할 수 없습니까? 아니면 아주 새로운 하드웨어 에뮬레이터입니까? – cb88

+0

ARM 리눅스 나 안드로이드가 일반적으로 0xC0008000에서로드된다는 것을 알고 있습니다. ARM64는 어떻습니까? – gigasai

관련 문제