|
PatchGuard (简称PG) 是微软在x64体系下加入的内核哨兵,作用是检测系统关键点是否被恶意篡改,也就是说,在x64下不能像X86下面那样各种SSDT HOOK INLINE HOOK
了,同时以前的一些骚操作例如断链隐藏进程,调试端口清零都不能做了,当然,内核界猛人辈出,看雪的老V就曾放出过win7 x64的过PG源码,于是大家都乐呵了。好景不长
win10来了,早年的方法统统不能用了,网上也曾开源过一些pass win10的源码,但都是静态的(也就是修改内核文件,需要重启电脑),意义不是很大。后来织梦论坛的大佬
另辟蹊径,想到了动态过的办法,并且把思路公开了,看雪的老V后来在这个思路的基础上,进行了深入的研究,也开源了一部分代码(伪码),该思路一直能用到win10 1607上
我在研究了PG系统和老V的源码后,在他的基础上更进一步,能一路杀到1803,好吧 废话有点多了,直接讲重点吧。
PG在初始化的时候,会随机将自己的PG代码复制N分到非换叶内存里去,有时候是0 有时候是5,我最多一次抓到了五个,但不确定是不是五个。
前面的思路都和织梦老大,老V等人的一样
贴代码
PVOID LoadAndReadFile(WCHAR * szFileName)
第一步 将NT模块载入内存
第二步 搜KEY (这部分代码在GITHUB上有,我就不贴了,因为没有得到作者授权)
第三步 扫BIGPOOL
PSYSTEM_BIGPOOL_INFORMATION pBigPoolInfo = (PSYSTEM_BIGPOOL_INFORMATION)ExAllocatePoolWithTag(NonPagedPool, sizeof(SYSTEM_BIGPOOL_INFORMATION), 'ttt');
ULONG64 ReturnLength = 0;
status = ZwQuerySystemInformation(SystemBigPoolInformation, pBigPoolInfo, sizeof(SYSTEM_BIGPOOL_INFORMATION), &ReturnLength);
BIGPOOL里 有分页内存和非分页内存
因为PG必须执行在非分页内存里,所以就不用扫分页内存了
到这里 我和老V的思路都是一样的,最大的区别是 bigpool会出现一种奇怪的现象,什么呢 就是系统PTE越界的问题,当你扫PG的代码的时候,有时候会跳过两个连续的页面
大概意思就是 A 和B 页面 是连在一起的,扫完A后,应该接着扫B,但是参考老V的代码,会出现跳过B的情况,还有种情况就是要考虑页面大小的问题 到底是4K的页面 还是2MB的页面 也要加入判断
所以最后我果断放弃了搜BIGPOOL
直接爆搜物理内存,攻击PG流程的代码 也能在前文说的那个网站上搜到,我也就不贴了。
所以,最终的解决方案就是
1.放弃掉BIGPOOL 直接搜物理内存
2.要判断一下系统PTE的页面大小
当然 这只是攻击PG的思路,具体到代码还是有很多骚操作和小技巧的,我就不细说了,有兴趣的朋友可以谷歌搜索下PG1,2,3的分析文章,会对你有帮助的
然后据说在1803上 加入了新的守护体系 H-TV,但是好像我的代码依旧能跑,该怎么钩还是怎么钩。
最长的一次挂了一夜没蓝屏
但是有个奇怪的BUG 就是在内存32G的机器上,会引发一个硬件异常,至今没分析明白!蛋疼
1803也能钩,只是PCHUNTER不支持1803 我就没办法展示了。
写在最后,一般讨论这样的话题,都会引起纷争,因为我也确实没放什么干货,我其实挺想开源的,但是这玩意不是我一个人搞出来的,见谅
全部思路来自织梦老大和看雪老V,我只是在他们的基础上,解决了一些小问题。
老V的代码地址 :https://github.com/killvxk/DisableWin10PatchguardPoc
这份代码完全能用,当然 照搬的话会出现我前文所说的问题,自己获取下内核PTE页面打下 加个判断 就OJBK了!
一个半小时过去了 没蓝屏
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|