• 安防工具简单用

    2007-12-29

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/liuyanghejerry-logs/12917970.html

    安防工具简单用

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

    分享到: