首页
社区
课程
招聘
[原创]Sandboxie循序渐进
发表于: 2020-12-23 16:43 9565

[原创]Sandboxie循序渐进

2020-12-23 16:43
9565

记:

最近补给技术栈,旧笔记。

注入:

Sandboxie注入方式回调处理数据发送至SbieSvc,Svc初始化Ldr,监控篇上描述了流程,下面分享一下处理细节。

Sandboxie并未直接再回调中处理,而是发送LPC注入信号至SbieSvC来完成,等待事件。

 

1. LowLevel是DLL项目,DriverAssist::InjectLow_InitHelper(ULONG *errlvl)初始化Helper将会获取资源DLL,保存节表,获取LdrInitializeThunk函数地址。

2. InjectLow_InitHelper负责加载Lowlevel.dll数据初始化ldr函数地址。


3. InjectLow_CopyCode负责填充lowdata.IdrInitalizeThunK_tramp


4. tramp_remote_addr构造.


5. LowDLl充当执行的shellcode,data_offset是初始化时候代码如下,这是获取的’zzzz’节表的入口点和数据大小:

6. 绑定

7. 拷贝系统数据缓冲到目标进程


8. 将低数据参数区域(包括转换后的蹦床代码)写入目标进程,并使其执行读取


9. 覆盖LdrInitializeThunk的顶部以跳转到注入的代码,请注意,我们必须跳过8字节签名(.HEAD.00)删除了对(.HEAD.00)的硬编码依赖性。 不再需要在remote_addr中添加8。    

10. 上述过程描述细节狠清楚,利用这种方式实现了注入


Sandboxie_HOOK_r3模板:

通用HOOK宏定义,入口SBIEDLL_HOOK函数实现,三要素:函数名/函数地址/HOOK函数地址。

r3的就不多说了,基于三要素简答方便管理一些,ANTSDLL_Hook返回的是原函数地址。

代码中有注释,主要对不同的机器码-call/jmp分别做了挂钩处理,对于跳转过去直接是汇编代码Hook,先申请一段内存,拷贝前几行指令到内存,Systemcall从申请的内存地址执行,跳转到挂钩的下一行即可。


DriverEntry:

 

1) Driver_CheckOsVersion

版本兼容,代码中对不同号版本结构偏移纪录。

2) Pool_Create

Pool_Alloc_Page封装了ExAllocatePoolWithTag申请内存池,最初申请了大小4096的内存池。

链表操作请看List.c文件,自实现的链表增删改查功能,这里主要是为页面bitmap初始化内存池。

 

3) Driver_InitPublicSecurity

代码初始化了Acl,申请128大小内存,初始化ACL,创建安全描述符,创建不同属性的安全描述符

保存路径注册键值

注册表获取路径,ObReferenceObjectByHandle获取FILE_OBJECT对象,查询标准路径,DOS/NT之间转换(obj.c里面实现了具体转换路径过程,包含了不同版本)。


4) Obj_Init()

初始化ObQueryNameInfo/ObGetObjectType函数地址。

 

5) Conf_Init()

Mem_GetLockResource申请内存,初始化资源变量。Conf_Init_User初始化事件EvEnt,设置API函数如下:

驱动初始化过程,还未安装SbieSvc服务,只是插入到对应的List中,等待SBieSvc启动调用。

DriverCoDe:API_SET_USER_NAME Api必须由sandboxie调用,做判断是否sandboxiepid进程调用:

IO系列函数创建Sandboxie.ini,读取Templates.ini,Conf_Read_Sections()检测参数调用Conf_Read_Settings()读取文件填充结构。

1. 初始化NtDll和User32定义了全局的static LIST Dll_List,初始化的DLL将会被链表全局记录。Dll_Load判断是否已初始化返回指针,反之Map映射。

ZwCreateFile(......,FILE_GENERIC_READ, \\SystemRoot\\System32\\xxx.dll,...);

 

ZwQueryInformationFile --> ZwCreateSection --> ZwMapViewOfSection

2. 获取DOS头和NT头,判断x64还是x32分别填充IMAGE_NT_HEADERS(32|64)结构体,保存DLL的Nt,入口点(IMageBase),大小(SizeOfImage),DataDirectory 地址。Dll_RvaToAddr转换导出表地址,保存至dll->exports,插入DLL链表。

 

6) Syscall_Init();

全局链表:

 

 

Syscall_Init_List()

初始化全局List,Syscall_List.从全局DLL_List链表中获取NTDll.dll(Zw系列函数),通过Dll_GetNextProc来获取导出表的 IAT-IOD-INT,保存序号表索引和函数名。


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

最后于 2020-12-23 17:01 被一半人生编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (5)
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2020-12-23 17:09
0
雪    币: 507
活跃值: (3867)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
感谢分享!
2020-12-24 08:41
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
nice
2020-12-24 10:10
0
雪    币: 239
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5

非常不错,谢谢分享 !

最后于 2020-12-25 09:22 被lyanl编辑 ,原因:
2020-12-24 19:35
0
雪    币: 1129
活跃值: (2761)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2020-12-24 20:00
0
游客
登录 | 注册 方可回帖
返回
//