C++ 具有更改权限的自修改代码问题
我正在写自我修改代码。我试图更改我要执行的函数的地址权限,但是当我尝试将我的C++代码迁移到Visual Studio 2017时,我得到了一个错误。 我正在使用Microsoft Windows 10和Visual Studio 20017执行此任务,并使用默认配置C++ 具有更改权限的自修改代码问题,c++,visual-studio,C++,Visual Studio,我正在写自我修改代码。我试图更改我要执行的函数的地址权限,但是当我尝试将我的C++代码迁移到Visual Studio 2017时,我得到了一个错误。 我正在使用Microsoft Windows 10和Visual Studio 20017执行此任务,并使用默认配置 int change_page_permissions_of_address(void *addr) { // Move the pointer to the page boundary int page_size
int change_page_permissions_of_address(void *addr) {
// Move the pointer to the page boundary
int page_size = getpagesize();
DWORD dwOldProtect;
addr -= (uintptr_t)addr % page_size;
if (VirtualProtect(addr, page_size, PAGE_EXECUTE_READWRITE, &dwOldProtect) == -1) {
return -1;
}
return 0;
}
int main() {
char *foo_addr = (char*)foo;
if (change_page_permissions_of_address(foo_addr) == -1) {
printf("Error while changing page permissions of foo(): %s\n");
return 1;
}
}
int main(){
// Call the unmodified foo()
puts("Calling foo...");
foo();
// Change the immediate value in the addl instruction in foo() to 42
unsigned char *instruction = (unsigned char*)foo_addr + 18;
*instruction = 0x2A;
// Call the modified foo()
puts("Calling foo..., but I am the self-modifying");
foo();
}
}
<>我希望在VisualStudio中具有与DEV C++相同的行为
错误
错误(活动)E0852表达式必须是指向完整对象的指针
类型错误C2036“void*”:未知大小
addr-=(uintpttr)addr%页面大小代码>是问题所在。
-=
指针的左边减去指针指向的对象大小的整数倍,然后从指针中减去它。编译器正在抱怨,因为它不知道void的大小
你能让参数achar*
?一点也不,因为如果我改为char,那么我的主函数将使void foo\u addr=(void)foo的参数不兼容;同样的建议。将foo_addr设置为char*。如果我更改为char,那么我的主函数将为void foo_addr=(void)foo;,设置不兼容的参数,它将始终打印原始值1和变异值1。所以在这种情况下,我的变异结果应该被我的值覆盖42@yesii_0691:addr=((char*)addr)-(uintpttr)addr)%page\u大小代码>或一个位操作:addr&=~(uintpttr\t)(第1页)代码>.2main
VirtualProtect
返回一个BOOL
,而不是-1
。另请参见MSDN。