首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

使用VirtualProtect时,报0XC0000005异常,请教是咋回事

2013-12-11 
使用VirtualProtect时,报0XC0000005错误,请问是怎么回事代码如下,运行到红色代码处时,报错“未处理的异常:C

使用VirtualProtect时,报0XC0000005错误,请问是怎么回事
代码如下,运行到红色代码处时,报错“未处理的异常:C0000005 access violation”
谁能解答一下为什么?
BOOL HookApi(LPVOID ApiFun,LPVOID HookFun)
{
    BOOL    IsSuccess = FALSE;
    DWORD   TempProtectVar;              //临时保护属性变量
    MEMORY_BASIC_INFORMATION MemInfo;    //内存分页属性信息
   
    VirtualQuery(ApiFun,&MemInfo,sizeof(MEMORY_BASIC_INFORMATION));
   
    if(VirtualProtect(MemInfo.BaseAddress,MemInfo.RegionSize,
        PAGE_READWRITE,&MemInfo.Protect))                            //修改页面为可写
    {
        *(BYTE*)ApiFun = FLATJMPCMD;                                     
        *(DWORD*)((BYTE*)ApiFun + FLATJMPCMD_LENGTH) = (DWORD)HookFun -
            (DWORD)ApiFun - FLATJMPCODE_LENGTH;
       
        VirtualProtect(MemInfo.BaseAddress,MemInfo.RegionSize,
            MemInfo.Protect,&TempProtectVar);                               //改回原属性
       
        IsSuccess = TRUE;
    }
   
    return IsSuccess;
} VirtualProtect, 0XC0000005
[解决办法]
楼主的意思是os版本问题

可是看了下msdn,windows server 2003是支持的啊..

如果实在没注意,就吧pe头的text节表属性改下,加上write属性

[解决办法]
或许是权限问题,用管理员身份运行下试试(如果你有开UAC的话)

引用:
用VirtualProtectEx 还是一样的错误
Quote: 引用:

也许 VirtualProtectEx 可以?

[解决办法]
bool AdjustPrivileges() {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    TOKEN_PRIVILEGES oldtp;
    DWORD dwSize=sizeof(TOKEN_PRIVILEGES);
    LUID luid;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES 
[解决办法]
 TOKEN_QUERY, &hToken)) {
        if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;
        else return false;
    }
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
        CloseHandle(hToken);
        return false;
    }
    ZeroMemory(&tp, sizeof(tp));
    tp.PrivilegeCount=1;
    tp.Privileges[0].Luid=luid;
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    /* Adjust Token Privileges */
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
        CloseHandle(hToken);
        return false;
    }
    // close handles
    CloseHandle(hToken);
    return true;
}

[解决办法]
打开Debug权限

热点排行