小弟来看雪时间也不短了,只是在看各位大大发帖,自己都没有奉献过。今天把自己原来逆向的一个sys分析和源码给拿出来。对金山安全卫士的一个bc.sys的驱动进行了逆向,并且用ida把大部分改成c代码
逆向只是供研究学习,无意侵犯版权。
附件 84648
附件 84649
附件中是bc.sys的文件和完整的分析的文字记录和代码分析,还有就是逆向的idb文件,我没从idb中把代码给导出来,各位童鞋就放ida里看吧。
先来介绍bc.sys是起啥作用的
BC据笔者的猜测是BootClean的意思。网上也有人曾说过金山还有一个类似的驱动是BootClean.sys。但是笔者电脑中没有此驱动,应该是其他产品所安装的。据此推断,其实bc就是bootclean,boot型驱动,开机即删除需要清除的文件,达到清除顽固病毒的目的。以下是金山官方对BootClean.sys模块的介绍:
主要的值得研究的有三点
第一、bc.sys和应用层通信是通过注册表读写并用二次异或的方式进行内容加密
第二、系统启动时候调用进行顽固文件的删除
IoRegisterBootDriverReinitialization(DriverObject, (PDRIVER_REINITIALIZE)DriverReinitializationRoutine, 0); BC.sys驱动是boot型驱动,boot类型的驱动程序是启动最早的驱动程序,在系统引导时就必须加载完毕,而对于注册为boot类型驱动的完成回调函数的函数,将会在所有的boot类型驱动执行完毕之后被调用一次,需要注意的是,这时候仍然是系统启动过程中比较早的时候。对于删除顽固病毒来说,在系统启动过程中比较早的时候进行删除效果是最好的。而IoRegisterBootDriverReinitialization正是boot驱动结束之后的回调函数,会在所有boot驱动完成之后运行,在这里对顽固病毒文件进行删除是一个比较好的时机。
Windows对文件删除的操作,第一步是发送一个请求打开文件,打开文件时必须设置为有删除的访问权限;如果打开失败,则直接导致无法删除文件。第二部是发出一个设置请求,表示这个文件将被删除。第三部是关闭文件,关闭时文件被系统删除。
一个文件被设置了“关闭时删除”属性之后,这个文件在关闭之前依然存在,但是对这个文件的大部分操作(比如写、读、查询等),都会返回一个“文件正在删除中”的错误。
不过,请注意这里的“删除”并非把文件删除到回收站。如果要测试删除,读者操作时务必需要按住Shift键彻底删除文件。文件删除到回收站只是一种改名操作。改名操作是另一种设置操作(FileInformationClass为FileRenameInformation,关于这个属性设置下面马上会讲到)。
在这个函数中调用的是BC_BootCleanRescueFile()。
删除文件使用的是BC_DeleteFileDevice()函数,在内核中删除文件相比应用层要轻松许多,因为权限是最大的。在内核中地址是\\??\\开头的,如\\??\\c:\\boot.ini等。删除文件使用的系统API是ZwSetInformationFile
。这个API中最后一个参数FileInformationClass如果是FileDispositionInformation,则说明文件在关闭的时候删除。这样可以有效防止别的进程正在占用此文件而无法删除的问题。这样的原理是在这个文件中设置一个状态,使用的仍是ZwSetInformationFile函数。
第三、关机时关停认为是需要杀掉的服务
下面是打包的附件供大家下载
BC逆向分析报告.pdf+BC.idb+BC.sys
逆向只是供研究学习,无意侵犯版权。
附件 84648
附件 84649
附件中是bc.sys的文件和完整的分析的文字记录和代码分析,还有就是逆向的idb文件,我没从idb中把代码给导出来,各位童鞋就放ida里看吧。
先来介绍bc.sys是起啥作用的
BC据笔者的猜测是BootClean的意思。网上也有人曾说过金山还有一个类似的驱动是BootClean.sys。但是笔者电脑中没有此驱动,应该是其他产品所安装的。据此推断,其实bc就是bootclean,boot型驱动,开机即删除需要清除的文件,达到清除顽固病毒的目的。以下是金山官方对BootClean.sys模块的介绍:
引用:
病毒程序通常会将自己的文件锁定以防止被杀软删除。抢杀模块BootClean.sys为毒霸安全产品专门针对此情况而开发的独有专利技术,该技术可以在系统启动早期对记录在清除列表中的文件进行彻底删除。此项中记录了毒霸抢杀模块的运行信息,包括删除病毒文件的路径、病毒名称、处理方式和处理结果等。
|
第一、bc.sys和应用层通信是通过注册表读写并用二次异或的方式进行内容加密
代码:
BOOL __stdcall BC_XorEncrypt(PUNICODE_STRING pData,UINT NumberByte, CHAR Key)
{
UINT i; // [sp+4h] [bp-4h]@1
for ( i = 0; i < NumberByte; ++i )
*(i + pData) ^= ( Key ^ (CHAR)0xBA );
return TRUE;
}
IoRegisterBootDriverReinitialization(DriverObject, (PDRIVER_REINITIALIZE)DriverReinitializationRoutine, 0); BC.sys驱动是boot型驱动,boot类型的驱动程序是启动最早的驱动程序,在系统引导时就必须加载完毕,而对于注册为boot类型驱动的完成回调函数的函数,将会在所有的boot类型驱动执行完毕之后被调用一次,需要注意的是,这时候仍然是系统启动过程中比较早的时候。对于删除顽固病毒来说,在系统启动过程中比较早的时候进行删除效果是最好的。而IoRegisterBootDriverReinitialization正是boot驱动结束之后的回调函数,会在所有boot驱动完成之后运行,在这里对顽固病毒文件进行删除是一个比较好的时机。
Windows对文件删除的操作,第一步是发送一个请求打开文件,打开文件时必须设置为有删除的访问权限;如果打开失败,则直接导致无法删除文件。第二部是发出一个设置请求,表示这个文件将被删除。第三部是关闭文件,关闭时文件被系统删除。
一个文件被设置了“关闭时删除”属性之后,这个文件在关闭之前依然存在,但是对这个文件的大部分操作(比如写、读、查询等),都会返回一个“文件正在删除中”的错误。
不过,请注意这里的“删除”并非把文件删除到回收站。如果要测试删除,读者操作时务必需要按住Shift键彻底删除文件。文件删除到回收站只是一种改名操作。改名操作是另一种设置操作(FileInformationClass为FileRenameInformation,关于这个属性设置下面马上会讲到)。
在这个函数中调用的是BC_BootCleanRescueFile()。
删除文件使用的是BC_DeleteFileDevice()函数,在内核中删除文件相比应用层要轻松许多,因为权限是最大的。在内核中地址是\\??\\开头的,如\\??\\c:\\boot.ini等。删除文件使用的系统API是ZwSetInformationFile
。这个API中最后一个参数FileInformationClass如果是FileDispositionInformation,则说明文件在关闭的时候删除。这样可以有效防止别的进程正在占用此文件而无法删除的问题。这样的原理是在这个文件中设置一个状态,使用的仍是ZwSetInformationFile函数。
第三、关机时关停认为是需要杀掉的服务
代码:
signed int __cdecl BC_DisableRescueDenyServ()
{
signed int flag; // [sp+8h] [bp-Ch]@1
KIRQL IRQL; // [sp+Fh] [bp-5h]@1
struct _LIST_ENTRY *pEntry; // [sp+10h] [bp-4h]@3
flag = 0;
IRQL = KfAcquireSpinLock(&SpinLock_RescueDenyServ);
if ( List_RescueDenyServ.Flink != &List_RescueDenyServ )
{
for ( pEntry = List_RescueDenyServ.Flink; pEntry != &List_RescueDenyServ; pEntry = pEntry->Flink )
{
if ( pEntry )
{
KfReleaseSpinLock(&SpinLock_RescueDenyServ, IRQL);
BC_Rtn_Unsuccess2((const wchar_t *)&pEntry[1]);
BC_Rtn_Unsuccess((const wchar_t *)&pEntry[1]);
IRQL = KfAcquireSpinLock(&SpinLock_RescueDenyServ);
}
}
flag = 1;
}
KfReleaseSpinLock(&SpinLock_RescueDenyServ, IRQL);
return flag;
}
BC逆向分析报告.pdf+BC.idb+BC.sys