windows 32位以及64位的inline hook
Tips : 这篇文章的主题是x86及x64 windows系统下的inline hook实现部分。
32位inline hook
对于系统API的hook,windows 系统为了达成hotpatch的目的,每个API函数的最前5个字节均为:
8bff move edi,edi
55 push ebp
8bec mov ebp,esp
其中move edi,edi这条指令是为了专门用于hotpatch而插入的,微软通过将这条指令跳转到一个short jmp,然后一个long jmp可以跳转到任意4G范围内的代码(http://blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx),达到运行中替换dll的目的。
假设我们要求把0x12345678这个地址的函数hook,使其跳转到0x12345690,我们可以将这5个字节替换为:0xe9 (0x12345690-0x12345678-5) ,以达到跳转到0x12345690这个地址的目的(此处,注意大小端系统的区别),这条指令是相对跳转。
64位inline hook
64位系统没有了上面这样的方便之处,因此必须有一种新的策略。
64位的跳转,可用两种方法,下面两个方法都是绝对跳转指令,第一个影响rax寄存器,可能需要先保存原来的rax的值:
1,
48 b8 ef cd ab 89 67 45 23 01 mov rax, 0x0123456789abcdef
ff e0 jmp rax2,
0xff25 [0x00000000]
0xef cd ab 89 67 45 23 01
这里用第二种方法,将一个old_func_address的前x个字节修改为跳转到我们的new_func_address,步骤:
1,反汇编old_func_address处的指令,累加其长度,依次反汇编下去,直到长度大于12,例如为15;
2,复制这15个字节的指令,将old_func_address的前12个字节修改为:0xff25 0x00000000 new_func_address(8个字节);
3,跳转完成之后将其前15个字节还原。
这个方法要求函数长度大于15个字节,所以有一个方法用于适用于小于15字节长度的函数:
通过一个0xe9 tmp_address跳转到我们申请的空间(该空间地址与old_func_address的间隔在4G范围内,通过VirsualAlloc函数达成),在tmp_address处再long jmp(0xff25 …)。
这里贴一个得到指令长度的网址:http://bbs.pediy.com/showthread.php?t=147401,附件上传到网盘:http://pan.baidu.com/s/1o6yh1Rc
上述是我工作中用过的方法,可行。如有错误或建议,请留言,谢谢。
windows 32位以及64位的inline hook的更多相关文章
- 无光驱在32位windows系统下安装64位windows系统
位的系统. 大家都知道,32位的操作系统最多只能支持3.2G的内存,现在内存白菜价,很多人都在原有基础上购入新内存,这样最少也有4G了,为了让内存不浪费,我 们只有升级到64位操作系统.但是很多朋友又 ...
- zz Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位)
Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位) Posted on 2015年01月28日 by 虾虾 22 Comments 最新的Windows 10 MSD ...
- Windows系统32位、64位DLL文件的存放位置
查资料时无意中发现,Windows系统存放DLL的文件路径似乎有点蹊跷: 32位的DLL存放在C:\Windows\SysWOW64,而64位的DLL存放在C:\Windows\System32.即使 ...
- 【原创】在Windows系统中使用VC9、VC11编译32位、64位PHP及其扩展
项目中需要使用runkit模块实现AOP,但是团队成员的开发环境都是Windows,而runkit模块官方没有提供Windows环境下的dll扩展,只能自己编译. 下面是编译过程的分类总结.(操作系统 ...
- 【扫盲】】32位和64位Windows的区别
用户购买windows安装盘或者重新安装操作系统的时候,通常会遇到这个问题,就是不知道该如何选择使用32位操作系统和64位操作系统,有人说64位系统速度快,其实理论上确实是这样,不过具体还要根据你的个 ...
- 如何判断你的windows系统是32位还是64位?
[学习笔记] 如 何判断你的windows系统是32位还是64位? java -version时,如果没有64就是32位的.eclipse.ini中如果没有64,就是32位的.但是我们的ini文件里面 ...
- 64位主机64位oracle下装32位客户端ODAC(NFPACS版)
64位主机64位oracle下装32位客户端ODAC(NFPACS版) by dd 1.下载Oracle Data Access Components(ODAC) Xcopy的两个版本: x86:(我 ...
- 【转】Tomcat版本是32位、64位问题
转载地址:http://www.cnblogs.com/greensleeves/p/3168541.html 最近遇到一个Tomcat windows安装版本是32位还是64位问题.由于一系列原因, ...
- Windows2003 IIS6.0支持32位和64位两种模式的设置方法
IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...
- 如何在64位windows7上同时使用32位和64位的Eclipse
我用的是64位的windows7旗舰版,jdk1.7 64位机器上可以同时运行32位和64位的Eclipse,但是电脑中必须有相应的jdk.Eclipse虽然不需要安装,但是在启动时会检查系统中固定文 ...
随机推荐
- 利用saltstack的event实现自己的功能
saltstack的master上minion连接较多,下面这个程序可以分析哪些minion任务执行成功,哪些执行失败以及哪些没有返回. 脚本说明: 一.最先打印出本次任务的job id.comman ...
- shell脚本之检查局域网中在线的ip地址
[root@docker-node1 ]# cat ping.sh #!/bin/bash . /etc/init.d/functions for var in {1..254}; do ip=192 ...
- CentOS7下nrpe3.0安装(转)
本人菜鸟一枚,在学习nagios的时候碰到了很多问题,在网上找了很多相关的教程,都是老版本的,怎么装都不对,强迫症的我非要按装新版本,老版本的教程怎么搞都不行,只能自己研究了. 首先,下载nrpe3. ...
- asp.net购物车,订单以及模拟支付宝支付(一)---购物车表及添加购物车流程
在开发一个Web程序的时候用到了网购这个功能,上来分享并记录一下,以便以后忘记了可以自己看看(电脑东西太多,笔记都不知道放哪里去了啊啊啊啊啊!!!) 没有什么高并发量,什么什么技术理论,只是一个最最基 ...
- cakephp事务处理
使用cakephp框架做开发时,涉及到多个数据表的数据保存,需要使用cakephp的事务处理,查cakephp的说明手册也没看明白,从开发社区中看到了解决的办法,考虑到英文的问题,所以转给大家,以供参 ...
- 使用pip安装tensorflow 0.80,python 使用tensorflow 0.80遇到的问题及处理方法
http://blog.csdn.net/levy_cui/article/details/51251095 1.python 版本切换到2.7 推荐使用pythonbrew,http://blog. ...
- Vue creatElement
1.传统template写法 <!DOCTYPE html> <html lang="zh"> <head> <meta charset= ...
- Android重写ViewPager改动滑动灵敏度
使用ViewPager作为一个页面进行切换.里面能够存放非常多View,但有时在操作View时不小心滑动一下就有可能跳到下一页,这并非我们想要的,这里就须要重写ViewPager改动它的滑动条 ...
- Openerp图片路径处理
Openerp目前存储图片如人力资源头像图片等都是以二进制的方式存储在数据库中,若要修改数据库里只存储路径可以用这种方法 Image 装饰器: Image装饰器包含3中图片显示 Image 大图片 i ...
- POI动态生成word2007加强版
先看效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjAzODkxNzU=/font/5a6L5L2T/fontsize/400/fill ...