ZwProtectVirtualMemory使用出现的问题和

1.函数定义

需要注意的是这个函数未文档话,网上随便找了个定义,发现报错

typedef NTSTATUS(CALLBACK* PZwProtectVirtualMemory)(
HANDLE ProcessHandle, 
PVOID* BaseAddress, 
PULONG  NumberOfBytesToProtect, 
ULONG NewAccessProtection, 
PULONG OldAccessProtection);

0xC00000F1

STATUS_INVALID_PARAMETER_3

注意第三个参数应该是SIZE_T*类型了,PULONG传进去如果复制的时候是ULONG,前面的高4位不会清零会出错

typedef NTSTATUS(CALLBACK* PZwProtectVirtualMemory)(
HANDLE ProcessHandle, 
PVOID* BaseAddress, 
SIZE_T* NumberOfBytesToProtect, 
ULONG NewAccessProtection, 
PULONG OldAccessProtection);

2.函数的使用

第二个参数在传入之后,传出会发生改变,需要定义一个零时变量去存

printf("%p before %x", g_orgXXXXXAddresss, *(PULONG)g_orgXXXXXAddresss);
NTSTATUS status = ZwProtectVirtualMemory((HANDLE)-1, &g_orgXXXXXAddresss, &uSize, PAGE_EXECUTE_READWRITE,&oldProtect);
printf("status %x", status);
if (NT_SUCCESS(status))
{
	printf("%p before %x", g_orgXXXXXAddresss, *(PULONG)g_orgXXXXXAddresss);
	memcpy(g_orgXXXXXAddresss, g_pZwXXXXXAddresss,0x20);
	printf("%p after %x", g_orgXXXXXAddresss, *(PULONG)g_orgXXXXXAddresss);
	ZwProtectVirtualMemory((HANDLE)-1, &g_orgXXXXXAddresss, &uSize, oldProtect, &oldProtect);
}

输出结果:

before0 00007FFDDF13CA60 1735aae9
status 0
00007FFDDF13C000 before e1a225ff
00007FFDDF13C000 after b8d18b4c

修改代码之后

printf("%p before %x", g_orgXXXXXAddresss, *(PULONG)g_orgXXXXXAddresss);
PVOID address = g_orgXXXXXAddresss;
NTSTATUS status = ZwProtectVirtualMemory((HANDLE)-1, &address, &uSize, PAGE_EXECUTE_READWRITE,&oldProtect);
printf("status %x", status);
if (NT_SUCCESS(status))
{
	printf("%p before %x", g_orgXXXXXAddresss, *(PULONG)g_orgXXXXXAddresss);
	memcpy(g_orgXXXXXAddresss, g_pZwXXXXXAddresss,0x20);
	printf("%p after %x", g_orgXXXXXAddresss, *(PULONG)g_orgXXXXXAddresss);
	address = g_orgXXXXXAddresss;
	ZwProtectVirtualMemory((HANDLE)-1, &address, &uSize, oldProtect, &oldProtect);
}

before0 00007FFDDF13CA60 1735aae9
status 0
00007FFDDF13CA60 before 1735aae9
00007FFDDF13CA60 after b8d18b4c

unsigned char*和char*的问题

一般我比较经常使用PUCHAR很少用char *,进行二进制比较的时候不要用char*

比如

 UCHAR a={0xea}

if((char *)a[0]==0xea)

这里返回的是false,不注意的话会出错,高位为1,区分有符号和无符号

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: b'zwprotectvirtualmemory' 是一个 Windows API 函数,用于保护虚拟内存区域。它可以修改内存区域的保护属性,如可读、可写、可执行和可访问级别等。通过使用此函数,可以保护应用程序的关键内存区域,防止非法访问和修改。 ### 回答2: zwprotectvirtualmemoryWindows操作系统中的一种内核函数,其作用是修改虚拟内存的保护属性。虚拟内存是操作系统中的一种资源管理机制,通过把物理内存和磁盘上的空间统一编址,使得应用程序可以使用比实际物理内存更多的内存空间,从而提高系统的运行效率。 在Windows操作系统中,每个进程都有一个独立的虚拟内存空间,它用于存储应用程序的代码、数据和堆栈等。为了保护进程的内存空间不被非法访问或者修改,Windows操作系统为每个虚拟内存页都设置了不同的访问权限,包括读、写、执行和保护等。 zwprotectvirtualmemory就是用来修改虚拟内存页的保护属性的函数。它可以使用户在运行时修改虚拟内存页的属性,以达到某些特定的需求,如保护某些关键代码、数据,避免被病毒或者非法软件修改;或者实现代码加密、虚拟机检测等安全功能。 使用zwprotectvirtualmemory函数需要用户具备一定的安全编程经验和内存管理知识,因为它可能会影响系统的稳定性和安全性。在使用过程中,用户需要注意保护好修改的虚拟内存页不被非法访问或者修改,以保障系统的稳定性和安全性。 总之,zwprotectvirtualmemoryWindows操作系统中的一种重要内核函数,它可以提供强大的内存保护和安全机制,为用户的应用程序提供更加完备可靠的内存管理机制。但是在使用过程中,用户需要注意使用方法和注意事项,以免对系统产生不好的影响。 ### 回答3: zwprotectvirtualmemoryWindows 操作系统中的一种系统调用(System Call),其作用是用于修改指定进程的虚拟内存区域的属性。 在 Windows 中,每个进程都有自己的虚拟内存空间,操作系统可以通过该调用来修改进程的虚拟内存区域的保护属性,包括读、写、执行等。同时,zwprotectvirtualmemory 还可以修改虚拟内存区域的属性,比如可以设置为只读、可写等。 该调用的具体语法如下: ``` NTSTATUS ZwProtectVirtualMemory( HANDLE ProcessHandle, PVOID* BaseAddress, SIZE_T* NumberOfBytesToProtect, ULONG NewAccessProtection, PULONG OldAccessProtection ); ``` 其中,ProcessHandle 表示要修改虚拟内存属性的进程的句柄,BaseAddress 表示要修改的虚拟内存区域的起始地址,NumberOfBytesToProtect 表示要修改的虚拟内存区域的大小, NewAccessProtection 表示修改后的虚拟内存区域的属性,OldAccessProtection 表示修改前的虚拟内存区域的属性。 需要注意的是,zwprotectvirtualmemory 是一种非常危险的调用,如果使用不当,可能会导致系统稳定性问题,包括死机、蓝屏等。因此,只有在确保自己知道该调用的工作原理以及使用方法后,才能使用该调用来修改进程的虚拟内存属性。同时,需要谨慎考虑对进程的虚拟内存权限的修改是否真正有必要,并且修改后需要对修改前后的效果进行充分测试,以确保不会对系统稳定性造成影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值