首页
社区
课程
招聘
[求助]ring0下如何HOOK实现拦截驱动加载并获得映像基址
发表于: 2010-7-2 08:36 10624

[求助]ring0下如何HOOK实现拦截驱动加载并获得映像基址

2010-7-2 08:36
10624
ring3下hook LoadLibraryA拦截DLL载入,并且可以获得handle.
在内核中应如何hook才能拦截驱动加载,并获得driver object或者映像基址?
hook ZwLoadDriver能获取的信息好像只有驱动名。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
得到的是注册的服务名,然后查注册表就有了
2010-7-2 11:40
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
hook ZwLoadDriver,查注册表得到驱动名,然后ZwQuerySystemInformation~
2010-7-2 13:22
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
这是一个ring3的,可以改成驱动的:

#include "ntdll.h"
#include <stdio.h>
#pragma comment(lib,"ntdll.lib")

typedef struct _SYSTEM_MODULE_INFORMATION {
    ULONG   Reserved[2];
    PVOID   Base;
    ULONG   Size;
    ULONG   Flags;
    USHORT  Index;
    USHORT  Unknown;
    USHORT  LoadCount;
    USHORT  ModuleNameOffset;
    CHAR    ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

void main()
{
        NTSTATUS status = STATUS_SUCCESS;
        ULONG moduleNum,len,retLen;
        PSYSTEM_MODULE_INFORMATION module = NULL;
       
        HANDLE CurProc = GetCurrentProcess();
        PVOID buf=0;
       
        ZwQuerySystemInformation(SystemModuleInformation,NULL,0,&len);
        printf("len= %d\n",len);
       
        status=ZwAllocateVirtualMemory(CurProc,&buf,0,&len,MEM_COMMIT,PAGE_READWRITE);
        if (!NT_SUCCESS(status))
        {
                printf("allocate failed !\n");
                return;
        }
        status=ZwQuerySystemInformation(SystemModuleInformation,buf,len,&retLen);
        if (!NT_SUCCESS(status))
        {
                printf("query failed!\n");
                return;
        }
        module=(PSYSTEM_MODULE_INFORMATION)((PULONG)buf+1);//
        moduleNum    = *( ( PULONG )buf );//开头的是模块数
        printf("\n--------------------------------------------------------------------\n");
        for (int i=0;i<moduleNum;i++)
        {
                printf( "id:%3d\tbaseaddress:0x%08X\tmodulename:%12s\tsize:%7d\n",
                        i+1,
                        module->Base,
                        module->ImageName + module->ModuleNameOffset ,
                        module->Size
                        );
                module++;
        }
       
        printf("--------------------------------------------------------------------\n");
       
        ZwFreeVirtualMemory(CurProc,&buf,&len,MEM_RELEASE);
}
2010-7-2 13:23
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
hook NtCreateSection
2010-7-2 18:16
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谁知道驱动是哪一个进程加载的是怎么做的吗?
2010-7-2 18:41
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
标准的注册服务启动驱动的方式都是Services.exe完成的
2010-7-3 12:20
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
服务方式加载的是由Services.exe做的,最终是由Services.exe调用ZwLoadDriver
直接调用ZwLoadDriver/ZwSetSystemInformation加载的就是当前进程。。。
2010-7-3 13:05
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
PsSetLoadImageNotifyRoutine
2010-7-5 23:26
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
做个记号。以后用得到
2010-11-3 05:53
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
ZwLoadDriver--NtLoadDriver--IopLoadDriver--MmLoadSystemImage--NtCreateSection
服务加载的可以hookZwLoadDriver,SetSystemInformation的是直接调用MmLoadSystemImage的。
PsSetLoadImageNotifyRoutine只是Notify,告诉你驱动已经加载了而已。
2010-11-3 18:27
0
游客
登录 | 注册 方可回帖
返回
//