码迷,mamicode.com
首页 > 其他好文 > 详细

EasyHook库系列使用教程之五全局ACL和本地ACL

时间:2014-10-29 19:24:54      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:style   blog   使用   sp   div   on   2014   log   代码   

EasyHook控制钩子函数通过两个ACL表控制

全局ACL:针所有钩取的函数
本地ACL:针对指定的钩取函数

判断ACL是否能够访问的C++代码如下:
if(ACLContains(&Unit.GlobalACL, CheckID))
  {
    if(ACLContains(LocalACL, CheckID))
      {
        if(LocalACL->IsExclusive)
          return FALSE;
      }
    else
      {
        if(!LocalACL->IsExclusive)
          return FALSE;
      }
    return !Unit.GlobalACL.IsExclusive;
  }
else
  {
    if(ACLContains(LocalACL, CheckID))
      {
        if(LocalACL->IsExclusive)
          return FALSE;
      }
    else
      {
        if(!LocalACL->IsExclusive)
          return FALSE;
      }
    return Unit.GlobalACL.IsExclusive;
  }


例如:现在以排除方式为例说明期流程


假设,以排除方式设置了全局ACL和本地ACL,即GlobalACL中的线程列表为空,LocalACL中的线程列表为空。此时对的Hook函数均生效。
现在需要暂停所有的Hook函数。设置PID(1234)到GlobalACL中。
以上函数流程将如下

if(ACLContains(&Unit.GlobalACL, CheckID))      全局ACL中存在PID(1234)
  {
    if(ACLContains(LocalACL, CheckID))          本地不存在  
      {
        if(LocalACL->IsExclusive)
          return FALSE;
      }
    else
      {
        if(!LocalACL->IsExclusive)                本地的为排除,因此LocalACL->IsExclusive=true

          return FALSE;
      }
    return !Unit.GlobalACL.IsExclusive;            全局为排余,因此Unit.GlobalACL.IsExclusive=true

  }
else
  {
    if(ACLContains(LocalACL, CheckID))
      {
        if(LocalACL->IsExclusive)
          return FALSE;
      }
    else
      {
        if(!LocalACL->IsExclusive)
          return FALSE;
      }
    return Unit.GlobalACL.IsExclusive;
  }
根据以上逻辑,返回的结果为False,即对应的线程不生效,即实现了暂停所有的Hook函数 。
建议,使用ACL时,最好同时使用包容或排除方式,以免混淆。

EasyHook库系列使用教程之五全局ACL和本地ACL

标签:style   blog   使用   sp   div   on   2014   log   代码   

原文地址:http://blog.csdn.net/yuzehome/article/details/40590385

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!