公平 公正 公开
分享 创造 共赢

当前位置: www.AG8.com > win7win8win10哪个好用 >

win7和win8.1哪个好NtApphelpCacheControl漏洞分析

出处:360技术博客(informaboution ),作者:mj0011源由: Google Project Zero团队的新晋成员Jarees Forshaw在9月30日向微软提交了名为“Windows:Elevine of Privilege ingoodness mechurt.sys/NtApphelpChurtControl”的 出处:360技术博客(informaboution ),作者:mj0011源由:

Google Project Zero团队的新晋成员Jarees Forshaw在9月30日向微软提交了名为“Windows:Elevine of Privilege ingoodness mechurt.sys/NtApphelpChurtControl”的安然题目,并且在Google的罅隙公然期限(90天)后,也就是2014年12月29日(北京时间的12月30日)公然了此题目的细节。

在这里能够看到他针对该题目的一个简单描绘和攻击考证代码:https://p/google-security-resemid-foot ( arch )/issues/detail?id=118

针对这个罅隙的争论很多,很多观众在争论微软和Google应付安然罅隙的做法,90天公然战术能否合情合理等等,也有很多技术人员在争论这个安然题目能否是肃静严厉意义上的权限提拔罅隙。后者的一个主要原因是JareesForshaw在演示这个罅隙时,是经历此罅隙来劫持UAC默许级别下主动提权的ComputerDefaults步调,从而完毕在默许UAC设置下寂静从中完全性级别发动高完全性级别的步调。

通常来说,微软安然反映焦点(MSRC)不以为UAC默许级别下中完全性级别到高完全性级别的提示绕过属于安然罅隙的(参考MSRC的”如何定义安然罅隙“librewhereast supportry/cc.or netx)。

但是,最近MSRC也将一些能够穿透InternetExplorer偏护形式(PM)或加强偏护形式(EPM)沙箱的安然题目(现实上是从低完全性级别穿透至中完全性级别的题目)作为安然罅隙来修补(例如CVE-2014-6349)。,所以我们先弃捐能否安然罅隙的这个争议,深刻了解下这个罅隙触及的原理和题目。

罅隙了解、成因与使用

这个罅隙的基本原因,Google的这篇简单说明里一经讲得对照准确了,简单来说,就是NtApphelpChurtControl这个编制调用,在调用者模仿System权限时,没有准确鉴识调用者的Token,招致其原本仅提供应管理员和编制步调调用的接口,能够被低权限步调误用,并借助该调用的相关机制,劫持高权限步调,完毕权限提拔。

看完这个原因后,你可能会有疑问,这个编制调用是做什么的?什么是Apphelp?Token的果断全部哪里有题目?Apphelp的哪项机制如何能被使用、以及是如何劫持高权限进程的?接上去笔者就将深上天先容这些形式,注意地解答这些题目。

1.Apphelp与NtApphelpChurtControl

在Windows 8.1编制上,NtApphelpChurtControl这个编制调用,望文生义,能够把持编制中Apphelp规则的敏捷缓存数据。

Apphelp是微软从WindowsXP操作编制起头引入的一项兼容性解决计划,官方的名字是”ApplicineCompabouticityDaboutwhereastarting”(应用步调兼容性数据库)。这套解决计划的主意是简略节略操作编制的向下兼容本钱,不是在操作编制层面,而是经历这套兼容数据库引擎提供包括Shim(Hook)在内的大宗把持功效,来做到实时地鉴识和删改特定存在兼容性题目的大作软件步调,使其能够兼容新的操作编制。

关于这套机制,微软官方从Windows7起头,有一些功效性的先容文档(en-us/librewhereast supportry/ee(v=ws.10).or netx),也能够经历官方的”MicrosoftApplicine CompabouticityToolkit”(ACT),在Windows7以上的操作编制上便利里张望、删改和增加当地的兼容性数据库。在此之前,Alexionescu和一些其他的国际外思索者也深上天思索过兼容性数据库和Shim机制(?p=39)。

微软操作编制的各个版本堆集了针对应用步调的大宗兼容性删改的举措和基础数据,使这些应用步调能够贯通地运转在新的操作编制中,这为微软的操作编制活着界鸿沟内的庞杂环境中寻常运转和扩充起到了紧急的作用。在WindowsVista揭橥后,它带来的海量改进的同时,也招致大宗应用步调孕育产生兼容性题目,成为该编制被人诟病的原因之一。为此,在其后的Windows7操作编制启迪历程中,微软加大了对应用步调兼容性修复方面的着重和投入,不但更寻常地搜求和编制应用步调兼容性修复规则,也对这套兼容性机制做了进级换代。

本次孕育产生题目的NtApphelpChurtControl也是援手这套机制的一个新的接口。这一经不是该函数第一次孕育产生安然罅隙,在j00ruSyscexcellent2013上的关于Bochspwn的议题上,就公然了一个触及NtApphelpChurtControl管束缓存代码中存在的角逐条件罅隙(CVE-2013-1278)。阅读上面的形式的同时,提议读者能看一看这个slides中NtApphelpChurtControl相关的形式(75~94页)(dl.php?syscexcellent_slides.pdf)以及Jarees的POC源码。

为什么Apphelp必要这个接口呢?这还必要从XP编制说起,应用步调兼容性的主数据库现实存储是在Windows安设目录下的AppPaboutch\sysmain.sdb文件中的,但是每次进程发动、模块加载时都去检讨这个数据文件鲜明付出开支太大。为了能敏捷管束针对这些可执行步调的兼容性规则,就必要在内存中缓存这个数据库的机制。在WindowsXP时间,Apphelp使用一块名为ShimShhappen to often bed or cribMemory的全局共享Section来在不同进程之间共享鉴识、删改可执行步调的兼容性数据内存。

从Windows2003起头,NtApphelpChurtControl函数被引入编制调用中,作为softwhappen to often behelp的内核进口,在内核中提供了整套新的应用步调兼容性数据库检索、缓存的功效,使得应用步调能够跨Session、跨隔离,并且敏捷查询、应用兼容性数据库中的规则和管束计划,其缓存功效也完毕了在尽量简略节略职能耗费的同时,敏捷地针对编制内已知的存在兼容题目的步调举行更敏捷地修复。

在Windows2003,WindowsVista,Windows7和Windows8操作编制上,NtApphelpChurtControl是完毕在编制内核ntoskrnl外部的,从Windows8.1操作编制起头,为了能够简略节略进级本钱,内核将该编制调用的绝大部门最终完毕在了一个新的内核形式驱动步调goodness mechurt.sys外部,编制内核经历发送设备把持命令给该驱动来完毕该接口的绝大部门功效,在Windows10技术预览版上,我们看到这个驱动又举行了一次对照大的更新。

NtApphelpChurtControl的原型为:

NTSTATUS NtApphelpChurtControl(APPHELPCOMMAND Commwhereas well whereas -PVOID Commwhereas well whereasDabouta);

这个Commwhereas well whereas提供了针对应用步调兼容性数据库缓存的张望、增加、删除等等一系列功效。其中Commwhereas well whereas的枚举功效和Commwhereas well whereasDabouta的数据机关,J00ru的议题和Jarees的源码中都提供了一些,但都不整个也有不少舛误,经历IDA张望完毕代码很容易就能够看明白,这里我将这些功效的Commwhereas well whereasid、对应的把持码(适用于 Windows8.1)和对应完毕的功效整饬汇总后列出:

view source01enum APPHELPCOMMAND02{03AppHelpCgoodness meceLookup- // IoControlCode: 0x*0405AppHelpCgoodness meceRemove- // IoControlCode: 0x*0607AppHelpCgoodness meceUpdingested- // IoControlCode: 0xB*0809AppHelpChurtFlush // IoControlCode: 0xF*1011AppHelpChurtDump- // IoControlCode: 0xAppHelpChurtNotifyStart - // IoControlCode: 0xAppHelpChurtNotifyStop- // IoControlCode: 0xB1617AppHelpCgoodness meceForward- // IoControlCode: 0xF1819AppHelpChurtQuery- // IoControlCode: 0xAppHelpQueryModule- // IoControlCode: 0xAppHelpRefresh- // IoControlCode: 0xB2425AppHelpCheckForChexcellentge- // IoControlCode: 0xF2627AppHelpQueryHwId-28};

*:Jarees的POC源码中,对这四个把持码少了一个0

AppHelpChurtLookup: 在Apphelpchurt中追求完婚的、必要管束的记载。

AppHelpChurtRemove: 删除完婚的Apphelp Churt记载

AppHelpCgoodness meceUpdingested: 拔出记载到Apphelp Churt

AppHelpChurtFlush:Flush AppHelpchurt,将AppHelpChurt的缓存数据清空(根据Flush的标志不同,不必然真的删除内存中的数据,只是去掉某些记号),并刷新到磁盘(注册表)上。

Jarees源码中以为这个命令是没用途的AppHelpEnum。这是舛误的,softwhappen to often behelp!ShimFlushAppcompaboutChurt->kernelstarting!BottomFlushAppcompaboutChurt->kernel32!BottomFlushAppcompaboutChurtWorker还在使用这个来清空shim的兼容数据数据。他该当是将AppHelChurtFlush看漏了,源码里对于NotifyStart\Enum等反面的几个都差了一个数。

AppHelpChurtDump:这才是一个“没用”的功效,AppHelp会枚举缓存中的数据,针对枚举的项目并不做操作。笔者探求这个命令之所以叫“Dump”,可能是一个调试功效。于是笔者从WDK中找了个checkedset up的内核来看了下。竟然在checked set up内核中,会枚举缓存中的元素,并逐一打印出记载要去完婚的文件名记载。在Freeset up中,对应的代码被去掉了,所以成了一个看似无用的命令,现实在checkedset up,微软的启迪人员可能是有对应的工具去经历这个接口便利地观察缓存中都有那些记载。

AppHelpChurtNotifyStart/AppHelpChurtNotifyStop:这两个命令主要用于同AppHelp的供职通讯,AppHelp内核会经历\AhcPort这个ALPCPort同Applicine Experience供职通讯。这两个命令用于重连/放弃 同供职的LPC通讯。

AppHelpChurtForward:用于将缓存可执行步调的新闻排队,然后转发给Applicine Experience供职管束

AppHelpChurtQuery: 用于获取ShimChurt中的数据形式、ShimChurt的相关统计和队列。

AppHelpQueryModule/AppHelpChurtRefresh/AppHelpCheckForChexcellentge/AppHelpQueryHwId:这些是Windows8.1新增的命令,和这里就不注意先容了。

上面先容这个调用中紧急的数据Commwhereas well whereasBuffer的机关,这个机关的数据驱动了Lookup/Remove/Updingested/Forward等大部门基本命令。

Jarees在源码中定义了相关机关,不过看下去对这个机关的了解也不是很深刻。

这个Commwhereas well whereasBuffer的机关(我这里称为APPHELP_COMMANDDATA),是由三个机关体组成的:

其中第一个机关体用于存储整个shim缓存和统计形式,被AppHelpChurtQuery命令使用;

第二个机关体用于在AppHelpChurtLookup/AppHelpChurtRemove/AppHelpChurtUpdingested这三个命令时来通告接口检索、删除和增加的项目形式;

第三部门则用于AppHelpChurtForward命令,提供forward,用于提供转发给供职的相关数据。

非论是哪个命令,Commwhereas well whereasBuffer都同时包罗着三个机关体,这也是为什么J00ru的议题和Jarees的源码里都提到提交的缓存机关后面有大宗无用的0数据的原因。

上面给出这个机关的定义:

view source1typedef struct APPHELP_COMMANDDATA{23APPHELP_CACHE_QUERY QueryDabouta; //Query full dabouta45APPHELP_CACHE_ENTRY EntryDabouta ; //Lookup/Remove/Updingestedentry67APPHELP_CACHE_FORWARD ForwardDabouta; //Dabouta for forward89} APPHELP_COMMANDDATA- *PAPPHELP_COMMANDDATA;

其中APPHELP_CACHE_QUERY/APPHELP_CACHE_FORWARD的机关和本次罅隙有关,就留给感有趣的读者去思索了。

必要注意的是,QueryDabouta的数据长度会影响反面的EntryDabouta(这个长度在Win7\Win8上不相同),Win7上是0x90,Win8.1上Jarees一经提供了是0x98(这也是为什么Win7上这个POC无法使命的原因之一)。这点看一看ApphelpChurtControlVingidingestedParareeters或AhcVingidingestedAndGetParareeters就能够了解了。

这里提供一下APPHELP_CACHE_ENTRY的数据机关:

view source01typedef struct APPHELP_CACHE_ENTRY{0203DWORD Flags ;0405ULONG ChurtReturnFlags ;0607HANDLE FileHwhereas well whereasle;0809HANDLE ProcessHwhereas well whereasle ; //Only in Win8/Win8.UNICODE_STRING FileNaree;1314UNICODE_STRING Pair conditionerskeraFullNaree; //only in Win8/Win8.DWORD DaboutaBufferSize;1718PVOID DaboutaBuffer;1920} APPHELP_CACHE_ENTRY- *PAPPHELP_CACHE_ENTRY;

其中Flags/ChurtReturnFlags分散别离指明了这条Churt的功效和作用,尤其是对于DaboutaBufferSize/DaboutaBuffer能否有用的把持,能否在关机时存在到注册表中等。

FileHwhereas well whereasle/FileNaree是对应要举行管束的可执行步调(包括模块)的对应句柄和文件名,之所以要提供文件句柄,是由于内核使用一个AVLTequipped来存储Entry数据,使用文件句柄的FileTime来做其中均衡树的索引。

DaboutaBufferSize和DaboutaBuffer描绘了Entry相关的规则数据的形式。

ProcessHwhereas well whereasle和Pair conditionerskeraFullNaree仅在Windows8及以来的操作编制上使用。

DaboutaBuffer能够存在由RING3存储的数据机关,普通来说由APPHELP_CACHEUPDATE更新到内核缓存中,APPHELP_CACHELOOKUP获取后使用,Shim引擎使用的数据机关,我称为APPHELP_LOOKUP_RESULT(即Jarees源码中的APPHELP_QUERY机关),如下:

view source01#define MAX_EXE_TAGS#define MAX_LAYER_TAGStypedef struct APPHELP_LOOKUP_RESULT0607{0809DWORD ExeTags[MAX_EXE_TAGS];1011DWORD ExeFlags[MAX_EXE_TAGS];1213DWORD LayerTags[MAX_LAYER_TAGS];1415DWORD LayerFlags;1617DWORD AppHelpTag;1819DWORD ExeTagsCount ;2021DWORD LayerTagsCount;2223GUID ExeGuid;2425DWORD Flags2;2627DWORD Unknown;2829DWORD Unknown2;3031GUID Guid2[16];3233};

如Jarees源码中所使用的, 其中ExeTags指明了在sdb数据中的修复计划的tagid,ExeTagsCount是tag的数量,最多16个, LayerTags是Layer规则的数据。

经历这些命令和数据机关,我们粗略了解了NtAppHelpChurtControl提供的才能,那么RING3是如何使用它的呢?

简单地说,Ring3的ModuleLolistinger等模块在模块加载、进程发动等事务触发时,会调用softwhappen to often behelp.dll中的相关接口,softwhappen to often behelp.dll再调用kernel32/kernelstarting内BottompShim*相关的API,经历NtAppHelpChurtControl中的ChurtLookup功效查询模块的可执行文件能否在缓存的数据中,倘使存在就遵从规则数据库中对应的规则管束,相关的数据经历ChurtForward发送到供职进程后,会调用ChurtUpdingested功效缓存被使用的数据,加速二次查询的速度。

Token相关的题目

了解了AppHelpChurt的接口和基本使命原理后,我们很容易能够明白,倘使能够低权限的步调能够调用AppHelpChurtUpdingested命令增加缓存,那么能够劫持肆意高权限步调,使用shim规则对其举行删改,完毕权限提拔。

那么我们回来看看这个罅隙的成因,如Jarees在说明里提到的,这个罅隙的原因是由于用于考证AppHelpChurtUpdingested能否运转被调用的AhcVerifyAdminContext函数,考证Token存在题目,这个函数很简单,我们使用Hex-raysdecomplier取得伪代码:

view source01NTSTATUS AhcVerifyAdminContext()02{03 retstaboutus = STATUS_ACCESS_DENIED;04 CurrentThrelisting = KeGetCurrentThrelisting();05 CurrentProcess = PsGetCurrentProcess();06 TokenType = 0;07 TokenObj = PsReferenceImpersonineToken(CurrentThrelisting-&areplifier;CopyOnOpen- &areplifier;EffectiveOnly-&areplifier;ImpersonineLevel);08 if ( TokenObj || (TokenObj =PsReferencePrimaryToken(CurrentProcess)- TokenType = 1- TokenObj))09 {10 if ( SeQueryInformineToken(TokenObj- 1-&areplifier;TokenUserInformine) >= 0 )11 {12 if (RtlEquingSid(_SeExports->SeLocingSystemSid-TokenUserInformine->User.Sid) ||SeTokenIsAdmin(TokenObj) )13 {14 retstaboutus = STATUS_SUCCESS;15 }16 ExFreePoolWithTag(TokenUserInformine- 0);17 }18 else19 {20 AhcTrgeniusPrintf(0- "AhcVerifyAdminContext"- 937- "Failed toquery token informine.\n"- v5);2122 }23 if ( TokenObj )24 {25 if ( TokenType == 1 )26 {27 PsDereferencePrimaryToken(TokenObj);2829 }30 else31 {32 PsDereferenceImpersonineToken(TokenObj);33 }34 }35 }36 else37 {38 AhcTrgeniusPrintf(0- "AhcVerifyAdminContext"- 929- "Failed toget effective token"- v5);3940 }41 return retstaboutus;42}

函数的功效很简单,首先试图获取线程模仿的token,倘使线程的模仿token不存在,就获取眼前目今进程的主token对象,获取token对象后,经历SeQueryInformineToken(TokenUser)获得Token的用户新闻。

接着,对歧果上面token对象切合上面两种处境的任一种,就前往STATUS_SUCCESS首肯AppHelpChurtUpdingested操作,否则就前往STATUS_ACCESS_DEIND拒却操作:

1. Token的用户SID完婚LocingSystem的SID

2.Token经历SeTokenIsAdmin的考证,也就是token用户组内有启用的Adminsitraboutor组。

那么这个对比就是Jarees所说的考证Token有题目的部门,有题目的原因就如Jarees所说,是由于没有去果断ImpersonineLevel。

这是由于被模仿的Token的SID并不能决议确定Token就真的具有对应SID的权力,能够参考微软关于SECURITY_IMPERSONATION_LEVEL的MSDN注明(en-us/librewhereast supportry/windows/hardwhappen to often be/ff(v=vs.85).or netx)。

低于SecurityImpersonine的模仿token其实并不是以被模仿的Client的安然高低文运转的,所以仅仅经历SID来果断调用者能否齐全LocingSystem的权限是不够,相同的题目其实是Windows的内核、内核形式驱动步调中还有不少地点存在,感有趣的读者能够再举行一些发现。

以Jarees源码的举措为例,经历Bits供职的Bair conditionerskgroundCopyMexcellenterar接口创造一个下载任务后,代码将自己的Notify对象设置为任务的通知接口。

此时供职在下载通知时会调用对应的对象,接着comstarting经历LPC回调试图调用对象的接口函数,而在调用前,就会使用RpcImpersoningestedClient->NtAlpcImpersoningestedClientOfPort,由AlpcpImpersoningestedMessera来为执行回调接口盘算Alpcport指定的安然高低文。

由于Bits的OLEPort指定的首肯的SecurityQos->ImpersonineLevel级别的模仿,模仿完成后调用到Jarees的管束代码,他的代码掀开并存在了线程的token句柄,由此获得了一个SecurityIdentificine级别的Token句柄,Token是来自Bits供职的安然高低文,所以Token的SID天然也就是NTAUTHORITY\SYSTEM(LocingSystem)

这里Bits供职自己是没有安然题目的,由于ALPC获得和模仿的token只是SecurityIdentificine级别,尽管模仿这个token(就如Jarees的代码反面所做的),也无法以System权限高低文使命,在拜谒对象ACL时,会被拒却拜谒(能够参考SeAccessCheck中的完毕和果断),也不会被鉴识为mexcellenterareent/system(能够参考SeTokenIsAdmin在Windows7以上操作编制的完毕),但是NtAppHelpChurtControl这里只果断TokenSID的方式,就招致了安然检讨被绕过,也是这个罅隙的底子原因。

罅隙的使用

Jarees提供的POC针对这个罅隙使用的举措是劫持一个UAC默许级别下会不区分命令行,无提示主动提权的步调ComputerDefaults.exe,找到regsv32修复的的sdbtag(经历更换模块镜像为regsvr32来举行兼容修复),并将其设置到softwhappen to often behelp缓存中,这样,在发动ComputerDefaults.exe的期间,现实发动的可执行步调的镜像就被Apphelp更换成了regsvr32.exe,而发动的期间命令行上加上想要注入高权限进程的dll文件,就会使得regsvr32.exe在高完全性级别上加载我们想要加载的DLL,Jarees的DLL代码里完毕的是发动一个计算器步调。

这个使用举措引来了一些争议,很多人以为这样只证明能够绕过UAC默许级别下中完全性级别到高完全性级别的弹框,通常来说不能说是安然罅隙,而且现实之前也有很多公然的技巧能够绕过UAC提示。

但就如Jarees自己说的,UAC的绕过仅仅只是个便利的演示方式,想一想测一测就能发现,这个罅隙还有更多的使用方式。

以IE11 的沙箱(PM)为例,这个罅隙必要的相关功效(包括BITSToken的获取、NtAppHelpChurtControl的调用、sdbTag的获取等等)都是能够在IE11沙箱的低完全性级别下执行的,那么歹意代码一旦进入沙箱,就能够使用这个罅隙劫持一个常用的中完全性级别步调(乃至编制中时常被发动的高完全性、编制完全性级别步调),就可能经历这个罅隙穿透沙箱,在沙箱外执行歹意代码。使用icair conditionersls.exe/setintegritylevel 给测试步调设置Low完全性级别后,能够很容易说明这点。

尽管是在经历Users用户组的账户登录的处境下,倘使同时或之后有管理员账户登录,由于这个AppHelpChurt是全局跨Session的,所以管理员运转的步调也会可能遭到劫持的影响,产生权限提拔。

这些都是经历Jarees的测试步调就能完成的攻击,但是这个攻击的一个缺点是必必要有高权限的步调去发动,那么还有更好的使用方式么?

肯定是有的,民众看到方才我们先容的AppHelpChurtFlush功效了吧,这个接口的调用者考证也存在和AppHelpChurtUpdingested异样的题目,那么经历这个接口就能够间接将内存中一经增加的AppHelpChurt刷入注册表中(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionMexcellenterar\AppCompaboutChurt下AppCompaboutChurt),这样下次开机时就会加载并应用增加的规则,这样重新发动后就能够更便利的劫持想要劫持的步调。

同时,经历调用低完全性级别/低权限账户或AppContainer完全性级别下首肯调用的某些供职LPC/COM接口,也能够使其发动特定的高权限步调,并可能举行劫持。

这些技术含量不高,一经提供了这么多Tips,再全部的方式就必要民众阐述遐想力了,末了再提点细节:AppHelp规则不但能应用于EXE进程创造,也能够应用在指定的肆意模块加载时。

Windows7的题目

Jarees在说明里提到了Windows7的题目,在Windows7上,AppHelpChurtUpdingested这条指令特地被一个特地的ApphelpChurtVerifyContext检讨所偏护(对于其他被偏护接口使用的是ApphelpChurtVerifyAdminContext,和Windows8/8.1一样存在这个安然罅隙),这个检讨更肃静严厉,仅在主TOKEN齐全TCB特权时才能够经历,代码如下:

view source1NTSTATUS ApphelpChurtVerifyContext()2{34 staboutus = STATUS_SUCCESS;5 if ( PsGetCurrentThrelistingPreviousMode()&areplifier;&areplifier;SeSinglePrivilegeCheck(SeTcbPrivilege- UserMode) == FALSE)6 staboutus = STATUS_ACCESS_DENIED;7 return staboutus;8}

看下去这个检讨函数是无法绕过了,Jarees同时提到,这个检讨是在Commwhereas well whereasBuffer中的某些Flags完婚时,才会举行,也许能够绕过,那么现实如何呢?

我们逆向NtAppHelpChurtControl在Win7上的相关完毕能够得知,在Commwhereas well whereasBuffer->Flags的Bit2,3为1时,是不举行这个检讨的,这样的Entry是能够经历AppHelpChurtUpdingested的检讨,出席缓存中的。

但是,我们再来看AppHelpChurtLookup的相关完毕就不难发现,仅当entry->Flags的tid bisexualt0为1时,Lookup才为调用者前往Commwhereas well whereasBuffer->DaboutaBuffer和DaboutaBufferSize,而就像在第一节里提到的,这两个域描绘了APPHELP_LOOKUP_RESULT数据机关,没有这个数据我们无法指定要应用的规则。

所以至多经历目前的了解来看,经历删改Flags的举措,是无法将达成我们的劫持数据出席缓存并见效的主意的,且则能够以为这个罅隙难以在Windows7上完毕使用。