392064393 发表于 2011-7-30 00:06:12

驱动加载的一些问题

在exe里面加载作为资源载入的驱动sys

例如资源隶属于SYSID为IDR_SYS

如何加载? 哪位大哥能附上代码或者例子

越简单越好   谢了:)

Tesla.Angela 发表于 2011-7-30 00:26:07

好吧,哥帮你吧。
不过你的问题和系统底层没有任何关系,是WINDOWS编程的基本常识。
BOOL ReleaseCustomResource(WORD id, LPSTR Type, LPSTR OutputPath)
{
        //定位我们的自定义资源,这里因为我们是从本模块定位资源,所以将句柄简单地置为NULL即可
        HRSRC hRsrc = FindResourceA(0, MAKEINTRESOURCEA(id), Type);
        if (NULL == hRsrc)
                return FALSE;
        //获取资源的大小
        DWORD dwSize = SizeofResource(NULL, hRsrc);
        if (0 == dwSize)
                return FALSE;
        //加载资源
        HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
        if (NULL == hGlobal)
                return FALSE;
        //锁定资源
        LPVOID pBuffer = LockResource(hGlobal);
        if (NULL == pBuffer)
                return FALSE;
        //输出资源
        BOOL bRt = FALSE;
        FILE* fp = fopen(OutputPath, "wb");
        if (fp != NULL)
        {
                if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))
                        bRt = TRUE;
                fclose(fp);
        }
        FreeResource(hGlobal);
        return bRt;
}

392064393 发表于 2011-7-30 08:26:32

哥   重要的不是释放资源   而是如何释放后加载驱动

ywledoc 发表于 2011-7-30 13:57:24

392064393 发表于 2011-7-30 08:26 static/image/common/back.gif
哥   重要的不是释放资源   而是如何释放后加载驱动

你是要普通的加载?还是要过主防的加载?

Tesla.Angela 发表于 2011-7-30 21:54:01

392064393 发表于 2011-7-30 08:26 static/image/common/back.gif
哥   重要的不是释放资源   而是如何释放后加载驱动

这个就更容易了。既然文件已经释放了出来,直接用ZwLoadDriver就可以加载了。
直接百度搜索“使用zwloaddriver加载驱动”即可:
http://www.baidu.com/s?wd=%CA%B9%D3%C3zwloaddriver%BC%D3%D4%D8%C7%FD%B6%AF

392064393 发表于 2011-7-31 10:20:13

普通加载就OK了   去看看老大说的先

392064393 发表于 2011-7-31 11:26:38

解决了   谢老大了




// DriverTest.cpp : Defines the entry point for the application.
//

#include "stdafx.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, szDrvFullPath;
    LSA_UNICODE_STRING buf1;
    LSA_UNICODE_STRING buf2;
    int iBuffLen;
    HKEY hkResult;
    char Data;
    DWORD dwOK;
    iBuffLen = sprintf(szSubKey,"System\\CurrentControlSet\\Services\\%s",szDrvName);
    szSubKey=0;
    dwOK = RegCreateKey(HKEY_LOCAL_MACHINE,szSubKey,&hkResult);
    if(dwOK!=ERROR_SUCCESS)
      return false;
    Data=1;
    Data=0;
    Data=0;
    Data=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=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=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=0;
    //删除注册表项
    RegDeleteKey(HKEY_LOCAL_MACHINE,szSubKey);
    iBuffLen=sprintf(szSubKey,"%s%s\\Security","System\\CurrentControlSet\\Services\\",szDrvName);
    szSubKey=0;
    RegDeleteKey(HKEY_LOCAL_MACHINE,szSubKey);
    iBuffLen=sprintf(szSubKey,"%s%s","System\\CurrentControlSet\\Services\\",szDrvName);
    szSubKey=0;
    RegDeleteKey(HKEY_LOCAL_MACHINE,szSubKey);
    iBuffLen=sprintf(szSubKey,"\\\\.\\%s",szDrvName);
    szSubKey=0;
    return true;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR   lpCmdLine,
                     int       nCmdShow)
{
        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");
       
    //注册驱动程序,驱动放到C盘根目录去,并且命名为hidedriver.sys
    LoadDriver("hidedriver", "C:\\hidedriver.sys");
       
        return 0;
}




Tesla.Angela 发表于 2011-8-1 16:30:35

naylon 发表于 2011-8-1 16:17 static/image/common/back.gif
我想要过主防的加载

只能无聊地说,社工法能过任何主防,任何HIPS无法防御。。。
我09年时常为加载驱动头痛,现在也懒的想这事了。。。

ywledoc 发表于 2011-8-1 18:01:28

naylon 发表于 2011-8-1 16:17 static/image/common/back.gif
我想要过主防的加载

同求哇~~{:1_114:}

ywledoc 发表于 2011-8-1 18:09:31

naylon 发表于 2011-8-1 18:04 static/image/common/back.gif
……深深地鄙视4F!

4F??????是什么东西?

Tesla.Angela 发表于 2011-8-4 22:05:06

ywledoc 发表于 2011-8-1 18:09 static/image/common/back.gif
4F??????是什么东西?

4F不就是4楼嘛。。。

ywledoc 发表于 2011-8-5 01:44:09

Tesla.Angela 发表于 2011-8-4 22:05 static/image/common/back.gif
4F不就是4楼嘛。。。

{:1_120:}问过了naylon。然后,觉得自己好奇心太重。我那个天。。。
页: [1]
查看完整版本: 驱动加载的一些问题