开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 18806|回复: 87
收起左侧

[技术专题] 【技术专题】一、Hook专题 c)APIHook - 上

[复制链接]
结帖率:100% (1/1)
发表于 2012-7-16 21:16:43 | 显示全部楼层 |阅读模式   北京市北京市
分享视频教程
教程类型: 无声教程
教程讲师: 流年一逝
下载地址1: http://www.3600gz.cn
本帖最后由 |流年灬一逝| 于 2012-7-26 09:20 编辑

前言
第一章
第二章
第三章
第四章
第五章
第六章

既然来了,就坚持读下去吧,认真读下去,一定会有收获的!
**********************************************************************************************

三、APIHook -
在学习了前面的两章Hook,大家应该已经对Hook由一个大致的了解了。
本章中,我们来学习一下APIHook。我们本章中的内容是要实现拦截MessageBoxA函数的调用,使他无效。
本章内容相对来说比较简单,也是给以后更深入的API Hook打下基础。
简单的来说,Hook一般包含一下几方面:
找到Hook地址申请Hook代码储存空间变更原地址,跳转到Hook代码储存空间执行跳回原处执行相应代码
加红的这处,因为我们从原来的代码修改了jmp跳转,所以可能有一句或两句的代码无法执行,在我们Hook代码储存区里如果有需要的话,可以补充这两句代码。
那么APIHook也非常简单,它是针对程序调用API函数时候的一个Hook
这时,程序执行到IAT表所指向的映射到程序中的API函数,我们通过获取IAT指定函数的地址,对这个地址进行Hook,就可以达到对APIHook
本章,我们将介绍如何对本程序中的函数调用进行Hook
学习这一章前,我们先认识几个API函数。
GetModuleHandle          获取库句柄
参数
lpModuleName              库名称,如 kernel32.dll


GetProcAddress            获取库函数地址
参数
hModule                       库句柄
lpProcName                  库函数名称


VirtualProtect                修改虚拟保护
参数
lpAddress                     修改的虚拟保护区域首地址
dwSize                         修改的虚拟保护长度
flNewProtect                新的虚拟保护
lpflOldProtect               保存旧的虚拟保护


我们要知道,程序的任何地方都可以调用API函数,所以我们不能Hook程序的某个地方,我们要Hook API函数的某个地方。一般情况下,我们都选择Hook API首地址的前5个字节。

未命名.PNG
图中,蓝色的区域是程序的某个位置,通过跳转、Call等指令,执行到红色的地方(API函数)
我们可以用GetProcAddress函数来获取一个API函数的调用首地址。它的第一个参数需要一个库句柄,我们可以用GetModuleHandle函数来获取。
函数地址 = GetProcAddress GetModuleHandle(库函数名称),函数名称)
这样就可以获取一个库中函数的地址。
接下来我们对它进行Hook

未命名.PNG
(中间水印的地方是:函数地址 = API_GetProcAddress (模块句柄, “MessageBoxA”))

其中,{194,16,0}的汇编指令为 retn 0x10,也就是返回.当程序执行到这个信息框函数时,就返回。注:{160} 参数的个数*4 后得到的字型数据
但是实际过程中,我们点击Hook按钮,对MessageBoxA进行Hook的时候,易程序会崩溃,这是由于我们对本程序的访问权限不足而导致的。
因为我们此时修改的是映射在我们程序中的库函数,属于程序的一部分,它对我们具有只读保护,我们想要对这段代码内存修改,就需要修改它的保护。
这也是我们今天的一个重要的API函数:VirtualProtect
修改之后的代码:
未命名.PNG
我们在获取了函数地址之后,将我们要修改的前3个字节的保护设置为PAGE_EXECUTE_READWRITE,也就是可读可写,这样,再进行写入;写入完毕后,修改它的保护为之前的(旧保护)。
我们再来看看效果:
Hook之前的:

未命名.PNG
Hook之后:(无任何反应,说明我们的Hook成功了)
未命名.PNG


*****************************************************************************************
大家有什么疑问可以回帖提出来

代码:
code.rar (1.62 KB, 下载次数: 341)

评分

参与人数 3好评 +3 精币 +27 收起 理由
ノ朽默℡ + 1 + 20 精彩文章希望继续努力
V雪落有声V + 1 + 2 权限最高加这么多.
冰点 + 1 + 5 加油!!

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (18/18)
发表于 2012-7-16 21:22:38 | 显示全部楼层   广西壮族自治区百色市
先把沙发占了!!!再去看内容....
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 7 天

发表于 2012-7-16 22:15:44 | 显示全部楼层   湖南省娄底市
哈哈,换表情了。支持

点评

呵呵,新换的表情真不错。。   陕西省西安市  发表于 2012-7-16 22:23
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2012-7-16 22:42:10 | 显示全部楼层   内蒙古自治区鄂尔多斯市
{:soso__15238372557951284374_4:}前排支持了!
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)
发表于 2012-7-16 22:51:00 | 显示全部楼层   广东省茂名市
问个同课类的  的课外问题  怎么取其他进程的钩子句柄
回复 支持 反对

使用道具 举报

发表于 2012-7-16 23:22:36 | 显示全部楼层   四川省绵阳市
这个,不解释,必须来顶一下。!
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2012-7-16 23:29:53 | 显示全部楼层   陕西省西安市
qq2278322 发表于 2012-7-16 22:51
问个同课类的  的课外问题  怎么取其他进程的钩子句柄

钩子句柄是一个钩子的标志,它记录在内核中,应用层是无法获取的,如果朋友有驱动开发经验,可以参考一下其他的技术文章。
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)
发表于 2012-7-17 09:07:13 | 显示全部楼层   广东省茂名市
|流年灬一逝| 发表于 2012-7-16 23:29
钩子句柄是一个钩子的标志,它记录在内核中,应用层是无法获取的,如果朋友有驱动开发经验,可以参考一下 ...

那如果要卸载的其他进程的钩子  是全局的消息钩子是不是一定要内核 或者有其他方法 好像可以用freelibrary搞定
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2012-7-17 09:57:15 | 显示全部楼层   陕西省西安市
本帖最后由 |流年灬一逝| 于 2012-7-17 09:59 编辑
qq2278322 发表于 2012-7-17 09:07
那如果要卸载的其他进程的钩子  是全局的消息钩子是不是一定要内核 或者有其他方法 好像可以用freelibrar ...

freelibrary函数必须要DLL的所有线程结束后才可以成功,你需要枚举该DLL的所有线程,结束后,在设置这个钩子的进程中使用FreeLibrary函数。除非系统不再新创建此钩子的线程,否则此方法应无效。
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2012-7-17 10:07:28 | 显示全部楼层   河北省秦皇岛市
支持你的帖子

点评

嗯 谢谢LZ的知识   广东省佛山市  详情 回复 发表于 2013-8-2 13:30
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表