首页
社区
课程
招聘
[原创]Sandboxie循序渐进耳之监控篇上
发表于: 2020-8-8 23:33 14619

[原创]Sandboxie循序渐进耳之监控篇上

2020-8-8 23:33
14619

SandBoxie循序渐进耳监控篇上

Sandboxie监控篇笔记太长,引擎打算重写(利于二次开发),业余时间研究会久一些,分为上下篇分享笔记。
上篇主要自编译沙盘部署(合规过程),文件举例回调/r3dll注入分析,沙盘内部构建MSG通信分析(自行添加消息),基于MFC二次开发(抛砖引玉)。
下篇主要接管资源监控数据和重写部分监控引擎,添加hook第三方接口。

本篇是进程监控笔记,以功能为出发点,进一步探讨实现原理与数据应用,参杂排错思路和开发相关知识。

David.SandboxiePlush增添了许多新功能,新鲜感的界面和多交互,确实是不错的一面。

 

SandBoxiePlush界面

 

本文基于原生的Sandboxie添加API监视模块,准备改造如下(后续会改进,危险操作将会标红):

 


沙盘编译部署

进程篇基于调试学习和理解,本篇需要自己实现编译且正常执行,不推荐使用脚本集成化,最好能够理解和学习每一个环节,过程无疑是比较麻烦的,这里补贴一张r3进程篇流程图。

 

r3-process-run


Release编译全部工程,编译期间如果遇到lib异常,请参考第一篇文章引荐的解决方案,根据错误提示解决问题,目标是能够正常运行自编译Sandboxie即可:

 

编译完成后直接运行SbieCtrl.exe会发生错误,SbieSvc.exe需要以服务的方式启动,SbieDrv这时候也没被加载。

 

 

后来查看了安装脚本和David-SandMain代码启动流程(保证每个步骤都合规),依赖于KmdUtil进行加载,sandboxie作者已写好模块,只需要调用即可。

 

SbieControl:

1) 如果本机已安装Sandboxie,调试可能会出现版本不匹配,这时候SbieSvc服务和驱动已启动,可以进行LPC查询版本号,需要卸载已安装的Sandboxie,如下所示:

 

Clinet:

版本检测CMyApp::InitInstance().CInitWait initwait(this);将会通过发送请求MSGID_SBIE_INI_GET_VERSION判断组件之间版本是否一致.

Server:


GetVersion查询当前版本,MY_VERSION_STRING宏声明了版本号


检测版本号不匹配,弹窗提示,因为本机安装发行版是v5.33,源码版本是v5.4,自编译的程序应该都是v5.4版本,不会出现上述问题。

版本号校验实际开发中是必要的,多版本迭代,多个组件功能增添和优化,当新版发布后,客户只更新部分组件或某些原因更新失败,新老版参杂运行可能因接口已改动等问题造成很大的风险.

2) 指定的服务未安装,如下所示:

 

Client:

SbieCtrl.CMyApp::InitInstance().CInitWait.initwait(this).SbieDll_StartSbieSvc(BOOLEAN retry).SbieDll_ConnectPort().当SbieSvc未启动的时候,data->ProtHandle没有句柄.

调用SbieDll_ConnectPort()连接服务端,如下所示:

 

 


如上图所示,指定服务未安装,SbieControl.exe启动过程中,默认SbieSvc服务是已加载,Server开启监听等待客户端连接,如果Server未启动,SbieControl不会做加载操作.

基于原生Sandboxie添加代码,连接服务失败则重新服务加载,为了有交互性,简单弹窗或Dlg告知用户是否需要加载SbieSvc和Drv(只提示一次),当然也可以用脚本完成服务安装和驱动安装,这里通过添加代码熟悉每一个环节,如下所示:


这只是一个最简单的示例,如果点击是(Y)则加载驱动和服务,如下所示:

 

KimUtil:

编写服务管理模块,阅读KimUtil源码,它负责SbieDrv和SbieSvc生命周期管理,ReadMe.txt介绍如下:

KmdUtil (\install\kmdutil). Builds KmdUtil.exe which is used during the installtion process. E.g. to start/stop the Sbie driver (SbieDrv.sys).


参考David.SandboxiePlush管理模块用法,初始化源码如下:


为了方便调试,可以使用cmd就可以完成安装/启动/停止等工作,循序不能乱,先加载驱动,梳理如下所示:


如果没有签名就会出现无法验证数字,解决方案,简单粗暴开机F8,如下:

 

驱动加载成功之后,fltmc可以查看已加载的实列和高度

 

 

服务加载成功后如下:

 

 

如果开启SbieSvc服务遇到了拒绝访问等权限问题,先核查注册表可执行路径,确认是否因SbieSvc.exe绝对路径导致问题。在排查目录权限,百度自行解决即可(注意先启动驱动/后启动服务)。

给原生Sandboxie添加服务/驱动管理代码,至此SbieCtrl.exe界面运行成功

 

Error1: 运行后发现无法正常执行,会出现配置文件错误,如下所示:

 

解决方案:拷贝install\Templates.ini文件至沙箱编译运行目录下即可。

 

Error2: 执行进程再次遇到错误,如下所示:

 

找不到对象名称?ALPC连接失败?如何出现的这个错误?当前项目共找到三处MSG_2101调用处,但是根据上下文只有一处命中,错误源于Syscall_CheckObject函数的检测,源码如下:

解决方案:

SbieDrv添加断点,编译安装,Name值为空,ALPC未连接成功,alpc意味着可能未初始化,该问题上两周没有找到解决方案,因为时间花在了引擎二次开发和界面改进,有时间的朋友可以研究。

 

 

 

 

控制权限

抛砖引玉

本篇以文件操作举例,使用Hook API, fsd hook,disk hook,Ntfs(MFT)篡改都可以实现文件权限控制(可读,可写,可访问)重定向。

 

沙盘已实现限制功能,可控制多进程之间的权限管理,Sandboxie自带资源访问监控,如下所示:

 

本篇以文件限制/资源访问两项功能为主线,进一步学习源码,分析实现原理,添加更直观的数据展示。

测试demo:

CreateFile(OPEN_ALWAYS)-->Userinput-->WriteFile-->CloseHand-->CreateFile(OPEN_EXISTING)-->ReadFile做为API序列。

文件限制

1) 为了测试沙盘隔离效果,本机C盘创建1.txt文件,并且写入字符,然后Sandboxie执行Demo,创建1.txt并且写入输入的字符,如下图所示,Demo执行之后,本地1.txt没有发生任何改变:

 

2) 沙盘目录下已创建了C\1.txt,且写入了Demo中输入的字符串,这就是重定向。

 

 

 

文件权限:

 

如何去构造进程监控?r3层跨进程hook依赖远程线程注入Dll或shellcode,对目标进程API挂钩实现过滤。Sandboxie如何实现重定向和监控呢?一起寻找答案如果windbg过程中寻找答案,那将是非常耗费精力的事情,善于搜索源码,Sandboxie以各类消息进行通信,注入也会有消息定义,可以搜索关键字。


其中SVC_INJECT_PROCESS/SVC_RESTART_HOST_INJECTED_SVCS字面意思很明显,服务注入进程,通过代码搜索调用函数及回溯。进程篇发现执行过程中r3没有做hook代码?如何实现进程监控呢?这里阐述驱动初始化过程(文件),一开始是想放到原理篇(SbieDrv完整性分析)。

1. _FX NTSTATUS DriverEntry()SbieDrv驱动入口点,驱动加载时候将会执行方法,Process_Init()


2. Process_Init()函数函数负责注册回调,PsSetCreateProcessNotifyRoutine ,进程创建/结束将会调用回调函数Process_NotifyProcess()


3. Process_NotifyProcess()函数进程创建将会处理Process_NotifyProcess_Create()


4. 负责进程相关的结构填充,通过Process_Low_Inject发送SVC_INJECT_PROCESS至SbieSvc告知注入,等待SbieSvc的挂钩处理。

5. SbieSvc接收到消息之后,DriverAssist.cpp.MsgWorkerThread开始工作,如下:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-8-9 00:08 被一半人生编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (4)
雪    币: 6052
活跃值: (12569)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
2

图片已补

最后于 2020-8-9 00:09 被一半人生编辑 ,原因:
2020-8-8 23:35
0
雪    币: 449
活跃值: (3792)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
强!!!
2020-8-9 10:46
0
雪    币: 239
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4

非常不错,感谢分享,谢谢谢谢!

最后于 2020-12-25 09:24 被lyanl编辑 ,原因:
2020-12-22 18:11
0
雪    币: 0
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
找不到对象名称?ALPC连接失败?如何出现的这个错误?当前项目共找到三处MSG_2101调用处,但是根据上下文只有一处命中,错误源于Syscall_CheckObject函数的检测,源码如下:
请问 大佬这个问题怎么解决啊,我自己编译的程序一直报这个错
2021-6-30 16:25
0
游客
登录 | 注册 方可回帖
返回
//