首页
论坛
课程
招聘
[原创]查找隐藏驱动
2007-4-8 20:13 25993

[原创]查找隐藏驱动

2007-4-8 20:13
25993
最近写了个小工具查找隐藏驱动,可以查找断开 PsLoadedModuleList 链的驱动,比如 np 的驱动。

下面是关键代码:

PDIRECTORY_BASIC_INFORMATION    pDriverBuffer = NULL;
pDriverBuffer = (PDIRECTORY_BASIC_INFORMATION)m_cSysInfo.QueryDirectoryObject(L"\\Driver", &uMemSize);

查找驱动对象目录下的所有对象,查找代码如下。

PVOID CNativeSysInfo::QueryDirectoryObject(PWSTR pwsDirPath, PULONG puMemSize)
{
    NTSTATUS            ntStatus;
    UNICODE_STRING      usDirPath;
    OBJECT_ATTRIBUTES   oa;
    HANDLE              hDir = NULL;
    PVOID               pBuffer = NULL;
    ULONG               uLength = 0x800;
    ULONG               uContext = 0;
    ULONG               uResult = 0;

    // 判断函数是否存在
    if(m_lpRtlInitUnicodeString == NULL ||
       m_lpZwOpenDirectoryObject == NULL ||
       m_lpZwQueryDirectoryObject == NULL ||
       m_lpZwClose == NULL)
    {
        return NULL;
    }

    // 打开目录对象
    m_lpRtlInitUnicodeString(&usDirPath, pwsDirPath);
    InitializeObjectAttributes(&oa, &usDirPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
    ntStatus = m_lpZwOpenDirectoryObject(&hDir, DIRECTORY_QUERY, &oa);
    if(ntStatus != STATUS_SUCCESS)
    {
        TRACE(_T("ZwOpenDirectoryObject failed!"));
        goto _exit;
    }

    // 查询目录对象
    do
    {
        if(pBuffer)
            VirtualFree(pBuffer, uLength, MEM_DECOMMIT);

        uLength *= 2;

        pBuffer = VirtualAlloc(NULL, uLength, MEM_COMMIT, PAGE_READWRITE);
        if(pBuffer == NULL)
            goto _exit;

        ntStatus = m_lpZwQueryDirectoryObject(hDir, pBuffer, uLength, FALSE, TRUE, &uContext, &uResult);

    } while(ntStatus == STATUS_MORE_ENTRIES || ntStatus == STATUS_BUFFER_TOO_SMALL);

    // 判断查询是否成功完成
    if(ntStatus == STATUS_SUCCESS)
    {
        if(puMemSize)
            *puMemSize = uLength;
    }
    else
    {
        VirtualFree(pBuffer, uLength, MEM_DECOMMIT);
        pBuffer = NULL;
    }

_exit:

    if(hDir)
    {
        m_lpZwClose(hDir);
        hDir = NULL;
    }

    return pBuffer;
}

然后把得到的结果和常规结果比较就可以找到隐藏驱动。隐藏驱动的相关信息可以通过下面的方式得到。

    PDRIVER_OBJECT          pDrvObject = NULL;

    RtlInitUnicodeString(&usDirPath, (PCWSTR)pvInBuf);
    ntStatus = ObReferenceObjectByName(&usDirPath,
                                       OBJ_CASE_INSENSITIVE,
                                       NULL,
                                       0,
                                       *IoDriverObjectType,
                                       KernelMode,
                                       NULL,
                                       (PVOID*)&pDrvObject);

有了 DRIVER_OBJECT 结构就啥都有了!:)

下面是一个隐藏驱动的例子,用上面的办法可以发现。

void _EraseDrvFromModList(PDRIVER_OBJECT pDrvObject)
{
    PLDR_DATA_TABLE_ENTRY   pOwen;
    PLDR_DATA_TABLE_ENTRY   pPrev;
    PLDR_DATA_TABLE_ENTRY   pNext;

    pOwen = (PLDR_DATA_TABLE_ENTRY)pDrvObject->DriverSection;
    pPrev = (PLDR_DATA_TABLE_ENTRY)pOwen->InLoadOrderModuleList.Blink;
    pNext = (PLDR_DATA_TABLE_ENTRY)pOwen->InLoadOrderModuleList.Flink;

    pPrev->InLoadOrderModuleList.Flink = (PLIST_ENTRY)pNext;
    pNext->InLoadOrderModuleList.Blink = (PLIST_ENTRY)pPrev;

    pOwen->InLoadOrderModuleList.Flink = (PLIST_ENTRY)pOwen;
    pOwen->InLoadOrderModuleList.Blink = (PLIST_ENTRY)pOwen;
}

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (15)
雪    币: 192
活跃值: 活跃值 (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9494 活跃值 2007-4-9 00:25
2
0
学习了,谢谢
雪    币: 8668
活跃值: 活跃值 (1108)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2007-4-9 08:37
3
0
无效~HideObject和断链(Typelist和moudlelist都断开了)都已经有了~

另外把IoDriverObjectType的copy了,之后重写自己的object_header~

嘿嘿~~

目前枚举驱动要用猥琐新技术~
内存FileObject和SectionObject查找~~
结合pe格式~
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
linestyle 活跃值 2007-4-9 09:03
4
0
顶一下心中的v大
雪    币: 521
活跃值: 活跃值 (151)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2007-4-9 13:12
5
0
支持猥琐
雪    币: 107
活跃值: 活跃值 (15)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 活跃值 19 2007-4-9 17:52
6
0
驱网牛人来了...
雪    币: 100
活跃值: 活跃值 (30)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
小喂 活跃值 5 2007-4-9 21:48
7
0
支持V大公开猥琐新技术~
雪    币: 246
活跃值: 活跃值 (11)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
Isaiah 活跃值 10 2007-4-10 04:16
8
0
有些驱动会把头也擦除了。防止RAW  Search
雪    币: 521
活跃值: 活跃值 (151)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2007-4-10 12:17
9
0
没有绝对可行的方法吗?

例如逆向系统的时间片分派的过程,看看系统是查找什么数据结构的?
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2007-4-10 16:01
10
0
听说某些大牛的玩具现在都是自己实现线程调度的。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scuCBJ 活跃值 2007-4-10 16:31
11
0
强哦,支持,学习了
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我最老实 活跃值 2007-4-10 17:22
12
0
老V的料就是新鲜 ;p 估计往后皆自带 loader
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
WisdomZh 活跃值 2007-4-10 19:03
13
0
越来越复杂了
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nuke 活跃值 2007-4-13 21:29
14
0
好东西需要顶~
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flyfoxqq 活跃值 2007-6-26 17:54
15
0
我现在正修改驱动,都这么优秀的人改的东西,我想再改真是郁闷啊!
雪    币: 121
活跃值: 活跃值 (30)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
老Y 活跃值 5 2007-6-26 20:09
16
0
UP, 不错的东西
游客
登录 | 注册 方可回帖
返回