- 浏览: 231448 次
- 性别:
- 来自: 北京
最新评论
-
film:
6510C10D FF15 B8170065 cal ...
crack vba protect password -
film:
我有新的的注册码和激活码
科来发布技术交流版6.8--->成功实现激活码注册机 -
lei511:
不错
加油
Ajax的工作原理
VC加载驱动
#include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h> #define DRIVER_NAME "123467" #define DRIVER_PATH "..\\HelloDDK.sys" //装载NT驱动程序 BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath) { /************************ 加载NT驱动的代码******************************* ① 调用OpenSCManager,打开SCM管理器.如果返回NULL,则返回失败,否则继续 ② 调用CreateService,创建服务,创建成功则转步骤 ⑥ ③ 用GetLastError的得到错误返回值 ④ 返回值为ERROR_IO_PENDING,说明服务已经创建过,用OpenService打开此服务. ⑤ 返回值为其他值, 创建武服务失败,返回失败. ⑥ 调用StartService开启服务 ⑦ 成功返回 ************************************************************************/ char szDriverImagePath[256]; //得到完整的驱动路径 GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL); BOOL bRet = FALSE; SC_HANDLE hServiceMgr=NULL;// SCM管理器的句柄 SC_HANDLE hServiceDDK=NULL;// NT驱动程序的服务句柄 //打开服务控制管理器 hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if( hServiceMgr == NULL ) { // OpenSCManager失败 printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { // OpenSCManager成功 printf( "OpenSCManager() ok ! \n" ); } //创建驱动所对应的服务 hServiceDDK = CreateService( hServiceMgr, lpszDriverName, // 驱动程序的在注册表中的名字 lpszDriverName, // 注册表驱动程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 SERVICE_KERNEL_DRIVER, // 表示加载的服务是驱动程序 SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值 SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值 szDriverImagePath, // 注册表驱动程序的 ImagePath 值 NULL, NULL, NULL, NULL, NULL); DWORD dwRtn; // 判断服务是否失败 if( hServiceDDK == NULL ) { dwRtn = GetLastError(); if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS ) { //由于其他原因创建服务失败 printf( "CrateService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { //服务创建失败,是由于服务已经创立过 printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" ); } // 驱动程序已经加载,只需要打开 hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS ); if( hServiceDDK == NULL ) { // 如果打开服务也失败,则意味错误 dwRtn = GetLastError(); printf( "OpenService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { printf( "OpenService() ok ! \n" ); } } else { printf( "CrateService() ok ! \n" ); } // 开启此项服务 bRet= StartService( hServiceDDK, NULL, NULL ); if( !bRet ) { DWORD dwRtn = GetLastError(); if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING ) { printf( "StartService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { if( dwRtn == ERROR_IO_PENDING ) { // 设备被挂住 printf( "StartService() Faild ERROR_IO_PENDING ! \n"); bRet = FALSE; goto BeforeLeave; } else { // 服务已经开启 printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n"); bRet = TRUE; goto BeforeLeave; } } } bRet = TRUE; // 离开前关闭句柄 BeforeLeave: if(hServiceDDK) { CloseServiceHandle(hServiceDDK); // 服务句柄 } if(hServiceMgr) { CloseServiceHandle(hServiceMgr); // SCM句柄 } return bRet; } // 卸载驱动程序 BOOL UnloadNTDriver( char * szSvrName ) { /************************* 卸载NT驱动的代码****************************** ① 调用OpenSCManager,打开SCM管理器,如果返回NULL,则返回失败,否则继续. ② 调用OpenService.如果返回NULL,则返回失败,否则继续 ③ 调用DeleteService卸载此项服务. ④ 成功返回. ************************************************************************/ BOOL bRet = FALSE; SC_HANDLE hServiceMgr=NULL;// SCM管理器的句柄 SC_HANDLE hServiceDDK=NULL;// NT驱动程序的服务句柄 SERVICE_STATUS SvrSta; // 打开SCM管理器 hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if( hServiceMgr == NULL ) { // 打开SCM管理器失败 printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { // 打开SCM管理器失败成功 printf( "OpenSCManager() ok ! \n" ); } // 打开驱动所对应的服务 hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS ); if( hServiceDDK == NULL ) { // 打开驱动所对应的服务失败 printf( "OpenService() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { printf( "OpenService() ok ! \n" ); } // 停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。 if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) ) { printf( "ControlService() Faild %d !\n", GetLastError() ); } else { // 打开驱动所对应的失败 printf( "ControlService() ok !\n" ); } // 动态卸载驱动程序。 if( !DeleteService( hServiceDDK ) ) { // 卸载失败 printf( "DeleteSrevice() Faild %d !\n", GetLastError() ); } else { // 卸载成功 printf( "DelServer:eleteSrevice() ok !\n" ); } bRet = TRUE; BeforeLeave: // 离开前关闭打开的句柄 if(hServiceDDK) { CloseServiceHandle(hServiceDDK); // 服务句柄 } if(hServiceMgr) { CloseServiceHandle(hServiceMgr); // SCM 句柄 } return bRet; } void TestDriver() { // 测试驱动程序 HANDLE hDevice = CreateFile("\\\\.\\HelloDDK", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if( hDevice != INVALID_HANDLE_VALUE ) { MessageBox(NULL,"SUCESSFULLY....ComeOn...","Yes",0); printf( "Create Device ok ! \n" ); } else { printf( "Create Device faild %d ! \n", GetLastError() ); MessageBox(NULL,"Faild...Fuckking...","No",0); } CloseHandle( hDevice ); } int main(int argc, char* argv[]) { UnloadNTDriver(DRIVER_NAME); // 加载驱动 BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH); if (!bRet) { printf("LoadNTDriver error\n"); return 0; } // 加载成功 printf( "press any to create device!\n" ); getch(); TestDriver(); // 这时候你可以通过注册表,或其他查看符号连接的软件验证。 printf( "press any to unload the driver!\n" ); getch(); // 卸载驱动 UnloadNTDriver(DRIVER_NAME); // if (!bRet) // { // printf("UnloadNTDriver error\n"); // return 0; // } system("pause"); return 0; }
以上是使用OpenSCManager创建驱动服务,下面介绍使用隐藏服务方式加载驱动服务。
====================================================================================================================================================
隐藏服务
驱动的加载一般有三种方式:
OpenSCManager
ZwLoadDriver
ZwSetSystemInformation
这里我们用ZwLoadDriver来加载驱动程序.便可以隐藏服务了,没试其他,冰刃和WSysCheck就看不到我们的服务了
摘链,注意加载驱动用ZwLoadDriver不要用OpenSCManager,否则如下图一样:
驱动代码比较简单
#include "ntddk.h" typedef unsigned long DWORD; typedef DWORD* PDWORD; typedef struct _DRIVER_DATA { LIST_ENTRY listEntry; DWORD unknown1; DWORD unknown2; DWORD unknown3; DWORD unknown4; DWORD unknown5; DWORD unknown6; DWORD unknown7; UNICODE_STRING path; UNICODE_STRING name; } DRIVER_DATA; VOID OnUnload( IN PDRIVER_OBJECT pDriverObject ) { DbgPrint("OnUnload called."); } NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING theRegistryPath ) {
DRIVER_DATA* driverData; driverData = *((DRIVER_DATA**)((DWORD)pDriverObject + 20)); if( driverData != NULL ) { *((PDWORD)driverData->listEntry.Blink) = (DWORD)driverData->listEntry.Flink; driverData->listEntry.Flink->Blink = driverData->listEntry.Blink; DbgPrint("Sucessfull.\n"); } pDriverObject->DriverUnload = OnUnload; return STATUS_SUCCESS; }
加载驱动后,我们用DbgView看到打出的Sucessfull就知道我们的驱动已经运行了...然后用冰刃的查看模块,服务..好像没什么动静...呵呵。
下面的图是用OpenSCManager加载驱动的效果....所以不要用OpenSCManager加载,用ZwLoadDriver加载,这样冰刃才查不出来
========================================================================================================================
再收藏一段代码:
#include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h> #define DRIVER_NAME "HelloDDK" #define DRIVER_PATH "..\\MyDriver\\MyDriver_Check\\HelloDDK.sys" //装载NT驱动程序 BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath) { char szDriverImagePath[256]; //得到完整的驱动路径 GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL); BOOL bRet = FALSE; SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄 SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄 //打开服务控制管理器 hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if( hServiceMgr == NULL ) { //OpenSCManager失败 printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { ////OpenSCManager成功 printf( "OpenSCManager() ok ! \n" ); } //创建驱动所对应的服务 hServiceDDK = CreateService( hServiceMgr, lpszDriverName, //驱动程序的在注册表中的名字 lpszDriverName, // 注册表驱动程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序 SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值 SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值 szDriverImagePath, // 注册表驱动程序的 ImagePath 值 NULL, NULL, NULL, NULL, NULL); DWORD dwRtn; //判断服务是否失败 if( hServiceDDK == NULL ) { dwRtn = GetLastError(); if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS ) { //由于其他原因创建服务失败 printf( "CrateService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { //服务创建失败,是由于服务已经创立过 printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" ); } // 驱动程序已经加载,只需要打开 hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS ); if( hServiceDDK == NULL ) { //如果打开服务也失败,则意味错误 dwRtn = GetLastError(); printf( "OpenService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { printf( "OpenService() ok ! \n" ); } } else { printf( "CrateService() ok ! \n" ); } //开启此项服务 bRet= StartService( hServiceDDK, NULL, NULL ); if( !bRet ) { DWORD dwRtn = GetLastError(); if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING ) { printf( "StartService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { if( dwRtn == ERROR_IO_PENDING ) { //设备被挂住 printf( "StartService() Faild ERROR_IO_PENDING ! \n"); bRet = FALSE; goto BeforeLeave; } else { //服务已经开启 printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n"); bRet = TRUE; goto BeforeLeave; } } } bRet = TRUE; //离开前关闭句柄 BeforeLeave: if(hServiceDDK) { CloseServiceHandle(hServiceDDK); } if(hServiceMgr) { CloseServiceHandle(hServiceMgr); } return bRet; } //卸载驱动程序 BOOL UnloadNTDriver( char * szSvrName ) { BOOL bRet = FALSE; SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄 SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄 SERVICE_STATUS SvrSta; //打开SCM管理器 hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if( hServiceMgr == NULL ) { //带开SCM管理器失败 printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { //带开SCM管理器失败成功 printf( "OpenSCManager() ok ! \n" ); } //打开驱动所对应的服务 hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS ); if( hServiceDDK == NULL ) { //打开驱动所对应的服务失败 printf( "OpenService() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { printf( "OpenService() ok ! \n" ); } //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。 if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) ) { printf( "ControlService() Faild %d !\n", GetLastError() ); } else { //打开驱动所对应的失败 printf( "ControlService() ok !\n" ); } //动态卸载驱动程序。 if( !DeleteService( hServiceDDK ) ) { //卸载失败 printf( "DeleteSrevice() Faild %d !\n", GetLastError() ); } else { //卸载成功 printf( "DelServer:eleteSrevice() ok !\n" ); } bRet = TRUE; BeforeLeave: //离开前关闭打开的句柄 if(hServiceDDK) { CloseServiceHandle(hServiceDDK); } if(hServiceMgr) { CloseServiceHandle(hServiceMgr); } return bRet; } void TestDriver() { //测试驱动程序 HANDLE hDevice = CreateFile("\\\\.\\HelloDDK", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if( hDevice != INVALID_HANDLE_VALUE ) { printf( "Create Device ok ! \n" ); } else { printf( "Create Device faild %d ! \n", GetLastError() ); } CloseHandle( hDevice ); } int main(int argc, char* argv[]) { //加载驱动 BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH); if (!bRet) { printf("LoadNTDriver error\n"); return 0; } //加载成功 printf( "press any to create device!\n" ); getch(); TestDriver(); //这时候你可以通过注册表,或其他查看符号连接的软件验证。 printf( "press any to unload the driver!\n" ); getch(); //卸载驱动 UnloadNTDriver(DRIVER_NAME); if (!bRet) { printf("UnloadNTDriver error\n"); return 0; } return 0; }
相关推荐
在本文中,我们将深入探讨如何在VC++(Visual C++)环境中实现动态加载驱动程序的示例。这个示例包含了驱动源代码以及VC++应用...总之,这个VC动态加载驱动的例子为深入学习Windows系统编程提供了一个宝贵的实践平台。
【VC 简单加载驱动源码】是一个关于在Visual C++环境下编译和加载Windows NT驱动程序的示例项目。这个项目对于初学者来说是一个很好的起点,因为它提供了清晰的代码注释,帮助理解驱动程序的基本工作原理。下面将...
2. **驱动加载**:根据指定的驱动文件路径,加载驱动程序到内存中。 3. **驱动卸载**:移除已注册的驱动,确保系统资源的释放。 4. **驱动调试**:提供调试接口,允许开发者跟踪驱动程序的执行过程,找出潜在问题。 ...
3. `驱动加载VC7`:这很可能是驱动加载工具的源代码文件,其中包含了实现驱动加载逻辑的C++源文件。开发者可以通过阅读和修改这些源代码来适应自己的需求,例如添加特定的驱动加载选项,或者优化加载过程。 在深入...
在压缩包中的文件“loadsys_veryhuo.com”可能是加载驱动程序的主程序或一个关键组件。根据命名习惯,这可能是一个可执行文件,用于执行驱动的加载和卸载操作。通常,驱动加载涉及到系统调用,如`CreateFile`、`...
在压缩包中的".SYS"文件是编译后的驱动程序文件,可以直接加载到操作系统中,而".INF"文件则是包含驱动安装信息的文本文件,指导Windows如何安装和配置驱动程序。安装这个“空白”的驱动程序,实际上是为了给开发者...
4. 签名验证:为了保证系统安全,Windows要求驱动程序必须经过数字签名才能加载。开发者需要获取证书并为驱动签名。 5. 调试技巧:驱动程序调试是开发过程中的重要环节,可以使用WinDbg这样的工具进行内核模式调试...
在LabVIEW端,利用LabVIEW的VI(Virtual Instrument)构建用户界面,通过LabVIEW的DLL导入功能,加载并调用VC编译生成的DLL。在LabVIEW中创建对应的VI,设计数据输入输出控件,实现与CAN卡驱动的交互。 为了确保...
总结来说,这个压缩包提供了一个针对初学者的VC开发WDM驱动的工具,它简化了驱动加载和卸载的过程,避免了INF文件的编写。对于想要学习驱动开发的个人来说,这是一份非常实用的资源,能够帮助他们快速入门并实践驱动...
最后,`自动加载驱动.exe`很可能是我们实际运行的自动安装程序,它整合了以上所有组件的功能,用于检测USB设备并自动执行驱动安装。而`wceusbsh.inf`则是一个设备信息文件,它包含了USB设备的描述、类信息和驱动程序...
在VC(Visual C++)环境中,动态加载ODBC是实现跨数据库操作的一种常见方法,特别是在开发需要灵活更换数据源的应用程序时。下面将详细介绍如何在VC中动态加载ODBC,并探讨相关知识点。 首先,了解ODBC的基本概念。...
在安装这些驱动时,用户通常需要将它们放置到macOS的系统扩展目录(/Library/Extensions)或者使用像Kext Utility这样的工具进行安装和加载。此外,为了确保安全性和稳定性,用户应该在安装前备份现有系统,并在操作...
在XP系统中,驱动程序通常需要签名以确保其来源可信,否则可能会在安装或加载时遇到问题。 5. **User-Mode 和 Kernel-Mode 的通信**:驱动程序运行在Kernel-Mode,而应用程序运行在User-Mode。两者之间的通信通常...
1. 设备识别:驱动程序能够识别出连接到计算机的摄像头型号,确保操作系统能够正确地加载相应的驱动程序。 2. 图像采集:驱动程序处理摄像头捕获的原始数据,将其转化为数字图像,供用户或应用程序使用。 3. 视频...
- 对于内核模式驱动,Windows系统要求驱动必须经过数字签名才能加载。在VC6中编译后,可能需要使用额外工具如SignTool进行签名操作。 7. **调试驱动** - 使用调试器如WinDbg进行驱动调试,设置内核模式调试,连接...
3. **注册驱动程序**:在系统启动时加载驱动程序,并将驱动程序的入口点告诉操作系统。 4. **调试和测试**:在实际硬件上进行详尽的测试,确保驱动程序在各种情况下都能正确工作。 压缩包中的"光驱控制程序"很可能...
用VC6或其工具编写驱动程序,并用编译器编译出XXX.sys文件。 二、编写操作这个驱动程序的应用程序 用VC6编写一个操作驱动程序的应用程序,并产生AAA.exe文件。 三、用DriverMonitor把XXX.sys加载上 打开...
在本压缩包中,"USB.rar_EZ-USB驱动_usb_vc_vc USB" 提供了EZ-USB驱动程序以及与之相关的Visual C++ (vc) 工程文件,这将帮助开发者理解并实现USB设备的控制。 EZ-USB是一种由Cypress Semiconductor公司开发的USB...