[置頂] EasyHook庫系列使用教程之五全局ACL和本地ACL
來源:程序員人生 發布時間:2014-11-21 08:53:28 閱讀次數:3674次
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時,最好同時使用包容或排除方式,以避免混淆。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈