免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1363 | 回复: 8
打印 上一主题 下一主题

hook [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-27 17:31 |只看该作者 |倒序浏览
本帖最后由 1ming0 于 2011-12-29 18:59 编辑

hook

论坛徽章:
0
2 [报告]
发表于 2011-12-28 20:20 |只看该作者
解释我想hook掉usb_match_id换成new_usb_match_id(自己的函数)

然后返回 现在把usb_match_id前五个字节改成jmp (unsigned int)new_usb_match_id了

关键是new怎么返回 继续下走啊??

论坛徽章:
0
3 [报告]
发表于 2011-12-29 01:42 |只看该作者
本帖最后由 vupiggy 于 2011-12-28 21:50 编辑

你有两种选择:
1. 真正称为 inline hook 的方法,就是找到: call usb_match_id 这条指令,objdump 内核的映像,这段应该长得像这样:e8 XX XX XX XX,这里的 XX XX XX XX 如果用一个 unsigned int * 指向它,得到的值应该是 usb_match_id() 函数相对这条指令的下一条指令的偏移,你要做的是就是:1) 算出你的 new_usb_match_id() 函数相对偏移 YY YY YY YY,2) 用这个 32 位的偏移值替换那条 e8 指令的操作数,使之成为 e8 YY YY YY YY,从此每次都调用你的函数袅,3) 在你的 new_usb_match_id() 中别忘了调用原始的 usb_match_id(),4) 从 new_usb_match_id 返回,自然会回到 usb_device_match 中正确的位置去,好像什么没有发生一样。

2. 插入 jmp 这个方法也可行,但是复杂一些,很容易死,能不用就不用,大意是自己写一段要 jmp 过去的汇编代码,头部留一些空间,把 usb_device_match() 函数合理的几个字节拷贝过去,再根据实际情况保存几个寄存器的值,在这段汇编中调用你的 new_usb_match_id,最后再用一个jmp 回到 usb_device_match 合理的位置,整个过程挺绕的,实在需要再跟你解释,就先试方法1吧,95% 的情况可以解决问题。

评分

参与人数 1可用积分 +4 收起 理由
瀚海书香 + 4 多谢分享!

查看全部评分

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2011-12-29 08:11 |只看该作者
回复 3# vupiggy
多谢分享!

论坛徽章:
0
5 [报告]
发表于 2011-12-29 08:42 |只看该作者
我用第二种方式就是为了不用找usb_match_id的父函数(因为他的父函数没有导出 还得查找) 呵呵,现在为了赶进度,只能先用第一种了

谢谢  vupiggy

论坛徽章:
0
6 [报告]
发表于 2011-12-29 08:44 |只看该作者
回复 3# vupiggy


    谢谢

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
7 [报告]
发表于 2011-12-29 08:49 |只看该作者
jprobe拦下usb_match_id,然后把参数换掉。

论坛徽章:
0
8 [报告]
发表于 2011-12-29 10:02 |只看该作者
本帖最后由 vupiggy 于 2011-12-29 03:40 编辑
1ming0 发表于 2011-12-29 01:42
我用第二种方式就是为了不用找usb_match_id的父函数(因为他的父函数没有导出 还得查找) 呵呵,现在为了赶 ...

好吧,给个大概思路,现在没空写代码

  1.   380430:       55                      push   %rbp
  2.   380431:       48 89 e5              mov    %rsp,%rbp
  3.   380434:       41 56                   push   %r14
  4.   380436:       41 55                   push   %r13
  5.   380438:       41 54                   push   %r12
  6.   38043a:       53                      push   %rbx
复制代码
观察objdump出来的2.6.18 x86_64内核usb_match_id函数的开始部分,这一段因内核,编译器而异,要写好一个hook要能够正确解码,另外写一段汇编:

  1. ENTRY(my_usb_match_id)
  2. nop; nop; nop; nop; nop; nop; nop; nop;
  3. nop; nop; nop; nop; nop; nop; nop; nop;
  4. nop; nop; nop; nop; nop; nop; nop; nop;
  5. nop; nop; nop; nop; nop; nop; nop; nop;
  6. push %rdi
  7. push %rsi
  8. call new_usb_match_id
  9. pop %rsi
  10. pop %rdi
  11. jmp *back_point
  12. 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 语句插入.

大抵如此,多试试看就能成功

论坛徽章:
0
9 [报告]
发表于 2011-12-29 16:04 |只看该作者
本帖最后由 1ming0 于 2011-12-29 16:05 编辑

多谢指点  
我刚试了一下 jmp其实可以自动返回的
new_usb_match_id执行完会返回到usb_match_id函数的返回地址的(返回地址之前已经进栈了)

但是jmp的hook有个不好  如果函数多个地方被用就不太好控制, 还是找父函数call更精确。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP