对360沙盒的驱动的一点逆向分析
主要内容:
一.360Box沙箱DriverEntry函数安装驱动过滤框架分析
二. 360Box沙箱注册表监控分析
三. 360沙箱文件系统监控分析
一.360Box沙箱DriverEntry函数安装驱动过滤框架分析
360Box沙箱的驱动入口代码如下所示,下面单步跟踪分析入口代码安装360对注册表、进程、文件系统等过滤函数的安装过程。从下代码可以看出,360Box安装过滤的顺序为
文件系统minifilter过滤(FltRegisterFilter 函数)->对power和create、open的hook函数(通过DriverObject的majorFunction)-> 安装360的注册表、进程过滤(sub_callhookport函数)->注册关机回调(IoRegisterShutdownNotification函数)
NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
。。。\\省略无关代码
\\检测hookport是否存在
callhookportret0x3ee();
\\初始化注册表路径
RtlCopyUnicodeString(&g_str_uni_registryPath, RegistryPath);
\\安装文件系统的minifilter过滤驱动,在FltOperationRegistration结构中包含过滤的irp
FltRegisterFilter(DriverObject, dword_3C45C, &dword_3ABCC);
\\设置过滤irp的开发、关闭、查询的派遣函数
DriverObject->MajorFunction[16] = (PDRIVER_DISPATCH)filter_irp_power; DriverObject->MajorFunction[0]= filter_irp_create_close;
DriverObject->MajorFunction[2] = filter_irp_create_close;
DriverObject->MajorFunction[14] =(PDRIVER_DISPATCH)filter_irp_query_security;
//开始minifilter文件过滤
FltStartFiltering();
\\安装360Box的注册表,进程等过滤函数,重点在这里
sub_callhookport(DriverObject);
IoRegisterShutdownNotification(g_DeviceObject);\\安装关机回调
}
一. 先跟踪FltRegisterFilter()函数看minifilter文件系统的过滤安装过程
FltRegisterFilter函数声明如下
NTSTATUS FltRegisterFilter(
_In_ PDRIVER_OBJECT Driver,
_In_ const FLT_REGISTRATION *Registration,
_Out_ PFLT_FILTER *RetFilter
);
在函数参数flt_registration类型中含有结构成员FLT_OPERATION_REGISTRATION *OperationRegistration;
这个成员是个数组,数组的每个成员类型为
typedef struct _FLT_OPERATION_REGISTRATION {
UCHAR MajorFunction;
FLT_OPERATION_REGISTRATION_FLAGS Flags;
PFLT_PRE_OPERATION_CALLBACK PreOperation;
PFLT_POST_OPERATION_CALLBACK PostOperation;
PVOID Reserved1;
} FLT_OPERATION_REGISTRATION, *PFLT_OPERATION_REGISTRATION;
其中的preOperation和postOpreration就是minifilter安装的对irp的pre和post,预处理和后处理的回调函数地址。
按此方法找到360Box对minifilter文件系统的回调函数包括
Filter_irp_system_Control_pre \\新加载卷的过滤安装
Filter_irp_system_controk_post
Filter_irp_system_create_pre \\ 对新建文件的过滤
Filter_irp_system_create_post
Irp_set_information_pre \\对复制、删除、剪切、重命名文件的过滤
二.安装360的注册表、进程过滤(sub_callhookport函数)
在改函数中主要代码如下:
LONG_PTR __stdcall sub_callhookport(int a1)
{
// 在hookport的360过滤框架的的原过滤链表中添加一个360沙盒的针对SSDT的过滤表
fun_Hookport_g_port_extension_v1_for_AddRule = (int (__stdcall *)(_DWORD))*((_DWORD *)devExt_hookport + 1);
sub_Add_filter_Function(0); //添加进程等非注册表的相关过滤函数
sub_Add_filter_Function_register_relate(0); //添加注册表相关的过滤函数
return PsSetCreateProcessNotifyRoutine(NotifyRoutine, 0);
}
在sub_callhookport函数的最后添加了PsSetCreateProcessNotifyRoutine(NotifyRoutine, 0);即创建进程的通知回调。
在DriverEntry函数的最后调用IoRegisterShutdownNotification
注册了系统的关机回调,至此,360box的所有注册框架就安装完了
二.360Box沙箱注册表监控分析
360沙盒的注册表监控过滤分为对注册表的增删改查的操作。对注册表的操作主要通过hook相关过滤函数,hook的目的就是沙盒内的应用程序运行时对系统的注册表没有任何影响。对注册表的过滤主要hook了ZwCreateKey,ZwDeleteKey,ZwDeleteValueKey,ZwRenameKey,ZwSetValuekey,ZwQueryValueKey,
ZwEnumerateValueKey,ZwQueryKey,ZwEnumerateKey 九个注册表相关的过滤函数.
在360box沙箱中创建了两个注册表项,如图所示
其中S项用于存储沙箱中的应用程序新建的和修改过的注册表项,T项用于存储沙箱中的应用程序删除过的注册表项,所有对注册表的修改的过滤函数中,都会先进行一步路径过滤的操作,比如修改一个注册表项,360沙箱会hook ZwSetValueKey一个
[HKEY_LOCAL_MACHINE\SOFTWARE\test]
"fei"="dword:8"
360沙盒会修改新建的表项路径为
[HKEY_USERS\360SandBox\S\Registry\Machine\Software\test]
然后将此路径传递到系统本身的ZwSetValueKey函数中进行修改被改过的注册表项。
逆向sub_filter_ZwSetValueKey这个hook函数代码如下
注释中的值为windbg单步跟后得到的参数值。
int __stdcall sub_filter_zwsetvaluekey(int array_index, int FirstParameter_address_in_Stack, int &addr_func_callBack_parameter, int &filter_result)
{
…
//创建过滤的注册表路径
uni_dest_uni_registry = (const UNICODE_STRING *)sub_generate_360sandboxAndMyRegistryPath( addr_New_valuename.buffer,(int)Object, &Lookaside.L.ListHead);
// 存在已存在的键名和不存在该键名的分开处理
sub_2C10B( v15, uni_dest_uni_registry,(int)Object, (LSA_UNICODE_STRING *)&addr_new_valuename,*(_DWORD *)(handle + 8), *(_DWORD *)(handle + 12), *(const void **)(handle + 16),*(_DWORD *)(handle + 20));
在产生过滤后的注册表路径后,传入函数sub_2c10b进行处理
逆向sub_2c10b后的代码为
int __stdcall sub_2C10B()
{
//检测应用层传入的键值是否可读
ProbeForRead(addr_data, DataSize, 1u);
// 如果真实注册表中不存在该键名 ,是否被删过 }
if ( RtlEqualUnicodeString(uni_ValueName, &stru_uni_symbolicLinkValue, 1u) )
{
//为键名”fei”分配空间
(WCHAR *)ExAllocatePoolWithTag(PagedPool, var_datasize + 2, 0x70746B6Cu);
…
//初始化将要添加在注册表项前面的注册表过滤路径
//\Registry\User\360SandBox
RtlInitUnicodeString(&DestinationString, L"\\Registry\\User\\360SandBox");
//检查被测路径中是否已经包含了360sandbox的注册路径前缀,已经有,就不再创建
if ( RtlPrefixUnicodeString(&DestinationString, &String2, 1u))
{
ExFreePoolWithTag(String2.Buffer, 0);
}
//根据新的路径创建注册表
v12 = sub_238E0(
v22 + 12 * (v23 + 1),
HANDLE_FLAG_INHERIT,
uni_ValueName,
TitleIndex,
6u,
KeyHandle.Buffer,
KeyHandle.Length);
} if ( !RtlEqualUnicodeString((PCUNICODE_STRING)(v22 + 12 * (v23 + 1)), uni_dest_uni_registry, 1u) )
{
// equal比较的前者指向test在360sandbox中的路径,至此路径过滤创建完成
}
注册表的修改即如上所分析的操作,创建和删除过程同上。但是删除的过滤路径时将路径写到S项下,每次打开注册表时,先遍历S项的注册表项,如果没有被删,则可以打开。
三.360沙箱文件系统监控分析
360文件系统的监控操作通过minifilter来过滤.360Box对minifilter文件系统的回调函数包括
Filter_irp_system_Control_pre \\新加载卷的过滤安装
Filter_irp_system_controk_post
Filter_irp_system_create_pre \\ 对新建文件的预处理过滤
Filter_irp_system_create_post \\新建文件的后处理过滤
Irp_set_information_pre \\对复制、删除、剪切、重命名文件的过滤
对power和create、open的irp的派遣函数()
这个过滤是在DriverEntry函数中
DriverObject->MajorFunction[16] = (PDRIVER_DISPATCH)filter_irp_power;\\过滤irp
DriverObject->MajorFunction[0]= filter_irp_create_close;
DriverObject->MajorFunction[2] = filter_irp_create_close;
DriverObject->MajorFunction[14] =(PDRIVER_DISPATCH)filter_irp_query_security;
文件过滤分为对文件的新建、拷贝、删除、剪切、修改、读取的过滤操作。
一. 360沙箱的过滤原理是对文件的新建,将新建文件到目标路径所在卷的360SandBox目录路径下,如下图所示。
对minifilter文件创建的pre回调前,修改目标文件的路径,比如原始的创建文件路径为
\Device\HarddiskVolume1\WINDOWS\Prefetch\TEST360BOXWRITEFILE.EXE
修改后的路径为在\Device\HarddiskVolume1\的后面加上360SANDBOX\SHADOW,
变为\Device\HarddiskVolume1\360SANDBOX\SHADOW\WINDOWS\Prefetch\TEST360BOXWRITEFILE.EXE
然后将此路径传到系统原来的ZwCreateFile中,创建文件。
逆向这个创建的pre回调函数如下
int __cdecl sub_filter_targetFilePath()
{
。。。
//得到当前进程的句柄
PsGetProcessId(var_PEPROCESS);
//通过句柄到的文件路径
sub_getFilePathByHandle_parent2(var_current_process_handle);
if ( GenericMapping_readWriteExecAll)
{
//判断新建文件的属性,是读写还是可执行等。
p_generic_mapping = IoGetFileObjectGenericMapping();
}
// 在此下断点
if ( (unsigned int)var_uni_String1.Buffer & 1 )
{
//为新建路径分配空间
*(_DWORD *)&v102[1] = sub_allocatepool_filled_sourcestring(pflt_conTEXT_returnedContext2, 0, 0);
//判断目标路径中是否包含360沙箱的前缀
sub_IsUniStringInclude360SandBoxPrefix2()
。。。
//在文件路径中添加360sandbox\shadow
sub_appendPath_360sandbox_shadow();
FltSetCallbackDataDirty(pflt_callback_data4); //修改后路径,通知minifilter
从代码中可以看出路径的添加在sub_appendPath_360sandbox_shadow函数中,
逆向这个函数代码,可以得出,文件的路径通过三次RtlAppendUnicodeStringToString函数,先后将文件的卷标和360shadow,文件在卷中的路径,文件名添加到最终路径中。
二.对文件的删除,剪切,复制,重命名是通过一个过滤函数Irp_set_information_pre,对irp的set information的pre回调,核心是文件的删除,因为剪切是对原文件删除后,在新的路径中创建一个新文件。文件删除的过滤规则如下
真实机 沙箱回收站(注册表记录) 沙箱目录 结果
有 有 无 已被删,返回无法删除
有 有 有 删除后,新建了同目录文件,返回删除
有 无 有 沙箱修改过,删除沙箱文件
有 无 无 将真实文件拷贝到360box回收站内,返回删除成功。
无 无 有 沙箱新建的,删除沙箱文件
无 无 无 不存在的文件,返回无法删除--
无 有 无 沙箱里面已被删除的文件,返回无法删除
无 有 有 已被删,但又新建的文件,删除沙箱文件
过滤的规则主要在Irp_set_information_pre函数,即对文件修改,包括复制、剪切、重命名的预处理函数中。上表的规则含义,比如第一行,当真实机存在被删文件,回收站中也有被删文件的路径,则当沙箱目录中没有这个文件时,这个文件应该是之前被删除了,返回无法删除.
文件删除过滤的Irp_set_information_pre过滤函数代码逆向如下,被实验测试的上述表格第四项,即真实机中有,沙箱目录没有,然后沙箱回收站中没有的情况
int __stdcall filter_irp_set_information_pre(int pflt_callback_data, int pcflt_related_objects, int pCompletionContext)
{
//获取被删文件的相关路径
FltGetDestinationFileNameInformation();
//取得被删文件名
FltParseFileNameInformation(var_pflt_file_name_information);
//将真实文件拷贝到360沙箱的回收站中
sub_copyRealFileTo360SandBoxRecycleBin()
通过上述伪代码可以看出,文件的拷贝操作在sub_copyRealFileTo360SandBoxRecycleBin函数中,在该文件中,将真实文件拷贝到360沙箱的回收站中,逆向该函数得到
signed int __cdecl sub_copyRealFileTo360SandBoxRecycleBin() {
//下面判断文件是否含有360沙盒的路径,即是否在沙盒中的文件
sub_IsFileNameInclude360sandboxPrefiex()
//在文件路径添加360sandbox_shaow路径
sub_appendPath_360sandbox_shadow(;
sub_20ED3();
//执行完此函数,路径就变为真实机中的文件被删后的路径
FltSetInformationFile(
*(_DWORD *)(pcflt_related_objects + 12),
*(_DWORD *)(pcflt_related_objects + 16),
var_P_fileInformation,
length,);// fileinformation_class_rename重命名
}
其中var_p_fileInformation指向\Device\HarddiskVolume1\360SANDBOX\SHADOW\RECYCLER
\S-1-5-21-2000478354-73586283-1606980848-500\Dc4.txtEST",这个FltSetInformationFile函数
是删除的主要操作,即将沙盒内的文件重命名到360沙盒的回收站内,同时,在注册表内创建被删文件的注册表项,以便下次删除或打开时查询是否被删除,如图
--写于2014-1-19
对360沙盒的驱动的一点逆向分析相关推荐
- linux沙盒机制6,详解Android应用沙盒机制
前言 Android使用沙盒来保护用户不受恶意应用的侵害,同时也将应用隔离开来,防止他们互相访问其数据,本文主要对Android应用沙盒中的几种技术做简要的总结. 一.Android应用DAC沙盒 稍 ...
- 恶意软件的沙盒规避技术
恶意软件的沙盒规避技术 欢迎访问本人博客: https://www.xuanworld.top/ 摘要 恶意软件的沙盒技术目前广泛应用于网络安全的公司以及各类软件市场,沙盒可以探测到软件的各种行为 ...
- 由 GPT 驱动的沙盒,尽情发挥想象力! #NovelAI
一个由 GPT 驱动的沙盒,供用户尽情发挥想象力的空间,会获得怎样的体验? NovelAI NovelAI 是一项用于 AI 辅助创作.讲故事.虚拟陪伴的工具.NovelAI 的人工智能算法会根据用 ...
- CobaltStrike木马artifact.exe规避火绒,360,node32沙盒的方法分析
最近发现一个奇怪的现象,我用CobaltStrike直接生成一个裸奔测试后门artifact.exe 然后使用火绒扫描,火绒居然没有直接查杀 自己上线自己 按理说这种被渗透人员大量使用的后门,不管它原 ...
- App应用双开技术,Android沙盒
> App应用双开(多开)技术 微信分身,微信多开,微信双开- http://blog.csdn.net/yunajie/article/details/50894488 Android应用分身 ...
- android手机沙盒作用,Android手机沙盒
1.什么是沙盒? 沙盘英文名sandbox,也叫沙箱,顾名思义可以看做是一种容器,里面所做的一切都可以推倒重来,军事上常用沙盘来进行一些战争区域的地形模拟,这个你见过吧?不用了可以把沙子推平重来. 我 ...
- 关于SDC沙盒源代码加密
关键词:SDC沙盒. SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒.SDC沙盒 ...
- 驳斥《沙盒用于数据防泄密是重大技术原理性失误》
驳斥<沙盒用于数据防泄密是重大技术原理性失误> 最近网上出现了一篇名为<沙盒用于数据防泄密是重大技术原理性失误>的文章,经作者鉴定,是某不良公司***技术领先的竞争对手苏州深信 ...
- 再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸
作者:蒸米 0x00 序 Ian Beer@google发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],chenliang@keenlab也发表了关于Tripl ...
最新文章
- H国的身份证号码(搜索)
- python 模板引擎 对比_Python Web开发模板引擎优缺点总结
- 线上飙升800%,load达到12的解决过程
- Windows10怎么创建后门?
- 一篇文章,了解清楚路由器的各种组网
- python第七天--字符串的方法与注释
- mysql之group_concat函数
- 牛客15324 用来作弊的药水
- mysql创建全文索引
- 庆祝西安.NET俱乐部成立,请申请加入的朋友在这里报到
- 小米手机鸿蒙开机动画,华为“鸿蒙”来了!开机动画美炸了,用PPT一分钟就搞定...
- pid温度控制c语言程序,51单片机PID温度控制程序
- 架空线路的基本结构及组成
- 2020年阿里巴巴投资者大会集团CEO张勇演讲实录
- 如何使用KALI攻击“恶意网站“实验
- 智能ALMP封装推拉力测试机 剪切力强度测试仪器主要功能介绍
- [个人开发者赚钱五]植入广告等获取收益
- [2018 江苏省大学生程序设计大赛]JSCPC2018K. 2018 (测试数据范围有扩大)
- Python 股票分析入门
- fcpx快闪插件推荐,让视频片头片尾更动感