VirtualProtect大小

时间:2017-12-07 11:07:51

标签: c++ pointers hook

所以我正在玩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)

我发现它也可以工作,即使我只更改了一个字节的保护。

有人可以解释为什么会有效吗?

1 个答案:

答案 0 :(得分:2)

页面保护属性的粒度必须等于页面大小。 4096字节。如果您传递的地址恰好位于页面末尾附近,那么您永远不应该对您需要的大小撒谎,这应该是无聊的。