所以我正在玩Windows上的功能挂钩,一切都按预期工作。通过使用jmp指令和我的Hook函数的偏移量覆盖我的LoadLibrary指针指向的值,我可以在每次调用LoadLibrary时执行自己的代码。要覆盖内存中的字节,我显然需要更改特定内存的保护标志。虽然这很好但我得到了意想不到的结果。
VirtualProtect((LPVOID)originPointer, sizeof(char) * 5, PAGE_EXECUTE_READWRITE, &oldProtect);
这个地方
VirtualProtect((LPVOID)originPointer, 0, PAGE_EXECUTE_READWRITE, &oldProtect);
是我期望的工作
此
VirtualProtect((LPVOID)originPointer, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
明显失败
但是这个
declare @t table
(
Country VARCHAR(20),
percentage INT
)
declare @cnt int
INSERT INTO @T
VALUES('India',12),('USA',20),('Australia',15),('Quatar',12)
select @cnt = count(1)+1 from @t
;with cte
as
(
select
SeqNo = row_number() over(order by Country),
Country,
percentage
from @t
)
select
*
from cte c1
left join cte c2
on c1.seqno = (c2.SeqNo-@cnt/2)
and c2.SeqNo >= (@cnt/2)
where c1.SeqNo <= (@cnt/2)
我发现它也可以工作,即使我只更改了一个字节的保护。
有人可以解释为什么会有效吗?
答案 0 :(得分:2)
页面保护属性的粒度必须等于页面大小。 4096字节。如果您传递的地址恰好位于页面末尾附近,那么您永远不应该对您需要的大小撒谎,这应该是无聊的。