实例分析objdump反汇编用法
生活随笔
收集整理的這篇文章主要介紹了
实例分析objdump反汇编用法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版
-----------------------------------------------------------------------------------
objdump命令是用查看目標(biāo)文件或者可執(zhí)行的目標(biāo)文件的構(gòu)成的gcc工具。
1. 準(zhǔn)備代碼hello.c #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h>MODULE_LICENSE("GPL"); MODULE_AUTHOR("baoli"); MODULE_DESCRIPTION("hello world module");static int __init hello_init(void) {int * p = 0;printk(KERN_WARNING "hello world.\n");*p = 1;return 0; }static void __exit hello_exit(void) {printk(KERN_WARNING "hello exit!\n"); }module_init(hello_init); module_exit(hello_exit);
2. 編譯&安裝模塊 編譯成ko模塊后,執(zhí)行isnmod hello.ko,顯示killed安裝失敗。 用dmesg內(nèi)核日志,可以看到內(nèi)核跑出了Oops異常: 給出了原因:不能訪問NULL指針 錯(cuò)誤發(fā)生位置:hello_init+0x10,即hello_init偏移0x10處,可以反匯編查看此處對(duì)應(yīng)的具體指令。
3. 反匯編分析 執(zhí)行:objdump -d hello.o > assemble.txt 匯編代碼如下:
hello.o: file format elf64-x86-64Disassembly of section .init.text:0000000000000000 <init_module>: MODULE_LICENSE("GPL"); MODULE_AUTHOR("baoli"); MODULE_DESCRIPTION("hello world module");static int __init hello_init(void) {0: 55 push %rbp1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi8: 48 89 e5 mov %rsp,%rbpb: e8 00 00 00 00 callq 10 <init_module+0x10>10: c7 04 25 00 00 00 00 movl $0x1,0x017: 01 00 00 00 1b: 31 c0 xor %eax,%eax1d: 5d pop %rbp1e: c3 retq Disassembly of section .exit.text:0000000000000000 <cleanup_module>:0: 55 push %rbp1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi8: 48 89 e5 mov %rsp,%rbpb: e8 00 00 00 00 callq 10 <cleanup_module+0x10>10: 5d pop %rbp11: c3 retq
可以看到hello_init+0x10處對(duì)應(yīng)匯編指令為movl $0x1,0x0,即*p = 1; 通過objdump反匯編Oops可以輕松的知道錯(cuò)誤原因及位置。
4. objdump總結(jié) 1)objdump -d:反匯編目標(biāo)文件中包含的可執(zhí)行指令。 2)如果需要混合顯示源碼和匯編代碼,需要加上-S選項(xiàng),并且在編譯目標(biāo)文件時(shí)加上-g。 3)如果在編譯目標(biāo)文件時(shí)沒有加-g選項(xiàng),則-S相當(dāng)于-d。 4)-S選項(xiàng)生成的混合代碼,有時(shí)文件結(jié)構(gòu)混亂,可讀性較差。推薦使用-d選項(xiàng),直接閱讀匯編代碼。
objdump命令是用查看目標(biāo)文件或者可執(zhí)行的目標(biāo)文件的構(gòu)成的gcc工具。
1. 準(zhǔn)備代碼hello.c #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h>MODULE_LICENSE("GPL"); MODULE_AUTHOR("baoli"); MODULE_DESCRIPTION("hello world module");static int __init hello_init(void) {int * p = 0;printk(KERN_WARNING "hello world.\n");*p = 1;return 0; }static void __exit hello_exit(void) {printk(KERN_WARNING "hello exit!\n"); }module_init(hello_init); module_exit(hello_exit);
2. 編譯&安裝模塊 編譯成ko模塊后,執(zhí)行isnmod hello.ko,顯示killed安裝失敗。 用dmesg內(nèi)核日志,可以看到內(nèi)核跑出了Oops異常: 給出了原因:不能訪問NULL指針 錯(cuò)誤發(fā)生位置:hello_init+0x10,即hello_init偏移0x10處,可以反匯編查看此處對(duì)應(yīng)的具體指令。
3. 反匯編分析 執(zhí)行:objdump -d hello.o > assemble.txt 匯編代碼如下:
hello.o: file format elf64-x86-64Disassembly of section .init.text:0000000000000000 <init_module>: MODULE_LICENSE("GPL"); MODULE_AUTHOR("baoli"); MODULE_DESCRIPTION("hello world module");static int __init hello_init(void) {0: 55 push %rbp1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi8: 48 89 e5 mov %rsp,%rbpb: e8 00 00 00 00 callq 10 <init_module+0x10>10: c7 04 25 00 00 00 00 movl $0x1,0x017: 01 00 00 00 1b: 31 c0 xor %eax,%eax1d: 5d pop %rbp1e: c3 retq Disassembly of section .exit.text:0000000000000000 <cleanup_module>:0: 55 push %rbp1: 48 c7 c7 00 00 00 00 mov $0x0,%rdi8: 48 89 e5 mov %rsp,%rbpb: e8 00 00 00 00 callq 10 <cleanup_module+0x10>10: 5d pop %rbp11: c3 retq
可以看到hello_init+0x10處對(duì)應(yīng)匯編指令為movl $0x1,0x0,即*p = 1; 通過objdump反匯編Oops可以輕松的知道錯(cuò)誤原因及位置。
4. objdump總結(jié) 1)objdump -d:反匯編目標(biāo)文件中包含的可執(zhí)行指令。 2)如果需要混合顯示源碼和匯編代碼,需要加上-S選項(xiàng),并且在編譯目標(biāo)文件時(shí)加上-g。 3)如果在編譯目標(biāo)文件時(shí)沒有加-g選項(xiàng),則-S相當(dāng)于-d。 4)-S選項(xiàng)生成的混合代碼,有時(shí)文件結(jié)構(gòu)混亂,可讀性較差。推薦使用-d選項(xiàng),直接閱讀匯編代碼。
總結(jié)
以上是生活随笔為你收集整理的实例分析objdump反汇编用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 33.98万元起买吗?理想L7内部空间图
- 下一篇: 消息称英特尔将再发鸡血驱动,提升锐炫显卡