恢复SSDT驱动代码

易语言 2020-07-25 00:03:40

恢复SSDT驱动代码

_Read_IRP (Irp, pIRP, 32)
_Read_Int (pIrpStack, pIRP + 96, 4)
_Read_Int (驱动控制码, pIrpStack + 12, 4)
缓冲区 = Irp.AssociatedIrp
_Read_Int (uInSize, pIrpStack + 8, 4)
_Read_Int (uOutSize, pIrpStack + 4, 4)
.如果真 (驱动控制码 = 1996) ' 取SSDT当前地址
获取ring3传入的数据 (读, 缓冲区, 4) ' 读 = SSDT函数序号
a = 读内存 (Get_KeServiceDescriptorTable_Address () + 读 × 4)
memcpy (缓冲区, 取变量地址 (a), 4)
.如果真结束
.如果真 (驱动控制码 = 2012) ' 恢复SSDT钩子
获取ring3传入的数组 (写, 缓冲区, 8)
.如果真 (写 [2] ≠ 0) ' 写 [1] = SSDT函数序号 写 [2] = SSDT原始函数地址
写内存 (Get_KeServiceDescriptorTable_Address () + 写 [1] × 4, 写 [2])
.如果真结束

.如果真结束
.如果 (status = #STATUS_SUCCESS)
Irp.IoStatus.Information = uOutSize
.否则
Irp.IoStatus.Information = 0
.如果结束
Irp.IoStatus.Status = status
_Write_IRP (pIRP, Irp, 32)
IoCompleteRequest (pIRP, 0)
返回 (#STATUS_SUCCESS)