安防工具简单用
						
						
																											其实安全工具需要给客户提供的不是自动的、傻瓜式的清除,而是关于系统的真实信息反馈和强劲的可操纵能力,杀软忽视了这点,结果只能在强大的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删除、文件关联检测修复等,这些功能的易用性都很强,大家自己探索它们的用法吧!唯一要提醒的是,无论是手动杀毒也罢,优化系统也罢,一定要慎重操作,善于识别益类,否则重启后无法进入系统,就有你悔恨的了.