对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值