ZwLoadDriver加载驱动

建议用SCM加载驱动,这种是正常加载方式,稳定些,不容易bsod

#include <windows.h>
#include <stdio.h>

typedef struct _LSA_UNICODE_STRING {
     USHORT Length;
     USHORT MaximumLength;
     PVOID Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;

typedef LSA_UNICODE_STRING UNICODE_STRING, *PUNICODE_STRING;

// 申明ntdll中使用的函数
typedef DWORD (CALLBACK* RTLANSISTRINGTOUNICODESTRING)(PVOID, PVOID,DWORD);
RTLANSISTRINGTOUNICODESTRING RtlAnsiStringToUnicodeString;
typedef DWORD (CALLBACK* RTLFREEUNICODESTRING)(PVOID);
RTLFREEUNICODESTRING RtlFreeUnicodeString;
typedef DWORD (CALLBACK* ZWLOADDRIVER)(PVOID);
ZWLOADDRIVER ZwLoadDriver;

int LoadDriver(char * szDrvName, char * szDrvPath)
{
     //修改注册表启动驱动程序
     char szSubKey[200], szDrvFullPath[256];
     LSA_UNICODE_STRING buf1;
     LSA_UNICODE_STRING buf2;
     int iBuffLen;
     HKEY hkResult;
     char Data[4];
     DWORD dwOK;
     iBuffLen = sprintf(szSubKey,"System\\CurrentControlSet\\Services\\%s",szDrvName);
     szSubKey[iBuffLen]=0;
     dwOK = RegCreateKey(HKEY_LOCAL_MACHINE,szSubKey,&hkResult);
     if(dwOK!=ERROR_SUCCESS)
         return false;
     Data[0]=1;
     Data[1]=0;
     Data[2]=0;
     Data[3]=0;
     dwOK=RegSetValueEx(hkResult,"Type",0,4,(const unsigned char *)Data,4);
     dwOK=RegSetValueEx(hkResult,"ErrorControl",0,4,(const unsigned char *)Data,4);
     dwOK=RegSetValueEx(hkResult,"Start",0,4,(const unsigned char *)Data,4);
     GetFullPathName(szDrvPath, 256, szDrvFullPath, NULL);   
     printf("Loading driver: %s\r\n", szDrvFullPath);
     iBuffLen = sprintf(szSubKey,"\\??\\%s",szDrvFullPath);
     szSubKey[iBuffLen]=0;
     dwOK=RegSetValueEx(hkResult,"ImagePath",0,1,(const unsigned char *)szSubKey,iBuffLen);
     RegCloseKey(hkResult);
     iBuffLen = sprintf(szSubKey,"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%s",szDrvName);
     szSubKey[iBuffLen]=0;
     buf2.Buffer = (PVOID)szSubKey;
     buf2.Length = iBuffLen;
     RtlAnsiStringToUnicodeString(&buf1,&buf2,1);
     //加载驱动程序
     dwOK = ZwLoadDriver(&buf1);
     RtlFreeUnicodeString(&buf1);
     iBuffLen=sprintf(szSubKey,"%s%s\\Enum","System\\CurrentControlSet\\Services\\",szDrvName);
     szSubKey[iBuffLen]=0;
     //删除注册表项
     RegDeleteKey(HKEY_LOCAL_MACHINE,szSubKey);
     iBuffLen=sprintf(szSubKey,"%s%s\\Security","System\\CurrentControlSet\\Services\\",szDrvName);
     szSubKey[iBuffLen]=0;
     RegDeleteKey(HKEY_LOCAL_MACHINE,szSubKey);
     iBuffLen=sprintf(szSubKey,"%s%s","System\\CurrentControlSet\\Services\\",szDrvName);
     szSubKey[iBuffLen]=0;
     RegDeleteKey(HKEY_LOCAL_MACHINE,szSubKey);
     iBuffLen=sprintf(szSubKey,"\\\\.\\%s",szDrvName);
     szSubKey[iBuffLen]=0;
     return true;
}

int main(int argc, char *argv[])
{
     printf("Load driver with ZwLoadDriver( )\r\n");
     printf("Date: 8th May 2007\r\n");
     printf("Modifed by: GaRY <wofeiwo_at_gmail_dot_com>\r\n\r\n");
     if(argc != 3)
     {
         printf("Usage: %s <DriverFilename> <DriverPath>\r\n", argv[0]);
         exit(-1);
     }
     HMODULE hNtdll = NULL;
     hNtdll = LoadLibrary( "ntdll.dll" );
    
     //从ntdll.dll里获取函数
     if ( !hNtdll )
     {
         printf( "LoadLibrary( NTDLL.DLL ) Error:%d\n", GetLastError() );
         return false;
     }

     RtlAnsiStringToUnicodeString = (RTLANSISTRINGTOUNICODESTRING)
         GetProcAddress( hNtdll, "RtlAnsiStringToUnicodeString");
     RtlFreeUnicodeString = (RTLFREEUNICODESTRING)
         GetProcAddress( hNtdll, "RtlFreeUnicodeString");
     ZwLoadDriver = (ZWLOADDRIVER)
         GetProcAddress( hNtdll, "ZwLoadDriver");

     //注册驱动程序
     if(LoadDriver(argv[1], argv[2]) == false) return false;
     return true;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值