我有一个ARM Linux内核映像文件。 但我不确定它是什么样的格式
“文件”命令告诉我这是纯数据。
首先,我认为这是vmlinuz,并试图解压缩它。
我search了'gzip'头部签名,并从那里解压缩。
如何在Linux中解码/ proc / pid / pagemap条目?
访问另一个窗口的应用程序的资源
Windows内核中的Free / malloc函数
我如何看到Linux内核SNMP计数器?
但我得到的是以下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,r9,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,#4 mov r8,r4 add pc,sl,#16 b 0x00014894 andhi r8,r0,ror #3 andhi r8,asr #32 andhi r0,r0 add r4,#16384 ; 0x4000 mov r0,r4 mov r3,#0 add r6,#16384 ; 0x4000 str r3,[r0],#4 str r3,#4 teq r0,r6 bne 0x00000060 ldr r7,[sl,#8] add r0,#196 ; 0xc4 ldm r0,{r3,r5,r6} sub r0,r3 add r5,r0 add r6,r6,r0 lsr r5,#20 lsr r6,#20 orr r3,r7,lsl #20 str r3,[r4,lsl #2] cmp r5,r6 addcc r5,#0 bcc 0x00000098 mov r3,pc lsr r3,lsl #20 add r0,r4,#8192 ; 0x2000 str r3,[r0,#0]! ldr r6,#124] ; 0x00000144 add r0,#4 add r6,lsr #18 cmp r0,r6 add r3,#1048576 ; 0x100000 strls r3,#4 bls 0x000000cc lsr r0,r2,#20 lsls r0,#20 moveq r0,r8 sub r3,r8 add r3,#-2147483648 ; 0x80000000 add r3,lsr #18 orr r6,r0 str r6,[r3] mov r7,#36864 ; 0x9000 orr r3,#-134217728 ; 0xf8000000 orr r7,#268435456 ; 0x10000000 lsr r3,#20 lsl r3,#2
….
这是用于ARM模拟器(SoCdevise器)的引导过程的内核映像文件。 它工作正常。
我想要的是这个内核的ELF文件,我可以用反汇编打开像IDA。
但我不能从这个内核图像检索原始的ELF格式的文件…
一些帮助将不胜感激。
先谢谢你。
如何从结构页面结构vm_area_struct
在linux内核上寻找系统调用实现
如何在重新连接时使windbg强制加载符号?
在VmWare虚拟机内实现一个Linux客户操作系统的内核debugging模块
linux / init.h:没有这样的文件或direcotry
ARM Linux内核通常是自加载的原始二进制文件,通过从原始的ELF中提取代码+ rdata部分并附加“piggy”加载器生成。 它们被bootloader加载到内存中的某个地方,然后从那里运行。 小猪装载机将主载荷解包/复制到最终地址并跳转到该地址。
从二进制文件恢复ELF可能是可能的(最终运行时地址通常固定为0xC0008000,通过分析启动代码可以找到.data / .bss范围),但符号表更复杂。 最近的内核不使用ELF符号表,而是使用压缩来节省空间。 如果可以启动内核,最简单的方法是读取/proc/ksyms或/proc/kallsyms ,因为它将具有未压缩格式的符号。 否则,你必须在二进制文件中找到压缩表并手动解压。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。