记:
最近补给技术栈,旧笔记。
注入:
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,保存序号表索引和函数名。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-12-23 17:01
被一半人生编辑
,原因: