首页
社区
课程
招聘
[原创]Sandboxie循序渐进耳之进程篇
发表于: 2020-7-15 18:18 25278

[原创]Sandboxie循序渐进耳之进程篇

2020-7-15 18:18
25278

Ps:多少参杂了一些逆向,LPC通信Handler处理用windbg附加SbieSvc服务,利用Start.exe挂调试,IDA定位分析/源码辅助学习,调试过程有些问题拿捏不准,感谢前辈的帮助。


SandBoxie循序渐进耳(进程篇)

关于沙箱,工作之外断断续续学习走过不少坑,去年部署Cuckoo用来个人学习优化Monitor。也尝试过开发轻量级沙盘,逆向Sandboxie连皮毛都没学到,幸好今年SandBoxie开源给学习者带来了更多的思路。

作者推荐了代码审计重点,个人喜欢从界面开始熟悉,交互是响应各功能模块第一步,相对比较友好,较快的理解软件流程的来龙去脉。

推荐一个活跃的sandboxie生态论坛分支,也许你会找到想要的答案:

https://www.wilderssecurity.com/forums/sandboxing-virtualization.98/

 


SandBoxie:

源码编译:

1. 如果系统已有wdk7600环境,vs2015配置7600,请参考下述文章:

https://www.cnblogs.com/iBinary/p/8290595.html

2. 解决error LNK2001: 无法解析的外部符号 _memcmp/_wcsnicmp等被引用原因:这个过程浪费了大量的业余时间,引入各类函数lib无济于事,修复skd环境,大量的obj报错最终参考msdn文档解决,在Sandboxie的论坛上也发现了解决方案。

https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=vs-2019

 

https://community.sophos.com/products/sandboxie/f/forum/119641/important-sandboxie-open-source-code-is-available-for-download

3. 解决MinFilter编译被引用,属性-->链接器-->输入-->附加依赖项目:fltMgr.lib

 


4. 编译成功,不错的开端(vs2017同样编译成功,v141)。

 

 


安装沙盘:

这个步骤该阶段不太重要,不影响源码学习。Install/ReadMe按照步骤来做,NSIS已经更新到了v3,按照步骤安装和替换文件。Sandbox.sln同级目录下创建tools/iconv,解压拷贝,这些工作一次性便适用,不需要重复工。

 

 

DavidXanatos推出了SandBoxie-Plush,使用了QT,如果不加入其它操作系统分析引擎(可移植),Win下面向界面便捷开发更倾向于使用Libuidk实现(基于MFC商用框架已开源-国外人可能也不知道),容易重构。

 

https://github.com/sandboxie-plus/Sandboxie

 

源码学习:

可以下载发行版Sandboxie安装到主机,如果熟悉MFC这将是好的开端,能快速定位代码,控件响应和功能模块,代码重在理解和应用,汲取自己需要的知识。

 

创建沙盘(r3)

Create New SandBox找到对应的类

 

 


1. 输入沙盘名称做规则检测,如下所示:


2.调用SbieApi_IsBoxEnabled()判断沙盘名称是否已创建,发送API_SBIEDRV_CTLCODEDLL查询,封装了两个重要的参数:

1. API_IS_BOX_ENABLED(Driver API Codes)

2. Name_Address

 

3. Drv驱动 --> api.c(370行开始),对分发进行校验和处理:

3. 校验API_SBIEDRV_CTLCODEDLL

4. 分发api,回调查询code-->API_IS_BOX_ENABLED


Api_functions通过SetFunction初始化(conf_user.c-->106行),初始化分发函数.

Api_SetFunction(API_IS_BOX_ENABLED, Conf_Api_IsBoxEnabled)回调函数处理,如果不存在添加到链中,返回状态码标识是否成功,详细请见代码。

 


沙盘进程运行:

1. 选中沙盘点击运行,也可以直接拖到Dlg中,如下所示:

 


2. 思路有很多种,最简单直接的办法搜索函数,这里拖拽文件响应使用OnDropFiles,该工程也只有这一处拖拽使用,如下所示:

3. 沙盘如何将可执行文件加载,这是一个漫长的过程,RunStartExe.cpp --> 35行Common_RunStartExe,如下所示:


4. SbieDll_RunFromHome被定义在了proc.c进程模块,最终会通过CreateProcessW来启动文件,如下所示:


参数:"E:\Program Files\Sandboxie\Start.exe" /box:__ask__ "C:\Users\Administrator\Downloads\powershell.txt"

5. Start.exe,可以选择x64跟踪,也可以选择参数带入源码,解析格式box和_,查询进程信息,box:__ask__,如下所示:

针对一些指令会进行处理,Parse_Command_Line()返回执行文件路径。

 


Validate_Box_Name选择使用沙盘,代码如下:


6. 通过return die(RestartInSandbox())完成进程启动,RestartInSandbox函数:



7. 调用Callsvc.c(dll模块)处理req,req结构体下文会介绍,数据如下:

 

 


SandBoxie-LPC通信

 

LPC参考:https://bbs.pediy.com/thread-144492.htm


8. 本地通信模块需要熟悉LPC,推荐如下:

https://bbs.pediy.com/thread-144492.htm

https://bbs.pediy.com/thread-162365.htm

Client-Server调试方式,每个人都有自己的学习习惯,文章使用的第二种方式:

1. vs执行start源码,vs执行SbieSvc源码,编译好全部工程,输出目录同一个文件夹下,安装驱动,然后进行调试。(未尝试,理论可行)

2. vs执行start源码,windbg附加SbieSvc服务,IDA+源码辅助学习。


Client:

SbieDll_RunSandboxed()

负责tagPROCESS_RUN_SANDBOXED_REQ结构数据填充,前8bit数据MSG_HEADER结构体。

tagPROCESS_RUN_SANDBOXED_REQ结构,后面尾随的是消息块包括执行cmd和dir,env环境,内存数据如下所示:   

 

 


SbieDll_CallServer()

负责将客户端结构数据分发至服务端处理。


Service:

Sandboxie客户端循环发送MSG消息到服Svc.Pipserver.cpp(SbieSvcPort),服务端由NtReplyWaitReceivePort循环等待客户端数据,源码中封装如下:

NtReplyWaitReceivePort():


构造PORT_MESSAGE数据包,data->MaxDataLen数值是288bit,TotalLength总大小是328bit,包含结构体本身大小,LPC传输超过256bit进行内存共享传输。

windbg下断SbieSvc.exe-->NtReplyWaitReceivePort,客户端发送MSG至服务端消息队列,也可以直接审计源码,如下所示:

 

Sbiesvc.exe拖入ida,定位代码段:

 

 

LPC处理LPC_CONNECTION_REQUEST,LPC_REQUEST,LPC_PORT_CLOSED,LPC_CLIENT_DIED类型。

客户端client->replying标志,客户端在循环传输过程中调用PortRequest。    

PortRequest():


 


CallTarget():

负责LPC Handler函数分发,LPC Handler根据Msgid执行功能函数。

 

 

定位分发函数,断点0x1205观察,通过搜索定位函数代码,如下所示:

*ProcessServer::Handler()

 


IDA-Windbg对比源码无误,下断g运行,如下所示:

 

 

运行后会触发LPC回调分发,MSGID_PROCESS_RUN_SANDBOXED调用号断下1205,ProcessServer.cpp(line:428),启动新进程主模块。

*ProcessServer::RunSandboxedHandler()

获取cmd,dir,env数据

*cmd参数如下:

 

 


如果调用方是沙盒,pid号将确定API_START_PROCESS调用的BoxNameOrModel Pid参数,如果是沙箱外部的呼叫者指定了一个框名

SbieApi_QueryProcessInfo()

复制和初始化,调用Ioctl来进行数据初始化


SbieApi_Ioctl()

1. 初始化 "\\Device\\" SANDBOXIE L"DriverApi"对象

2. NtOpenFile-->DriverApi

3. 发送API_SBIEDRV_CTLCODE控制码

 

RunSandboxedGetToken()


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-7-16 15:03 被一半人生编辑 ,原因:
收藏
免费 14
支持
分享
最新回复 (25)
雪    币: 1400
活跃值: (176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
表哥,word2016提示文件无法打开,内容有问题
2020-7-15 23:19
0
雪    币: 6064
活跃值: (12624)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
3
阿尔斯兰 表哥,word2016提示文件无法打开,内容有问题
我尝试了一下,文档正常,手机也可以查看
2020-7-16 06:45
0
雪    币: 407
活跃值: (1816)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

2020-7-16 09:14
0
雪    币: 10342
活跃值: (4545)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
建议转PDF,里面加一些声明什么的,做好知识产权保护,直接放docx容易被人拿去做盗版。
2020-7-16 09:20
0
雪    币: 25052
活跃值: (1028)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
修改下后缀名,.docx去掉x,即改为.doc再尝试打开试试
2020-7-16 09:23
0
雪    币: 23080
活跃值: (3432)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
7
楼主您好,您的文章质量较高,但是放在附件中会有两个问题:一是楼上的朋友们说的直接放docx容易被人拿去做盗版,不利于知识产权保护;二是无法被搜索引擎搜到,不利于知识的传播与学习。
有一个快速发帖的方法:将word文档另存为html,然后全部复制粘贴到编辑框中。
2020-7-16 10:13
0
雪    币: 1431
活跃值: (4413)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
8
suiyingjie 修改下后缀名,.docx去掉x,即改为.doc再尝试打开试试
太棒了,一直打不开刚好解决
2020-7-16 14:13
0
雪    币: 6064
活跃值: (12624)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
9
KevinsBobo 楼主您好,您的文章质量较高,但是放在附件中会有两个问题:一是楼上的朋友们说的直接放docx容易被人拿去做盗版,不利于知识产权保护;二是无法被搜索引擎搜到,不利于知识的传播与学习。 有一个快速发帖的方 ...
思考不周,感谢版主,虽然排版有些难堪已更新
2020-7-16 14:29
0
雪    币: 6064
活跃值: (12624)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
10
Willarcap 建议转PDF,里面加一些声明什么的,做好知识产权保护,直接放docx容易被人拿去做盗版。
感谢
2020-7-16 14:30
0
雪    币: 1821
活跃值: (1928)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
感谢分享!!!!!!
2020-7-16 14:43
0
雪    币: 40
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你好,请问vs2017用的什么版本wdk
2020-7-16 15:00
0
雪    币: 26245
活跃值: (63297)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
13
感谢分享~
2020-7-16 15:22
0
雪    币: 6064
活跃值: (12624)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
14
killerfive 你好,请问vs2017用的什么版本wdk
vs2017(141) + wdk7600
2020-7-16 18:55
0
雪    币: 491
活跃值: (3857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
表哥太强了,make一下  = =|
2020-7-16 19:04
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
请教一下,ida怎么得到switch语句的
2020-7-18 04:24
0
雪    币: 300
活跃值: (2472)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
mark
2020-7-20 10:41
0
雪    币: 12
活跃值: (773)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
lpc我记得不支持win10的那些app
2020-7-31 18:25
0
雪    币: 0
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢大佬分享!希望大佬继续更新。我现在也要研究这东西,希望可以相互交流
2020-8-8 17:52
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
大佬我想问一下,你有遇到过报错SBIE1402和SBIE1409错误吗?  我这边是提示templates.ini文件和sandboxie.ini文件找不到Nt Status Codes是C0000034 Object not found,但是我在其他目录下确实有这两个ini文件。非常感谢!
2020-12-9 15:53
0
雪    币: 239
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21

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

最后于 2020-12-25 09:26 被lyanl编辑 ,原因:
2020-12-15 09:26
0
雪    币: 3035
活跃值: (364)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
大佬膜拜
2020-12-20 23:01
0
雪    币: 178
活跃值: (391)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
你好,最近我也在研究sandboxie,请问要在沙盘中程序是在什么时候真正执行的呢,它的内存又是如何布局管理的?
2021-9-22 10:08
0
雪    币: 204
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
大佬膜拜
2022-5-31 21:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
大佬膜拜 
2023-5-30 17:24
0
游客
登录 | 注册 方可回帖
返回
//