C++ 具有更改权限的自修改代码问题

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

我正在写自我修改代码。我试图更改我要执行的函数的地址权限,但是当我尝试将我的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 = 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的大小


你能让参数a
char*

一点也不,因为如果我改为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页).2
main
VirtualProtect
返回一个
BOOL
,而不是
-1
。另请参见MSDN。