安防工具简单用
其实安全工具需要给客户提供的不是自动的、傻瓜式的清除,而是关于系统的真实信息反馈和强劲的可操纵能力,杀软忽视了这点,结果只能在强大的Rookit前黔驴技穷了,这也正是我推荐这些工具的缘故了.
之前介绍的几款工具中,sreng和icesword虽然比较底层,但二者的可操作性都不够,功能也不够多,很多时候看到了可疑痕迹却没法下手,实在恼人.但单讲检测,二者还都是不错的,所以重点介绍Wsyscheck和syscheck、SRKit的一些重要功能.
Wsyscheck和syscheck在模式和功能上极其相似,但又略有差异.SRKit则和以上的工具差异稍大,功能上有不少亮点.
首先要说的是进程管理、服务管理、文件管理和注册表管理.在这4项中,Wsyscheck和syscheck、SRKit都做的不错,满足了一般的查杀要求,基本的模块分析、进程剖析都具备,而且还配备有禁止进/线程创建的功能,很大程度上防范了反复自启的病毒.
其次就是启动项了.在这方面,Wsyscheck和syscheck、SRKit全都可以实现干净利落的删除,超越了冰刃.不过大家在删除时一定要注意不要误删忠良,有些显卡、声卡有自己的调试程序,一旦删除了它们的启动项,后果就比较可怕了.
第三个,也是检验Rookit最重要的功能之一,即SSDT操作.我们切换到SSDT标签页,可以看到系统的SSDT都被列举出来了,被HOOK的SSDT则用红色着重显示.但什么是SSDT呢?这就牵扯Windows比较底层的过程了.Windows在处理事物时都会去参照一个表,比如在列举进程时,就会看看这个表是如何指向的,然后直接去调用相关的函数──个人看来,SSDT就是函数表,系统一旦要调用函数,都会按照函数表的指向去做.那么SSDT HOOK呢?恶意程序在骗取R0权限后就会去修改这张表,把指向正常的函数修改为指向自己捏造的函数.我们查看SSDT的目的就是去检测有没有程序篡改表的指向,比如NtQuerySystemInformation函数就是木马经常篡改的内容,篡改后即可实现隐藏进程,而NtTerminateProcess函数则可控制进程的结束.
这里鄙人在网上找到了一段HOOK了系统服务调用表中的NtOpenProcess函数的代码,作用是防止某进程被结束:
代码:
/*
演示HOOK系统服务调用表中的NtOpenProcess函数,防止需要保护的进程被杀掉
*/
#include<ntddk.h>
/*
KeServiceDescriptorTable仅有ntoskrnel一项,没有包含win32k,而且后面的两个字段都没有使用,所
以为了简便直接把SystemServiceDescriptorTable定义成SYSTEM_SERVICE_TABLE,免得访问多个结构体的
字段,麻烦.这里明白就行了.
*/
typedef struct _SystemServiceDescriptorTable
{
PVOID ServiceTableBase;
PULONG ServiceCounterTableBase;
ULONG NumberOfService;
ULONG ParamTableBase;
}SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;
// KeServiceDescriptorTable为ntoskrnl.exe导出
extern PSystemServiceDescriptorTable KeServiceDescriptorTable;
// 定义一下NtOpenProcess的原型,下面如果用汇编调用就不用定义了,但是我想尽量不用汇编
typedef NTSTATUS (__stdcall *NTOPENPROCESS)( OUT PHANDLE ProcessHandle,
IN ACCESS_MASK AccessMask,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId
);
NTOPENPROCESS RealNtOpenProcess;
// 定义函数原型
VOID Hook();
VOID Unhook();
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
// 真实的函数地址,我们会在自定义的函数中调用
ULONG RealServiceAddress;
// 需要被驱动保护的进程ID
HANDLE MyPID;
// 自定义的NtOpenProcess函数
NTSTATUS __stdcall MyNtOpenProcess( OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId )
{
NTSTATUS rc;
ULONG PID;
//DbgPrint( "NtOpenProcess() called.\n" );
rc = (NTSTATUS)(NTOPENPROCESS)RealNtOpenProcess( ProcessHandle, DesiredAccess,
ObjectAttributes, ClientId );
if( (ClientId != NULL) )
{
PID = (ULONG)ClientId->UniqueProcess;
//DbgPrint( "%d was opened,Handle is %d.\n", PID, (ULONG)ProcessHandle );
// 如果进程PID是1520,直接返回权限不足,并将句柄设置为空
if( PID == 1520 )
{
DbgPrint( "Some want to open pid 1520!\n" );
ProcessHandle = NULL;
rc = STATUS_ACCESS_DENIED;
}
}
return rc;
}
// 驱动入口
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath )
{
DriverObject->DriverUnload = OnUnload;
Hook();
return STATUS_SUCCESS;
}
// 驱动卸载
VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
Unhook( );
}
// 此处修改SSDT中的NtOpenProcess服务地址
VOID Hook()
{
ULONG Address;
// 0x7A为Winxp+SP2下NtOpenProcess服务ID号
// Adress是个地址A,这个地址的数据还是一个地址B,这个地址B就是NtOpenProcess的地址了
// (ULONG)KeServiceDescriptorTable->ServiceTableBase就是温家堡的第一个房间
// Address是第7A个房间.
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;
// 取得地址A的值,也就是NtOpenProcess服务的地址了,保存原来NtOpenProcess的地址以后恢
复用
RealServiceAddress = *(ULONG*)Address;
RealNtOpenProcess = (NTOPENPROCESS)RealServiceAddress;
DbgPrint( "Address of Real NtOpenProcess: 0x%08X\n", RealServiceAddress );
DbgPrint(" Address of MyNtOpenProcess: 0x%08X\n", MyNtOpenProcess );
// 去掉内存保护
__asm
{
cli
mov eax, cr0
and eax, not 10000h
mov cr0, eax
}
// 修改SSDT中NtOpenProcess服务的地址
*((ULONG*)Address) = (ULONG)MyNtOpenProcess;
// 恢复内存保护
__asm
{
mov eax, cr0
or eax, 10000h
mov cr0, eax
sti
}
}
//////////////////////////////////////////////////////
VOID Unhook()
{
ULONG Address;
Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;
__asm
{
cli
mov eax, cr0
and eax, not 10000h
mov cr0, eax
}
// 还原SSDT
*((ULONG*)Address) = (ULONG)RealServiceAddress;
__asm
{
mov eax, cr0
or eax, 10000h
mov cr0, eax
sti
}
DbgPrint("Unhook");
}
除了一般的SSDT HOOK,还有一种Inline-HOOK,Inline-HOOK并不修改函数指向,而是直接修改函数.这种技术没有专业底层的工具,是毫无办法的.
我们在SSDT被标红的位置仔细查看被改函数的功能(看那些英文,要不了什么高深的知识)和改函数的主题程序,就可以发现那些系统内部藏匿的邪恶.但是要注意,并非所有修改SSDT的程序都是恶意的,杀毒软件、防火墙、HIPS以及安全工具本身都依靠SSDT HOOK来确保自身的安全,比如NB的冰刃就动用了Inline-HOOK技术,使得普通的"结束进程"对它老人家毫无作用.观察仔细的人可能还会发现FSD的查看编辑功能,这里鄙人为了不把大家脑子搞晕,就不再解释了,各位在概念上知道FSD和文件过滤系统驱动有关就好.
下面要说的是Wsyscheck和syscheck提供的一项很有意思的功能,那就是:构筑安全环境.有时侯电脑中毒一时间还拿不准是什么病毒,也控制不住病毒的行为,那就使用安全环境吧!安全环境会在使用后结束掉所有非系统必须进程(除了工具本身),同时剔除所有非系统线程,清理内存、关闭磁盘自动播放,最后还会矫正SSDT、清理映像挟持.如此一来,再恶劣的病毒此刻也只得退出舞台了,现在再打开杀软进行清理,就会轻松许多,或者也可以利用这项功能抢救一些重要的文件.
对于端口和通信方面,上次推荐的软件都只能"看"而没法操作,所以这里再补上另一款工具:狙剑,在狙剑的功能当中,可以对每个端口进行通信的进程直接结束,这一点对付木马很有用.当然,在推荐的工具当中,狙剑的功能是最为强大的,几乎涵盖了上述其它工具的所有功能,但界面仍不够清晰,对于功夫还不是很深的使用者来说,容易造成重大误操作,因而平时还不是很推荐该工具.
另外要提一下的就是狙剑本身还具备对注册表的完全操作,即可以直接从系统进程内存中读写注册表,且操作是建立在去HOOK的基础上的,故很适合删除木马的启动项.
几款软件都还有一些很有用的功能,比如:活动文件操作、IE安全、IFEO劫持检测、Winsock/HOST修复、DOS删除、文件关联检测修复等,这些功能的易用性都很强,大家自己探索它们的用法吧!唯一要提醒的是,无论是手动杀毒也罢,优化系统也罢,一定要慎重操作,善于识别益类,否则重启后无法进入系统,就有你悔恨的了.