易语言吧 关注:266,545贴子:1,664,584
  • 5回复贴,共1

【科普向】Hook技术的简单介绍

取消只看楼主收藏回复


Hook拦截成果镇楼
1、这只是科普向,会介绍相关Hook技术及原理,但是不会给源码源码请自行百度
2、请至少有一点Windows编程经验,知道系统API是什么...以免看科普内容给您带来不适
3、如果有说错的地方请务必说出来,我会直接删楼编辑...
4、发完前不要插楼,我会删的← ←I


IP属地:浙江本楼含有高级字体1楼2013-10-08 22:11回复
    最近正好在看这个,感觉无聊就整理下讲解下Hook玩玩好了。只是单纯的讲解让人了解什么是Hook,不提供源码。有兴趣的自己百度← ←
    首先要说下CPU权限...Intel把自家CPU指令分为四个等级,Ring0,Ring1,Ring2,Ring3,Windows操作系统只用了Ring0和Ring3两个权限。简称R0和R3好了-。-
    R0权限只能让系统用,比较危险。R3权限为应用层用。大部分非驱动程序都是R3应用层的...
    Hook也分为R0和R3两个层次。
    R3应用层Hook又分为两种,一种是 API Hook,一种是系统钩子。
    R0内核层Hook我只介绍一种,SSDT HookI


    IP属地:浙江2楼2013-10-08 22:12
    收起回复
      系统钩子:
      系统钩子实质上是系统提供的一个API函数,叫做 SetWindowsHookEx(),可以拦截指定的13种消息类型
      全局钩子包含这样13种消息类型:具体参考百度百科:http://baike.baidu.com/link?url=5-gmumJKhgDSvAZiYb018vhbevJ-kcfzkHxRPG2k8dClvJaFy473iL0FiixCA0waNeD16sosZQlWoMp9irvYoq
      这个是系统提供的功能,百度百科也有详细的原理介绍。我也不太熟就不多说了...实在是用的太少
      系统钩子应用:键盘鼠标监控/禁用等等I


      IP属地:浙江3楼2013-10-08 22:14
      收起回复
        API Hook:
        API Hook可以说是很简单很暴力的Hook方法。
        要知道,程序调用一个API实质上调用的是那个API函数的入口地址。
        也就是说,只要把API函数入口地址修改成我们自己的子程序的入口地址,那么程序就会调用API的时候调用到我们自己的子程序,从而实现Hook的效果
        那么我们应该是这样做的:
        寻找需要Hook的函数地址-修改地址改成自己的子程序地址-还原为原来的函数地址
        举个例子,比如MessageBoxA()函数,它的地址是12345
        我写了个子程序叫做MyMessageBoxA(),它的地址是56789
        我们只要将MessageboxA()在内存里把存放函数地址的12345改成56789,
        那么别人调用MessageBoxA()的时候就会调用到地址56789,也就是我们自己写的MyMessageBoxA()
        至于我们是在自己的MyMessageBoxA()里怎么操作就随意了
        是放行(Call调用原地址)
        还是拦截(直接无视调用请求)
        还是修改(修改参数后Call调用原地址)都可以
        然而这时候我们会面临一个无法避免的问题:我们自己写的子程序在自己的进程空间内,和目标进程完全不在一起。事实上windows似乎无法跨进程访问
        那么我们只能让子程序和目标进程在同一个进程空间内运行...这个就需要另外一项技术:dll注入
        所以我们通常能看到封包助手,软件多开器之类的都会有个DLL...就是为了注入后Hook用的...
        简单的说下API Hook的应用
        封包拦截。hook send函数,这样发送封包(调用send函数)之前会先调用自己的函数,就可以获取甚至修改封包内容了
        软件多开。已知道软件可以通过创建互斥体(一个api函数)来限制多开...也就是说我们只要Hook掉那个api...然后← ←你懂的
        I


        IP属地:浙江4楼2013-10-08 22:18
        收起回复
          SSDT Hook:
          所谓R0级的Root,其实还有种称呼:内核钩子
          是杀毒软件广泛采用的一项技术(SSDT Hook已经落后了...很多杀毒软件都能在SSDT之前就Hook到...我就不吐槽我SSDT都要靠百度改源码什么的了)
          这里要介绍下SSDT。
          SSDT(System Services Descriptor Table),系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
          知道这句话里包含着什么?我们从R3层调用的API函数实质上要通过查询SSDT获取R0层的真正地址...
          这意味着如果我们可以把SSDT里的地址修改掉,就可以实现全局API Hook的效果。
          不过权限问题← ←R3无驱进R0有多困难我就不吐槽了...你们可以自己试试...
          驱动(Sys)加载后本身就是R0权限...所以R0层的Hook基本都会要写驱动...
          具体实现方法不说了,我也不会← ←到了这个层次不会汇编真的没法玩...坑出翔....
          有兴趣自己百度,我相信你们的智慧
          说下SSDT Hook的具体应用吧
          已知关闭进程需要用函数TerminateProcess()。
          调用TerminateProcess之前需要调用OpenProcess()获取进程句柄。
          那么我们如果Hook掉OpenProcess函数,检测到如果是某个指定进程就不调用OpenProcess而是去返回获取句柄失败。那么会怎样呢?
          Windows任务管理器尝试关闭进程,会因为OpenProcess在SSDT被Hook,访问到你的子程序。然后你的子程序告诉了任务管理器:打开进程失败
          于是任务管理器就会返回一个经典的提示:无法完成操作 拒绝访问(见1楼图片)
          相信你们在不少杀毒软件都看过这个提示
          I


          IP属地:浙江本楼含有高级字体5楼2013-10-08 22:21
          收起回复
            发完了← ←我真是无聊...
            笑看沉帖...就像上次某验证码识别科普那样....


            IP属地:浙江6楼2013-10-08 22:22
            收起回复