#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虚拟机自动化脱壳的方法