分享到新浪微博 分享到QQ空间 打印

[原创] 安防工具简单用

安防工具简单用

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


想死你们了!

TOP

比较简单,但是不好玩。
很多比较深的Hook都没提到。
谁不怀念苏联,谁就没有良心;谁想回到苏联,谁就没有头脑.

Woodu.ME--从零开始的博客生活

TOP

360安全卫士也算的吧
http://grps.bplaced.net/bbs/?u=7478

TOP

我很想T飞楼上。[
360这种垃圾。
谁不怀念苏联,谁就没有良心;谁想回到苏联,谁就没有头脑.

Woodu.ME--从零开始的博客生活

TOP

引用:
原帖由 Woodu 于 2007-12-29 06:21 PM 发表
比较简单,但是不好玩。
很多比较深的Hook都没提到。
提到那么多HOOK做什么,SSDT HOOK已经算是很NB的HOOK技术了,再深下去只能误人子弟——况且鄙人只知道这么点东西


想死你们了!

TOP