首页 > 其他分享 >2023驱动保护学习 -- 通过代码实现驱动卸载

2023驱动保护学习 -- 通过代码实现驱动卸载

时间:2023-03-26 11:05:40浏览次数:36  
标签:缓存 管理器 -- 句柄 卸载 sprintf 2023 驱动

一、卸载驱动源代码

BOOL UnloadDriver(const  char* 驱动名称)
{
  BOOL 返回值 = FALSE;
  SC_HANDLE 管理器句柄 = NULL;
  SC_HANDLE 驱动服务句柄 = NULL;
  SERVICE_STATUS 服务状态;
  char 缓存[256] = { 0 };
  管理器句柄 = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  if (管理器句柄 == NULL)
  {    
    sprintf_s(缓存, "nxyn:管理器句柄获取失败:%d\n",GetLastError());
    OutputDebugStringA(缓存);
    返回值 = FALSE;
    goto BeforeLeave;
  }
  else
  {
    
    sprintf_s(缓存, "nxyn:管理器句柄获取成功\n");
    OutputDebugStringA(缓存);
  }
  
  驱动服务句柄 = OpenServiceA(管理器句柄, 驱动名称, SERVICE_ALL_ACCESS);


  if (驱动服务句柄 == NULL)
  {
    sprintf_s(缓存, "nxyn:驱动服务句柄获取失败:%d\n", GetLastError());
    OutputDebugStringA(缓存);
    返回值 = FALSE;
    goto BeforeLeave;
  }
  else
  {
    sprintf_s(缓存, "nxyn:驱动服务句柄获取成功\n");
    OutputDebugStringA(缓存);


  }


  //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
  if (!ControlService(驱动服务句柄, SERVICE_CONTROL_STOP, &服务状态))
  {
    sprintf_s(缓存, "nxyn:停止驱动程序失败:%d\n", GetLastError());
    OutputDebugStringA(缓存);
  }
  else
  {
    sprintf_s(缓存, "nxyn:停止驱动程序成功\n");
    OutputDebugStringA(缓存);
  }
  //动态卸载驱动程序,删除服务  
  if (!DeleteService(驱动服务句柄))
  {
    //卸载失败
    sprintf_s(缓存, "nxyn:动态卸载驱动程序失败:%d\n", GetLastError());
    OutputDebugStringA(缓存);
  }
  else
  {
    //卸载成功
    sprintf_s(缓存, "nxyn:动态卸载驱动程序成功\n");
    OutputDebugStringA(缓存);
  }
  返回值 = TRUE;
BeforeLeave:
  //离开前关闭打开的句柄
  if (驱动服务句柄)
  {
    CloseServiceHandle(驱动服务句柄);
  }
  if (管理器句柄)
  {
    CloseServiceHandle(管理器句柄);
  }
  return 返回值;
}

二、添加头文件,申明函数

#pragma once
BOOL LoadDriver(const  char* 驱动名称, const  char* 驱动路径);
BOOL UnloadDriver(const  char* 驱动名称);

三、通过卸载按钮,实现卸载驱动

UnloadDriver("123");

四、卸载效果

2023驱动保护学习 -- 通过代码实现驱动卸载_缓存

标签:缓存,管理器,--,句柄,卸载,sprintf,2023,驱动
From: https://blog.51cto.com/u_15288375/6149920

相关文章

  • vue.js客服系统实时聊天项目开发(二十)vue项目框架目录结构
    在之前的文章里没有介绍vue项目的目录结构,现在来介绍一下Vue项目的目录结构通常如下:.|--public||--favicon.ico||--index.html|--src||--assets||......
  • ingress 出现302 问题
    ingress转发到一个pod时,请求全部为200,增加到两个pod时,返回码出现302.从ingressnginxpod上看,没有rewrite配置,通过日志查看确实302问题。基本上就是session或者co......
  • C# autofac 在Net6中的使用
    十年河东,十年河西,莫欺少年穷。学无止境,精益求精。准备如下工作:新建一个Net6 webApi项目,并在该项目中引入:  新建类库MyInterface和MyService,项目构造如下  接口如下:/......
  • C# Autofac 构造函数注入,属性注入,方法注入
    十年河东,十年河西,莫欺少年穷。学无止境,精益求精。新建一个控制台应用程序,如下构造: MyAutoFac层引入autofac版本V6.5接口层如下:namespaceMyInterface{publicinter......
  • C# Autofac简单用法
    十年河东,十年河西,莫欺少年穷学无止境,精益求精新建一个控制台程序,如下 MyAutoFac项目引用NugetautofacV6.5版本新建如下接口:publicinterface动物{void......
  • Yt-dlp
    目录Yt-dlp演示视频下载地址和下载方法使用方法小技巧示例链接Yt-dlp演示视频https://www.bilibili.com/video/BV1UT411d7e9/?vd_source=4134b92c3a7468ae0a22c27b16a3440f......
  • NFS启用UDP
    目录NFS启用UDP视频演示服务端的配置客户端的配置验证NFS启用UDP目标我们使用的NFS通常是NFSv3和v4NFSv2支持UDP传输,所以,我们想先配置NFSv2,然后再指定用UDP;视频演示https://......
  • Yt-dlp
    目录Yt-dlp演示视频下载地址和下载方法使用方法小技巧示例链接Yt-dlp演示视频https://www.bilibili.com/video/BV1UT411d7e9/?vd_source=4134b92c3a7468ae0a22c27b16a3440f......
  • 解决mac升级之后不可以ssh
    很多同学更新系统之后,使用这两者都会遇到一条报错,类似于:SSH(ssh:connecttohostlocalhostport22:Connectionrefused)我们之前出过一篇文章但是现在也不好用了怎......
  • HelloWorld之Java调用C++(JNI)
    JNI(JavaNativeInterface),通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。1、java新建类HelloWorld,并声明native方法,引入hello的dllpublicclassHel......