技术4
经验6685
魅力17
人气208
分享36
原创6
注册时间2022-4-22
最后登录2025-9-4
阅读权限100
在线时间316 小时
主题122
回帖581

版主
禁止发言
  
- 积分
- 5370
- 人气
- 208
- 分享
- 36
 
|
回归贴,深度学习教程的贴主上学去了,换我来简单更新一下
上次更新都是三个多月前咯
https://github.com/0sha0/PYAS_Protection
无意间发现杀神大佬给PYAS写的保护驱动,闲来无事分析一下
项目结构如下
Driver.c:主要实现驱动加载卸载,绕过签名检查
Driver.h:定义一些数据结构
PYAS_Protection/Driver_Process.h:回调函数结构定义,句柄定义(剩下两个也类似)
PYAS_Protection/File.c:使用ObRegisterCallbacks和自己写的回调函数来实现文件保护(同Process.c)
PYAS_Protection/Regedit.c:CmRegisterCallback注册回调,自定义处理例程
不难发现,主要的功能实现在File.c Process.c Regedit.c三个文件中
File.c文件分析
代码上来注册了一个高度为321000的回调函数,PreOperation指向PreCallBack函数,我们跟进
代码首先判断指针类型是否为File,然后判断是否为有效指针
重点来了,我们目光看到第三个if判断
这里使用了wcsstr函数,对对象中的文件路径这个宽字符串进行搜索,判断是否含有PYAS.exe
如果文件以删除或写入权限打开(FileObject->DeleteAccess == TRUE || FileObject->WriteAccess == TRUE),则代码将继续执行下一步
如果操作是创建文件句柄(OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE),则所需的访问权限将置空
如果操作是复制文件句柄(OperationInformation->Operation == OB_OPERATION_HANDLE_DUPLICATE),则复制句柄的所需访问权限也将设置为 空
(这一步的操作是为了防止从PYAS.exe这种进程中获取(复制)已经打开的具有完全权限的PYAS.exe的文件句柄)
但是,这种写法有一个问题,代码的逻辑是PYAS.exe只需包含在文件路径中即可,并没有限定是哪里的PYAS.exe
假设正常的PYAS.exe在C:\下,现在有一个malware,尝试abuse这个程序,它只需要把自己改名成名字里含有PYAS.exe的程序,就可以完美利用驱动程序的保护
比如PYAS.exe.exe,尽管我是一个完全的恶意程序,但是驱动程序在这里只检查了文件名,并没有做完全路径检查,或者进一步检测
所以这里的绕过方法:使自己的文件名包含PYAS.exe
底下还有一个保护PYAS.sys的,利用方法也是同理
(By the way:文件保护不写小过滤驱动而是用Ob来写我感觉也是比较清奇,不是说不行,而是小过滤驱动就是用来干这个的,也是最成熟的现代杀软技术)
Process.c
常规的注册回调直接不看,跟进到precall处理流程
先获取了pid,然后获取进程名,我们也可以看到对句柄进行了一个比较严格的过滤
这里有一个小bug,也有可能是我自己的逻辑问题,如果PYAS想要重启自身(CreateProcess再Exit掉自己),那么创建的进程将会是一个“空壳”(被过滤干净了)
在这里使用了_stricmp对进程名进行全字匹配,将会产生与File.c一样的问题:如果恶意文件将自己改名为PYAS.exe,然后运行,那么是不是可以abuse驱动的保护?
Regedit.c
先判断类型,但是对每个类型的处理逻辑差不多一样,存在一定的代码复用,可以简化处理
来看代码保护的注册表键值:
#define REG_PROTECT_KEY L"\\Run\\PYAS"
#define REG_PROTECT_DIR L"\\Run\\PYAS"
运用一下之前跟组内老哥写杀软遗留的记忆,这个应该是开机自启的键值
不难发现这里跟前面的file产生了一样的问题:wcsstr没有做严格判断
如果malware把自己改成PYASS,一样可以被搜索到,一样受到驱动的保护,这也是一种abuse的思路
大概总结一下:代码对保护范围的判断不严格,大量使用wcsstr导致的一些漏洞
修补意见:file.c->在安装时把自己的安装路径写入注册表,驱动在entry例程读取,拼接后做全字匹配
bytheway:建议统一转换成小写
reg->做全字 做全字 做全字!
process->结合路径判断,或者ring3写个协同,对路径文件算一遍md5检验一下看看是不是自己人,然后回传,交流可以开个pipe或者直接常规ring03协同
|
评分
-
查看全部评分
|