首页
社区
课程
招聘
[求助]驱动卸载为什么会蓝屏啊 新手
发表于: 2013-3-25 20:03 4734

[求助]驱动卸载为什么会蓝屏啊 新手

2013-3-25 20:03
4734
#include "ntddk.h"
#include <windef.h>
#define INITCODE code_seg("INIT")
#define PAGECODE code_seg("PAGE")
#pragma  INITCODE

JMPCODE oldCode;    // 用来保存前5字节 以便恢复
PJMPCODE pcur;
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B)
{  
        ULONG cur,old;
        JMPCODE JmpCode;
       
        cur=GetNt_CurAddr();//A
        old=GetNt_OldAddr();//C
        if (cur!=old)
        {   
                //保存前5字节
                pcur = (PJMPCODE)(cur);    //初始化指针
                oldCode.E9 = pcur->E9;
                oldCode.JMPADDR = pcur->JMPADDR;
                JmpCode.E9=0xE9;
                JmpCode.JMPADDR=old-cur-5;
            
      
                __asm //去掉页面保护
                {
                        cli
                                mov eax,cr0
                                and eax,not 10000h
                                mov cr0,eax
                               
                }
                 
                pcur->E9 = 0xE9;
                pcur->JMPADDR = JmpCode.JMPADDR;

               
                __asm
                {
                        mov eax,cr0
                                or  eax,10000h
                                mov cr0,eax
                                sti
                 }
                    }

                   pDriverObject->DriverUnload=DDK_Unload;
                   return STATUS_SUCCESS;
}

#pragma PAGECODE
VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject)
{
  PDEVICE_OBJECT pDev;//用来取得要删除设备对象
  UNICODE_STRING symLinkName; //

__asm //去掉页面保护
                {
          cli
                  mov eax,cr0
                  and eax,not 10000h
                  mov cr0,eax
                  
                }

  pcur->E9 = oldCode.E9;
  pcur->JMPADDR = oldCode.JMPADDR;

  __asm //恢复页保护
  {
          mov eax,cr0
                  or  eax,10000h //or eax,not 0FFFEFFFFh
                  mov cr0,eax
                  sti
  }

  
  pDev=pDriverObject->DeviceObject;
  IoDeleteDevice(pDev); //删除设备
  
  //取符号链接名字
   RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");
  //删除符号链接
   IoDeleteSymbolicLink(&symLinkName);
KdPrint(("驱动成功被卸载...OK-----------")); //sprintf,printf
//取得要删除设备对象
//删掉所有设备
DbgPrint("卸载成功");
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 72
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
#pragma pack(1)

typedef struct _JMPCODE
{
        BYTE E9;
        ULONG JMPADDR;//88881234=B
}JMPCODE,*PJMPCODE;

#pragma pack()

结构体
2013-3-25 20:04
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
3
废话
你Hook了函数,卸载的时候就没有保证你的Hook函数没有被调用,如果你的函数正在被调用,你却把驱动模块卸载了,那等函数执行就直接OVER了。
2013-3-25 22:06
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这是郁金香的那个教程

#pragma  INITCODE

这一句,在视频里面他就说了,指代码运行以后就从内存释放掉
既然运行以后就释放掉了,卸载的时候就不存在内存里面了。。。所以就蓝屏了

你可以把这一句注释掉以后再去试试
2013-3-25 22:06
0
雪    币: 217
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
我也遇到过,还要用到的数据不要放在初始化段,放page段就好
2013-3-25 23:21
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
又见这句  #pragma  INITCODE
2013-3-26 09:47
0
雪    币: 1042
活跃值: (470)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
if (cur!=old)  如果当前函数地址跟原函数地址不相等才执行INLINE HOOK  ,如果没有,则不会,那你卸载肯定出错.
2013-3-27 09:19
0
游客
登录 | 注册 方可回帖
返回
//