百度首页 | 百度空间
 
查看文章
 
使用ZwLoadDriver加载驱动
2007-08-17 02:30

#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;
}


 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请输入下图中的四位验证码,字母不区分大小写。
看不清?
 

     

©2008 Baidu