逆向实用干货分享,Hook技术第一讲,之Hook Windows API
逆向实用干货分享,Hook技术第一讲,之Hook Windows API
作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)
一丶什么是Hook,以及Hook能干啥
首先这一个小标题主要介绍神马是Hook,如果知道的,则不用看了.
这里我偷袭啊懒,贴出Hook的意思 https://baike.baidu.com/item/%E9%92%A9%E5%AD%90%E7%A8%8B%E5%BA%8F
Hook,英文单词中成为钩子,铁钩的意思,在我们编程中就是挂钩的意思
我们要HookApi,则是要把这个API进行挂钩,让其执行我们的代码,然后执行完我们的代码之后,在执行API的代码,当然执行不执行使我们说了算.
二丶Hook API的原理,以及思路
现在我们要知道我们要怎么Hook API
假设我们程序现在要调用一个MessageBox函数,那么我们把这个API Hook了,变为我们的API去执行,执行完我们的代码之后再去执行它的的函数.
具体看下我们的草图:
其实相当于就是我们在这个API之前,跳转到我们的函数执行了,然后跳转之后,我们执行完毕之后,可以选择是否在跳转回去,但是这里注意,跳转回去则跳转到msg的return处位置即可.
eax可以给一个值,让它返回.
利用这个技术,我们可以监控API,比如应用程序会调用loadLibrary,那我们把它Hook了,把Dll路径改成我们的,那加载的就是我们的dll了,当然 Hook的API很多,因为只要是Windows的API都能HOOK
因为JMP的时候占五个字节,而WindowsAPI也是头部弄了五个字节,猜想可能是Windows自己留作Hook的.
三丶Hook的步骤(Hook自己)
首先说下步骤
/*
思路:
我们要获取MessageBoxA的函数地址,在获取之前我们要进行下面几个步骤
1.调用GetModuleHandlle,获取Dll模块(user32.dll的)的基地址
2.通过基地址,调用GetProcAddress获得Msg的函数地址
3.修改Msg函数地址的保护属性,调用virtualProtect
4.重定位跳转地址 Dest - MsgCode = offset -5
jmp 跳转到这个偏移即可
5.跳转回来的时候则是 dest + offset + 5 = Msgcode +5的位置 */
看上面,很晕,一步一步代码实现.
注意: 这里只是简单实现,并且说下思路,代码复制过去你不能运行,因为比如下方,我写 offset g_szUser32...等等的,
其实都是在.const中定义的,最下面会贴出完整代码,那么是可以运行的.
第一步,获得Msg的地址,首先调用GetModuleHandle
;1.获得Msg的地址,先调用GetmoudulHandle
invoke GetModuleHandle,offset g_szUser32 ;获得模块地址
mov @hUserHand,eax ;返回值给局部变量保存
;其中g_szUser32在常量区是 user32.dll的字符串
第二步:通过模块地址,获得Msg函数的地址
invoke GetProcAddress,@hUserHand,offset g_szMsgName
mov @MsgProcAddrs,eax
;代码同上
第三步:修改Msg函数地址的内存保护属性,方便一会我们把JMP的二进制写进去好修改
invoke VirtualProtect,@MsgProcAddrs,1000h,PAGE_EXECUTE_READWRITE,addr @hOldProtect
修改大小是1000(4096)个字节
权限是 可读可写可执行
是否保存旧的权限属性: 是 ,这里必须保存,虽然你不用,否则API会失败
还有就是,因为要保存以前的,所以我们必须把地址给他,要加上Addr才可以
第四步: OD查看Msg位置,寻找5个字节位置
这个时候我们可以在我们的代码中写个int 3,打开的时候OD会断下,我们在GetprocAddress的位置下断点,
看下获取到的Msg的地址是多少
我们在反汇编窗口中跟随到Msg的位置.
可以看到上图的位置,刚好五个字节, mov edi,edi是没用的指令,但是windows还是保留了
也就是说可能就是以为了自己去监控API留下的.那么这个时候我们可以在这个位置,写入
JMP的指令 JMP 我们的API位置
我们如果跳转到我们API的位置后,执行的代码前边这三条还是这个,因为一会我们还要在跳转到当前的MSG + 5
的位置处继续执行,(当然,随你便,你也可以跳转到Msg的Return位置)
第五步: 写入Jmp,JMP到我们的函数的位置
首先我们知道 JMP的二进制是 E9
所以我们要 E9 xxxxxx xxx使我们函数的地址
但是JMP 的时候,这个地方是个偏移
那么我们要JMP到我们函数的偏移位置,就要进行地址重定位了.
怎么重定位,很简单,小学数学
计算Msg的下一条执行的位置
code + offset = dest 当前的Msg的下条位置计算 带入则是 7595FDAE + 5 = 7595FDB3 也正好是我们跳转回来的位置
计算跳转到我们函数地址
dest - code = offset 目标地址我们知道,就是我们的函数地址,开始跳转的地址也知道了,所以带入带
我们的函数地址 - Code(当前的Msg地址) = offset 偏移,那么 JMP 这个偏移即可.
定义我们的函数
函数写成下面的那样
最下面的label中的内容则是 JMP 00000000 其中这个地址是我们要重定位写进去的
第六步:实现代码,写入JMP
从这里开始我直接写实现代码了
mov eax,@MsgProcAddrs ;code
mov ebx,NewMsgBox ;dest
sub ebx,eax ;dest - code = offset
sub ebx, ;得出的偏移需要-5,别忘了jmp占五个字节,这样才可以跳转到你的地址执行
mov [eax],byte ptr 0e9h ;写入Jmp
mov [eax +],ebx ;写入跳转的地址
首先获得msg的位置,也就是Code
然后获得 自己函数的位置,也就是Dest
现在我们要求出中间的偏移是多少 dest - code = offset
然后因为JMP跳转要占五个字节,所以接着-5个字节大小
现在我们要把Msg函数的位置,改为JMP,我们要JMP我们的地址,我们看下OD分析
1.首先找到Msg函数位置,看下数据窗口中跟随
2.单步走,然后执行到第一个把二进制改为E9H的地址
现在我们接着反汇编窗口中去看看Msg的地址,看下是否改为了JMP了
现在是改为了JMP,但是偏移是不对了,不过我们的偏移已经计算出了了,所以写到E9后面即可
3.修改偏移OD查看.
,反汇编窗口中看下Msg
,现在显示不知是否正确,那么我们现在去反汇编窗口中看下00401000是不是我们的NewMsg位置
可以看出,代码正是我们写的.
也正好是JMP 000000000的位置,那么我们就可以在我们的代码中写了,劫持真正的MsgBox函数的执行
我们知道, 因为是jmp过来的,所以ebp - c 还是Msg的第二个参数,我们把里面的内容改了
注意,这个在劫持代码里面写.
四丶我们还有修改跳转回来的位置,这个是同理了
看下代码:
invoke VirtualProtect,label1,1000h,PAGE_EXECUTE_READWRITE,addr @hOldProtect
mov eax,offset label1 ;code 我们要修改的地址是标号的地址,所以他是code
mov ebx,@MsgProcAddrs ;dest 我们要跳转到Msg的地址,所以他是Dest
sub ebx,eax ;dest - code = offset 带入公式咋得到ebx是偏移
mov [eax +],ebx ;eax标号的位置+1后面,也就是JMP 00 00 00 00 把00 00 00 00 写成偏移,咋跳转回来Msg的位置继续执行
invoke MessageBoxA,NULL,offset g_szMsgTitle,NULL,MB_OK
第一,我们要修改的跳转位置是标号1的位置,所以他是code
第二,我们要跳转到哪里,所以他是dest
第三,根据公式, dest - code = offset 求得了偏移
第四,我们把dset +1的位置,也就是JMP 00 00 00 00 修改位了偏移,咋又跳转回来了.
看下OD分析
看下OD,我们也可以看出,我们单步走,单步走到 mov dword ptr[eax +0x1]的位置,看下是否把标号1的偏移修改了
在内存中我们已经看到了,我们的偏移修改了.
那么我们反汇编窗口看下,当前我们的API ,也就是JMP 00 00 00 00 的位置是否修改了
可以看出,确实修改了,那么我们看下JMP 后面的地址是哪里把
正好使我们调用MsgBox的位置 +5的下面,也就是说,上面JMP到我们的API执行了,下面咋通过JMP有跳转回来了,此时因为我们已经保存了 栈底环境,所以运行是没有出错的
看下不调试,正常运行
通过HOOK技术,我们把本来应该输出 Hello 看雪,变成了我们自己想要的字符串.
四丶总结
总结来说. HOOK 需要记住一个公式以及硬编码即可. 公式 目的地址 - 源地址 -指令长度(如果是JMP则是5)
JMP 硬编码是E9 E9 00000000 后边四个0我们定位到我们要执行代码的位置. 用公式计算机课. 目的 - 源 - JMP(5) == 偏移. 偏移写入这里即可.
HOOK 别人程序也是这样去做.
因为代码是RadAsm工程的,所以这里打包发到百度云盘
链接:http://pan.baidu.com/s/1kVBWalp 密码:luz8
作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)
如果觉着好,请推荐,加关注,如果觉着哪里写的不好,请批评改正.谢谢大家.如果看不懂,请评论一下给点动力,其实写博客最主要的还是自己整理,每天都坚持.把最好的献给大家.
逆向实用干货分享,Hook技术第一讲,之Hook Windows API的更多相关文章
- 逆向实用干货分享,Hook技术第二讲,之虚表HOOK
逆向实用干货分享,Hook技术第二讲,之虚表HOOK 正好昨天讲到认识C++中虚表指针,以及虚表位置在反汇编中的表达方式,这里就说一下我们的新技术,虚表HOOK 昨天的博客链接: http://www ...
- PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式
目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...
- API HOOK技术
API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...
- HOOK技术的一些简单总结
好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术. 在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常 ...
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...
- 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...
- 逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复
逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复 首先我们要知道这个OD的Bug是什么. 我们调试一个UNICODE的窗口,看下其窗口过程. 一丶查看OllyDbg 的Bug 1.1spy++ ...
- 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...
- 逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构
逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打 ...
随机推荐
- Redis使用记录-相关资料汇总
1 redis在centos上的安装 http://www.cnblogs.com/hanyinglong/p/5036558.html 2 redis在windows上的可视化GUI工具 https ...
- python的multiprocessing模块进程创建、资源回收-Process,Pool
python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork( ...
- 我的前端故事----关于redux的一些思考
背景 我一个前端,今年第一份工作就是接手一个 APP 的开发...一个线下 BD 人员用的推广 APP,为了让我这个一天原生开发都没有学过的人能快速开发上线,于是乎就选择了 react-native ...
- NSA武器库知识整理
美国国家安全局(NSA)旗下的"方程式黑客组织"(shadow brokers)使用的部分网络武器被公开,其中包括可以远程攻破全球约70%Windows机器的漏洞利用工具. 其中, ...
- maven 添加memcached.jar配置方法
针对Java项目添加 memcahced 在mvnrepository 找了半天也没找到memcached.jar的配置xml, 由于目前Javamemcached client没有官方的maven ...
- Net分布式系统之七:日志采集系统(1)
日志对大型应用系统或者平台尤其重要,系统日志采集.分析是系统运维.维护及用户分析的基础. 一.系统日志分类 一般系统日志可分为三大类: 1.用户行为日志:通过采集系统用户使用系统过程中,一系列的操作日 ...
- 深入理解line-height
什么是行间距? 古时候我们使用印刷机来出来文字.印刷出来的每个字,都位于独立的一个块中. 行间距,即传说中控制两行文字垂直距离的东东.在CSS中,line-height被用来控制行与行之间垂直距离. ...
- None是什么?
None是什么,是空,就是空即是色,色即是空.是一个真的很特别的值,下面比较了下 0,True,False (python 的比較) >>> None == 0False>&g ...
- poj 1149经典网络流构图
题意:m个猪圈,n个客户,每个客户给出选则猪圈的钥匙和需要购买猪的个数,其中每次客户购买时客户选则的猪圈数量可以相互更换,问最大购买数量. 思路:以客户作为除源点汇点之外的点,然后对于每个猪圈从源点连 ...
- mysql初学,mysql修改,mysql查找,mysql删除,mysql基本命令
Mysql 下载地址https://dev.mysql.com/downloads/mysql/ 1.连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYS ...