- 論壇徽章:
- 0
|
本帖最后由 txawplh 于 2014-01-21 13:52 編輯
發(fā)現(xiàn)問題不大好描述,直接上代碼吧- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/list.h>
- #include <linux/cpumask.h>
- void func(char *str)
- {
- printk("func: %s", str);
- }
- int caller(void)
- {
- int i = 0;
- func("AAAA\n");
- return 0;
- }
- static int __init mod_init(void)
- {
- unsigned char* p = caller; //獲取函數(shù)caller的地址
- int i = 0;
- printk("caller addr: 0x%x\n", p);
- for(;i<80;i++)
- {
- printk("%02x", p[i]); //打印出caller的opcode
- }
- return 0;
- }
- static void __exit mod_exit(void)
- {
- printk(KERN_ALERT"[rmmod mymod] name:%s state:%d\n", THIS_MODULE->name, THIS_MODULE->state);
- }
- module_init(mod_init);
- module_exit(mod_exit);
復(fù)制代碼 內(nèi)核模塊編譯完成之后,用objdump看一下,發(fā)現(xiàn)函數(shù)caller有兩個call指令:
- 0000000000000020 <caller>:
- 20: 55 push %rbp
- 21: 48 89 e5 mov %rsp,%rbp
- 24: e8 00 00 00 00 callq 29 <caller+0x9>
- 29: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
- 30: e8 00 00 00 00 callq 35 <caller+0x15>
- 35: 31 c0 xor %eax,%eax
- 37: 5d pop %rbp
- 38: c3 retq
復(fù)制代碼 來看一下模塊加載后的情況:- [12663.567517] caller addr: 0xa0567020
- [12663.567526] 554889e5666666669048c7c72d8056a0e8cbffffff31c05dc3000000558b15bd1f000048c7c6189056a048c7c7508056a031c04889e5e83d230ee15dc300000000000000000000000000000000000000
復(fù)制代碼 利用hexedit和ndisasm反匯編一下:
- Aspire-4752:~$ ndisasm -b 64 a.bin
- 00000000 55 push rbp
- 00000001 4889E5 mov rbp,rsp
- 00000004 [color=Red]6666666690 xchg ax,ax[/color] //這里原來是第一個call指令
- 00000009 48C7C72D8056A0 mov rdi,0xa056802d
- 00000010 E8CBFFFFFF call dword 0xffffffffffffffe0 //這里調(diào)用func函數(shù)
- 00000015 31C0 xor eax,eax
- 00000017 5D pop rbp
- 00000018 C3 ret
- 00000019 0000 add [rax],al
復(fù)制代碼 請問有沒有人知道為什么編譯后會有兩個call指令,而在模塊加載后第一個被修改為(xchg ax,ax),謝謝 |
|