首页
社区
课程
招聘
[请教] 关于使用ZwSetSystemInformation加载驱动
发表于: 2007-6-26 09:17 6639

[请教] 关于使用ZwSetSystemInformation加载驱动

2007-6-26 09:17
6639
经常能够看到这样一段代码,通过使用ZwSetSystemInformation来加载驱动,不用写注册表:
#if (_MSC_VER < 1300)
  #pragma comment(linker,"/IGNORE:4078")
  #pragma comment(linker,"/OPT:NOWIN98")
#endif

#define WIN32_LEAN_AND_MEAN

//----------------------------------------------------------------
// standard headers
//----------------------------------------------------------------
#include <windows.h>
#include <stdio.h>

//----------------------------------------------------------------
// stuff not found in header files
//----------------------------------------------------------------
typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
#ifdef MIDL_PASS
    [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
#else // MIDL_PASS
    PWSTR Buffer;
#endif // MIDL_PASS
} UNICODE_STRING, *PUNICODE_STRING;

typedef long NTSTATUS;

#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

typedef
NTSTATUS
(__stdcall *ZWSETSYSTEMINFORMATION)(
            DWORD SystemInformationClass,
                        PVOID SystemInformation,
                        ULONG SystemInformationLength
);

typedef
VOID
(__stdcall *RTLINITUNICODESTRING)(
        PUNICODE_STRING DestinationString,
        PCWSTR SourceString   
);

ZWSETSYSTEMINFORMATION ZwSetSystemInformation;
RTLINITUNICODESTRING RtlInitUnicodeString;

typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE
{
UNICODE_STRING ModuleName;
} SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;

#define SystemLoadAndCallImage 38

//----------------------------------------------------------------
// the rest of our program
//----------------------------------------------------------------
bool load_sysfile();

void main()
{
        if(!load_sysfile())
        {
                printf("Failed to load \r\n");
        }
        else printf("Load OK!");
        getchar();
       
}

//----------------------------------------------------------------
// load a sys file as a driver using undocumented method
//----------------------------------------------------------------
bool load_sysfile()
{
        SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;

        WCHAR daPath[] = L"\\??\\C:\\AAA.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;
}

但是我测试了几个驱动,加载后经常蓝屏  
说是不能创建Device,我驱动里并未创建。谁能给我个不蓝屏的例子(最好是有一定功能的,呵呵,光一个DbgPrint似乎没说服力^_^),不胜感激

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
驱动里似乎不能用API HOOK,在调用被HOOK的API时,会出现蓝屏。

猜测是地址访问出错,页面不在内存中所致。

请各位高手不吝指教。
2007-6-26 16:12
0
游客
登录 | 注册 方可回帖
返回
//