首页
社区
课程
招聘
[求助]VirtualProtectEx函数修改内存值时GetLastError()返回87
2023-2-6 11:39 5694

[求助]VirtualProtectEx函数修改内存值时GetLastError()返回87

2023-2-6 11:39
5694

代码参考如下:
https://blog.csdn.net/bjbz_cxy/article/details/79863501
第一次能正常的执行,但是后面都无法在执行了。在代码:
pid_bol = VirtualProtectEx(hPro, (LPVOID)pid_p, 4, PAGE_READWRITE, &dwOldProtect);
这里的pid_bol返回了0.

 

printf("GetLast error =%d\r\n", GetLastError());//返回87
(Incorrect Parameter.)

 

请大神们指导一下这个是什么原因呢?我确定参数是没改没问题的,因为第一次执行的时候返回正确的值了。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (5)
雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2023-2-6 15:11
2
0

可能是pid_p的值不对。用户空间的地址不能超过 MM_HIGHEST_USER_ADDRESS。

雪    币: 2118
活跃值: (1608)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xuri422 2023-2-7 09:20
3
0
Boring勇哥 可能是pid_p的值不对。用户空间的地址不能超过 MM_HIGHEST_USER_ADDRESS。

感谢回复!我的pid_p是直接赋值的,应该没有超过用户空间。

雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2023-2-7 11:55
4
0
pid_p的值在循环中有没有改变?调用出错的时候它的值是多少?直接调用NtProtectVirtualMemory,返回的status更准确
雪    币: 2118
活跃值: (1608)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xuri422 2023-2-7 13:45
5
0
Boring勇哥 pid_p的值在循环中有没有改变?调用出错的时候它的值是多少?直接调用NtProtectVirtualMemory,返回的status更准确
pid_p的值在循环中有没有改变,出错的时候仍然是16777216;
进入循环后的第一次就报错了,pid_bol直接返回了0.
雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2023-2-7 15:06
6
0

进程的基址是随机的,每次创建进程都不一样,不能用默认的0x01000000。导致VirtualProtectEx返回87的原因有很多,使用NtProtectVirtualMemory可以看到确切的原因,比如STATUS_SECTION_PROTECTION/STATUS_INVALID_PAGE_PROTECTION,其Win32Error都是87。当地址类型是Mapped时,修改内存保护很可能失败,原因有很多,可以参考:https://www.unknowncheats.me/forum/3121774-post8.html

游客
登录 | 注册 方可回帖
返回