驱动开发:内核层InlineHook挂钩函数
在上一章
《驱动开发:内核LDE64引擎计算汇编长度》
中,LyShark
教大家如何通过LDE64
引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook
函数挂钩其实与应用层一致,都是使用劫持执行流
并跳转到我们自己的函数上来做处理,唯一的不同的是内核Hook
只针对内核API
函数,但由于其身处在最底层
所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的,对于安全从业者来说学会使用内核挂钩也是很重要。
挂钩的原理可以总结为,通过MmGetSystemRoutineAddress
得到原函数地址,然后保存该函数的前15
个字节的指令,将自己的MyPsLookupProcessByProcessId
代理函数地址写出到原始函数上,此时如果有API被调用则默认会转向到我们自己的函数上面执行,恢复原理则是将提前保存好的前15个原始字节写回则恢复原函数的调用。
原理很简单,基本上InlineHook
类的代码都是一个样子,如下是一段完整的挂钩PsLookupProcessByProcessId
的驱动程序,当程序被加载时则默认会保护lyshark.exe
进程,使其无法被用户使用任务管理器结束掉。
// 署名权
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: me@lyshark.com
#include "lyshark_lde64.h"
#include
#include
#include
#pragma intrinsic(_disable)
#pragma intrinsic(_enable)
// --------------------------------------------------------------
// 汇编计算方法
// --------------------------------------------------------------
// 计算地址处指令有多少字节
// address = 地址
// bits 32位驱动传入0 64传入64
typedef INT(*LDE_DISASM)(PVOID address, INT bits);
LDE_DISASM lde_disasm;
// 初始化引擎
VOID lde_init()
{
lde_disasm = ExAllocatePool(NonPagedPool, 12800);
memcpy(lde_disasm, szShellCode, 12800);
}
// 得到完整指令长度,避免截断
ULONG GetFullPatchSize(PUCHAR Address)
{
ULONG LenCount = 0, Len = 0;
// 至少需要14字节
while (LenCount !process 0 0 lyshark.exe
PROCESS ffff9a0a44ec4080
SessionId: 1 Cid: 05b8 Peb: 0034d000 ParentCid: 13f0
DirBase: 12a7d2002 ObjectTable: ffffd60bc036f080 HandleCount: 159.
Image: lyshark.exe
*/
protect_eprocess = 0xffff9a0a44ec4080;
// Hook挂钩函数
head_n_byte = KernelHook(GetProcessAddress(L"PsLookupProcessByProcessId"), (PVOID)MyPsLookupProcessByProcessId, &original_address, &patch_size);
DbgPrint("[lyshark] 挂钩保护完成 --> 修改字节: %d | 原函数地址: 0x%p n", patch_size, original_address);
for (size_t i = 0; i DriverUnload = UnDriver;
return STATUS_SUCCESS;
}
运行这段驱动程序,会输出挂钩保护的具体地址信息;
使用WinDBG
观察,会发现挂钩后原函数已经被替换掉了,而被替换的地址就是我们自己的MyPsLookupProcessByProcessId
函数。
当你尝试使用任务管理器结束掉lyshark.exe
进程时,则会提示拒绝访问。
参考文献
文章作者:lyshark (王瑞)
文章出处:https://www.cnblogs.com/LyShark/p/16832244.html
版权声明:本博客文章与代码均为学习时整理的笔记,文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!
文章出处:https://www.cnblogs.com/LyShark/p/16832244.html
版权声明:本博客文章与代码均为学习时整理的笔记,文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!
转载文章请遵守《中华人民共和国著作权法》相关法律规定或遵守《署名CC BY-ND 4.0国际》规范,合理合规携带原创出处转载,如果不携带文章出处,并恶意转载多篇原创文章被本人发现,本人保留起诉权!
文章来源于互联网:驱动开发:内核层InlineHook挂钩函数
THE END
二维码