读书笔记_windows下的混合钩子(HOOK)_part 5_钩子的内存空间

本文探讨了用户空间钩子实现中的关键技术问题,特别是如何利用共享内存区域(KUSER_SHARED_DATA)在内核和用户空间间传递代码和数据。通过具体示例展示了如何在该区域部署简单的钩子函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

钩子的内存空间

用户空间的钩子的问题之一是为了编写LoadLibrary参数或编写代码,钩子通常必须在远程进程中分配空间。在内核中存在一个可写区域,它映射到每个进程的地址空间。另一个技术利用了两个虚拟地址映射到同一个物理地址这个事实。内核地址0xFFDF0000和用户地址0x7FFE0000都指向同义物理页面。该共享区域内核地址是可写的,但用户地址则不能写。利用MDL的方法可以将代码写到内核地址并以用户地址来访问它。

该共享区域的大小是4k,内核占用其中的一部分,但还可以使用大约3k的空间用于代码和变量。该内存区域的名称是KUSER_SHARED_DATA,以下是一个写入该区域的示例:

DWORD d_shareM = 0x7ffe0800; // A user Address

DWORD d_sharedK = 0xffdf0800; // A Kernel Address

Unsigned char new_code[]= {

0x90, // NOP make INT 3 to see

0xb8, 0xff, 0xff, 0xff,0xff, // move ax, 0xffffffff

0xff, 0xe0 // jmp eax

};

If ( !gb_Hooked )

{

RtlCopyMemory((PVOID)d_sharedK, new_code, 8);

RtlCopyMemory( (PVOID)(d_sharedK +2), (PVOID)&pd_IAT[index], 4);

gb_Hooked = TRUE;

}

第一字节是操作码,若希望观察行为,则使用NOP指令或INT3(break)指令,后续7个字节只是将一个哑地址移入EAX,然后跳转到该地址。此时钩子函数的编写者需要向内存中写入一个更高级的函数以便真正函数的输出进行过滤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值