- 论坛徽章:
- 0
|
本帖最后由 vupiggy 于 2011-12-29 03:40 编辑
1ming0 发表于 2011-12-29 01:42 ![]()
我用第二种方式就是为了不用找usb_match_id的父函数(因为他的父函数没有导出 还得查找) 呵呵,现在为了赶 ...
好吧,给个大概思路,现在没空写代码
- 380430: 55 push %rbp
- 380431: 48 89 e5 mov %rsp,%rbp
- 380434: 41 56 push %r14
- 380436: 41 55 push %r13
- 380438: 41 54 push %r12
- 38043a: 53 push %rbx
复制代码 观察objdump出来的2.6.18 x86_64内核usb_match_id函数的开始部分,这一段因内核,编译器而异,要写好一个hook要能够正确解码,另外写一段汇编:
- ENTRY(my_usb_match_id)
- nop; nop; nop; nop; nop; nop; nop; nop;
- nop; nop; nop; nop; nop; nop; nop; nop;
- nop; nop; nop; nop; nop; nop; nop; nop;
- nop; nop; nop; nop; nop; nop; nop; nop;
- push %rdi
- push %rsi
- call new_usb_match_id
- pop %rsi
- pop %rdi
- jmp *back_point
- END(my_usb_match_id)
复制代码 把上面列出来的 55 48 89 e5 ... 53 共11个字节拷贝到上面这段代码的地址 (i.e, 覆盖掉 11 个 nop -- 0x90), 然后把 push %rdi push %rsi ... jmp *back_point 那些代码 (不出意外,有16个字节) 拷贝到 my_usb_match_id 的第12字节处.
back_point, 应该是 usb_match_id + 12. 到此, 准备工作完成,把 你的 jmp my_usb_match_id 用一条 xchg 语句插入.
大抵如此,多试试看就能成功 |
|