查看: 600|回复: 2

[原创] [驱动代码审计]代码审计入门-以PYAS的自我保护驱动示例

[复制链接]

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

发表于 2024-11-24 01:22:37 | 显示全部楼层 |阅读模式
回归贴,深度学习教程的贴主上学去了,换我来简单更新一下
上次更新都是三个多月前咯


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协同

评分

参与人数 1经验 +20 分享 +1 原创 +1 收起 理由
henry217 + 20 + 1 + 1

查看全部评分

YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

 楼主| 发表于 2024-11-24 01:26:17 | 显示全部楼层
补图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

0

技术

7

魅力

0

原创

版主

Rank: 7Rank: 7Rank: 7

积分
5114
人气
137
分享
5
发表于 2024-12-2 15:53:35 | 显示全部楼层

你是怎么学明白驱动开发的,我看WindowsAPI都嫌麻烦
Manners maketh man
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表