怎样反汇编bzImage
不要被bzImage的名字迷惑了,其实b代表着big的意思。而不是说这个image是用bzip2压缩。实际上,这个压缩过程是用gzip程序完成。我们在编译内核可以看到这一点。如果编译2.2或者2.4内核的话,可以直接看到,如果是2.6内核的话,可以用make bzImage V=1就也能看到了。
这样,我们需要做的就是把主干内核代码的压缩数据前面的bootsector/setup/misc部分去掉就行了。因为这个主干内核就是用gzip压缩的,所以,在“掐头”后,可以简单地调用gunzip解压之。这一步还是比较简单的。
下一步,我们得到了主干内核的image文件。但仍然不能直接反汇编!因为它没有ELF信息。当然,如果你满足于使用支持反汇编raw文件的汇编程序的话,就可以到此为止啦。我可没有那么高级的工具,所以,还是想方法恢复ELF的信息吧。恢复这个信息,我的想法就是用ld构造出一个不那么严格的ELF头,只要满足objdump反汇编的要求就行了。那么,如果把符号信息也恢复了呢,不过,我只考虑了.text。
符号信息可以比较容易地从System.map获得。如果没有这个文件,基本恢复完整的符号表无望。我曾经花了些时间试图根据image文件直接恢复符号表,但浅尝辄止了。有了这些信息之后,就可以通过构造一个linker script会达到重新构造ELF信息的目标了。
我用这个方法,成功反汇编了Ubuntu 8.04/x86-64上的2.6.24-23。
具体步骤如下:
#! /bin/sh
set -x
#
# 一般gzip压缩包的magic值为0x8b1f后跟0x0008,或者0x0808。
# 这里就是要找出这个偏移。
# 119116,就是这个偏移,这个偏移在不同的bzImage里是不同的,所以,这里需要手动调整一下。
# 解压后的文件即vmlinux.bin
od -h -A d bzImage | grep --color -m 3 -A 1 -i 8b1f
dd if=bzImage bs=1 skip=11916 | gunzip > vmlinux.bin
# 调用我写的一个python脚本,生成gnu linker script。
./genlds.py > vmlinux.elf.lds
# 构造 ELF 信息,结果文件为vmlinux.elf
ld -m elf_x86_64 --format binary --oformat elf64-x86-64 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf
# 如果是32位系统,可以用以下命令
#ld -m elf_i386 --format binary --oformat elf32-i386 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf
# 删除在上一步生成的多余符号。
objcopy --strip-symbol _binary_vmlinux_bin_start --strip-symbol _binary_vmlinux_bin_end --strip-symbol _binary_vmlinux_bin_size vmlinux.elf
# 设置 .text section标志,否则objdump -d不能正常工作,只能用objdump -D。
objcopy --set-section-flag .text=alloc,readonly,code vmlinux.elf
# 以后只是出于验证目的。
# 以schedule函数作为一个样本,检查在vmlinux.elf文件里是不是包括了正确的偏移。
grep --color "[tT] schedule$" System.map
readelf -s vmlinux.elf | grep " schedule$" --color
genlds.py内容如下:
|
以下是反汇编的出来部分结果:
|
转 http://blog.chinaunix.net/u1/42957/showart.php?id=1847675
转载于:https://www.cnblogs.com/papam/archive/2009/08/27/1555374.html
怎样反汇编bzImage相关推荐
- GPS 校验和 代码_Linux recovery 移除签名校验
原创作者:王锐,多年 Linux 系统.龙芯平台移植与优化研发经验,Linux Contributor.Mozillian. 背景 某个设备配套的刷机程序是个 Linux recovery kerne ...
- Linux内核文件vmlinux 和压缩后的bzImage文件格式分析
Linux内核文件vmlinux 和压缩后的bzImage文件格式分析 ================= 1. 需要使用的命令 ================ readelf -- 显示el ...
- arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc
arm-none-linux-gnueabi-gcc -v gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) 重点: 代码中的内存分配, 地址从低到高: ...
- 反汇编算法介绍和应用——递归下降算法分析
上一篇博文我介绍了Windbg使用的线性扫描(linear sweep)反汇编算法.本文我将介绍IDA使用的递归下降(recursive descent)反汇编算法.(转载请指明来源于breaksof ...
- 反汇编算法介绍和应用——线性扫描算法分析
做过逆向的朋友应该会很熟悉IDA和Windbg这类的软件.IDA的强项在于静态反汇编,Windbg的强项在于动态调试.往往将这两款软件结合使用会达到事半功倍的效果.可能经常玩这个的朋友会发现IDA反汇 ...
- 硬核!Python 四种变量的代码对象和反汇编分析
作者 | 大奎 整理 | 阳哥 来源丨Python数据之道 在Python基础的学习过程中,对变量和参数的理解有助于我们从更基础层面了解Python语言的运行.在这个过程中,还是有不少冷门和细节的地方 ...
- 反编译与反汇编、C++编译过程,包括预编译--汇编--编译--链接
参考:C/C++程序编译流程(预处理->编译->汇编->链接) - ProLyn - 博客园 反汇编和反编译的区别_代码小卒_新浪博客 反汇编与反编译: 汇编:是把汇编源程序转变为目 ...
- MAC下的反编译、反汇编和调试神器Hopper Disassembler
很久没去pediy了,偶尔去看下,还真有新东西 mac下的反汇编工具,貌似参考ida做的,看起来很不错 地址在这里 官网:http://www.hopperapp.com/ 传送门:http://pa ...
- C++反汇编-加法分析
为了分析的简便,代码采用以下方式风格: #include "iostream" void main() { int a,b; a=1; b=2; std::cout<< ...
最新文章
- 第三十六讲 ASP.NET中的Web服务(三)
- python处理pdf文件_好玩的Python 篇一:用Python显示和处理PDF文件
- 打造具备互补测试技能的团队
- web.config中httpRunTime的属性(转)
- mysql 大数据 join_MySQL JOIN算法原理
- 邓总的vim配置,需要的自己拿走~
- 李伟山:金融撮合架构
- 人少钱少需求多的新项目该怎么带?看到这篇我心里有底了!
- c++语言怎么实现字符串拼接,C++ string类和字符串的访问和拼接操作
- Angular 项目中使用 ECharts 图表示例
- 【渝粤题库】陕西师范大学290001 计算机网络
- 本科生毕业论文中期检查表
- Finalize、dispose、dispose(bool disposing)
- 做IT的与卖鞋买鞋的对比,欢乐一笑!
- 厉害了我的琴!钢琴教育竟然用上了AI+云计算?
- python:微信支付链接转化成图片(data格式、PNG格式)
- 华为服务器显示红色的心跳,服务器的心跳线
- TIA博途中如何设计报警功能块FB,来简化编写离散量报警程序的时间?
- supper 关键字
- 下一跳—数据包的下一跳目的地址
热门文章
- gonna,gotta,wanna的区别(参考牛津)
- 区块链应用(去中心化应用)是什么样的?
- CS5463 DP转HDMI8K30Hz转换芯片规格书|CS5466 typec转HDMI8K30Hz (4K144Hz)转换芯片规格书
- B 1056 组合数的和(找规律遍历)
- 苹果iPad怎么截图?图文教学,可快速学会
- Geoserver操作手册
- ac3168无线网卡驱动下载_星际蜗牛C款i211网卡服务器装Windows sevse2012R2服务器装机篇下...
- jCore中文本地化工作札记 - 2
- 数字图像处理——人脸识别
- python dataframe比较两列是否完全相同