首页
论坛
课程
招聘
[原创]内核模式下另类装载驱动
2008-4-7 12:57 15381

[原创]内核模式下另类装载驱动

HSQ 活跃值
8
2008-4-7 12:57
15381
收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bwin 活跃值 2008-4-7 13:20
2
0
学习一下。。。。
雪    币: 109
活跃值: 活跃值 (197)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-4-7 13:39
3
0
坐板凳学习了
雪    币: 201
活跃值: 活跃值 (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ffsj 活跃值 2008-4-7 14:05
4
0
这是一个母鸡与蛋的问题,因为他这个说明本身就是要从内核态加载一个驱动,那么这个启动源也得使用注册表来加载。
雪    币: 109
活跃值: 活跃值 (197)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-4-7 14:26
5
0
NtSetSystemInformation里面就是调用MmLoadSystemImage 来加载驱动的。
雪    币: 371
活跃值: 活跃值 (152)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
bzhkl 活跃值 5 2008-4-7 15:05
6
0
NtSetSystemInformation   装载驱动不稳定 有的时候我一开机 用这个加载下驱动 就会蓝 看了下书 可能是因为驱动驻留的内存被换出到磁盘上(page out),对他的任何访问都会蓝  下面是 书上的加载驱动的代码  

#include "stdafx.h"
#include "windows.h"
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

#define SystemLoadAndCallImage 38
typedef unsigned long NTSTATUS;
typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PVOID Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE
{
    UNICODE_STRING ModuleName;
} SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;
typedef DWORD (CALLBACK* ZWSETSYSTEMINFORMATION)(DWORD, PVOID, ULONG);
ZWSETSYSTEMINFORMATION ZwSetSystemInformation;
typedef DWORD (CALLBACK* RTLINITUNICODESTRING)(PUNICODE_STRING,PCWSTR );
RTLINITUNICODESTRING RtlInitUnicodeString;
typedef DWORD (CALLBACK* RTLANSISTRINGTOUNICODESTRING)(PVOID, PVOID,DWORD);
RTLANSISTRINGTOUNICODESTRING RtlAnsiStringToUnicodeString;
bool load_sysfile()
{
        SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;

        WCHAR daPath[] = L"\\??\\C:\\MIGBOT.SYS";

        //////////////////////////////////////////////////////////////
        // get DLL entry points
        //////////////////////////////////////////////////////////////
        if(        !(RtlInitUnicodeString = (RTLINITUNICODESTRING)
                        GetProcAddress( GetModuleHandle("ntdll.dll")
                        ,"RtlInitUnicodeString"
                        )))
        {
                return false;
        }

        if(!(ZwSetSystemInformation = (ZWSETSYSTEMINFORMATION)       
                                GetProcAddress(
                                        GetModuleHandle("ntdll.dll")
                                        ,"ZwSetSystemInformation" )))
        {
                return false;
        }

        RtlInitUnicodeString(
                &(GregsImage.ModuleName)
                ,daPath
        );

        if(
                !NT_SUCCESS(
                        ZwSetSystemInformation(
                                SystemLoadAndCallImage
                                ,&GregsImage
                                ,sizeof(SYSTEM_LOAD_AND_CALL_IMAGE))))
        {
                return false;
        }

        return true;
}
int main(int argc, char* argv[])
{
        printf("Hello World!\n");
        return 0;
}
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2008-4-11 09:16
7
0
既然都进了内核还用这么烦
自己Alloc内存,自己加载,自己填充个DriverObject得了
雪    币: 172
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gx_sz 活跃值 2008-4-11 09:38
8
0
是啊,搞的这么麻烦,还不如在内核里面加载一个DLL
使用APC或者Hook,将代码从内核转到上层。
雪    币: 204
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
letokmz 活跃值 2008-5-6 15:43
9
0
同感,关键不是进了内核之后怎么干,而是怎么进内核
雪    币: 203
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
reebox 活跃值 2008-6-11 10:28
10
0
学习一下,谢谢
游客
登录 | 注册 方可回帖
返回