TC官方合作论坛

 找回密码
 立即注册
查看: 1789|回复: 3

[学习心得] 【类人猿TC内存探讨】 第十节: HOOK技术

[复制链接]
发表于 2017-8-20 17:00:26 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 类人猿 于 2017-8-28 14:20 编辑

<<<<<<<<技术探讨,欢迎大神指导!<<<<技术Q:578052137 技术群:128262077

HOOK是以后我们写辅助必须用到的一个技术,TC里面有了回调函数指针的支持更加方便我们运用HOOK。HOOK这个概念其实很多人是比较模糊的。下面通过不同的分类让大家了解。

1、HOOK权限分类:
对于 Hook 技术,可以分为两块:1.
1.第一块是在 Ring3 层的 Hook,俗称应用层 Hook 技术
2.另外一块自然是在 Ring0 层得 Hook,俗称为内核层 Hook 技术。(这里暂时不讨论驱动层的)

2、应用层 Hook 技术分类:

Ring3 层的 Hook 基本上可以分为两种大的类型,

第一类即是 Windows 消息的 Hook,

第二类则是 Windows API 的 Hook。


第一类消息 Hook 按照范围分类

  (1)消息HOOK:


消息 Hook,消息 Hook 是通过 SetWindowsHookEx 可以实现将自己的钩子插入到钩子链的最前端,

而对于发送给被 Hook 的窗口(也有可能是所有的窗口,即全局 Hook)的消息都会被我们的钩子处理函数所捕获到,

也就是我们可以优先于窗体先捕获到这些消息,Windows 消息 Hook 可以实现为进程内消息 Hook 和全局消息 Hook,

对于进程内消息 Hook,则可以简单的将 Hook 处理函数直接写在这个进程内,即是自己 Hook 自己。

下面是官方的例子:

  1. 变量 h
  2. 功能 hookProc(code,w,l)
  3.     如果(w == 256)//w参数 表示是 键盘按下或者弹起
  4.         调试输出("键码:"&地址取值(l,"long"))
  5.     结束
  6.     返回 动态库调用("user32.dll","long","CallNextHookEx","long",hook,"long",code,"long",w,"long",l)//当code小于0的时候一定要把消息传递给他一个子程
  7. 结束

  8. 变量 hook
  9. 功能 设置钩子_点击()
  10.     //这里添加你要执行的代码
  11.     变量 hmod = 动态库调用("kernel32.dll","long","GetModuleHandleA","long",0)
  12.     h = 回调函数申请("hookProc","hookproc")
  13.     hook = 动态库调用("user32.dll","long","SetWindowsHookExA","long",13,"callback",h,"long",hmod,"long",0)//执行setwindowhook函数 挂起全局钩子,13全局钩子
  14.     调试输出(获取错误信息(1))//这里获取dllcall执行后是否有错误信息
  15.     调试输出(hook)//输出钩子是否设置成功
  16. 结束

  17. 功能 卸载钩子_点击()
  18.     //这里添加你要执行的代码
  19.     变量 ret = 动态库调用("user32.dll","long","UnhookWindowsHookExA","long",hook)//删除钩子句柄 当hook不需要的时候记得一定要删除
  20.     回调函数释放(h)//删除钩子句柄之后 不要忘了 释放我们的回调函数,否则TC对应的函数里面一直会输出信息
  21. 结束

复制代码

(2)全局消息HOOK:


需要将 Hook 处理函数写在一个 DLL 中,这样才可以让你的处理函数被所有的进程所加载(进程自动加载包含 Hook 消息处理函数的 DLL)。

对于 Windows 消息 Hook 呢,可以有个简单的邪恶应用,就是记录键盘按键消息,

从而达到监视用户输入的键值信息的目的,这样,对于一些简单的用户通过键盘输入的密码就可以被 Hook 获取到,

因为没当用户按下一个键时,Windows 都会产生一个按键消息(当然有按下,弹起等消息的区分),

然后我们可以 Hook 到这个按键消息,这样就可以在 Hook 的消息处理函数中获取到用户按下的是什么键了。


第二类则是 Windows API 的 Hook

   那么到底什么是HOOK API呢?我们可以暂且简单的认为HOOK API就是一种改变原始API功能的方法。最简单的例子莫过于MessageBox(其实是MessageBoxA或MessageBoxW),我们可以通过HOOK这个API改变其功能,比如换个标题。目的很明确,就是改变原始API的行为,但是方法有多种。再继续讨论之前我们先要搞清楚一个问题,HOOK API是HOOK谁的API调用?当然你可以自己写一个程序,然后在这个程序里HOOK所有本程序MessageBoxA/W的调用,但是更多的用途是HOOK其他进程的。比如你可以HOOK一个进程的winsock函数从而监视其网络行为。   API hook简单举个例子:就是在函数开头5个字节改成jmp xxxx,当然hook的方法很多。




<<<<<<<<<<<<  期待大牛的加入,技术唯一Q号:578052137  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<









回复

使用道具 举报

发表于 2017-8-21 10:24:12 | 显示全部楼层
支持支持
回复

使用道具 举报

发表于 2017-8-22 09:49:33 | 显示全部楼层
顶一顶
回复

使用道具 举报

发表于 2017-8-22 14:44:27 来自手机 | 显示全部楼层
赞。Ring3 层的 Hook 可以分为两种大的类型,
第一类即是 Windows 消息的 Hook,
第二类则是 Windows API 的 Hook。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-21 15:42 , Processed in 0.032874 second(s), 22 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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