使用VirtualProtect时,报0XC0000005错误,请问是怎么回事

RoadingAnt 2013-12-03 06:26:01
代码如下,运行到红色代码处时,报错“未处理的异常: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;
}
...全文
559 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hpslrf 2014-09-18
  • 打赏
  • 举报
回复
果然如此,win7下也一样,非常感谢
RoadingAnt 2013-12-11
  • 打赏
  • 举报
回复
最后证明是2003不支持PAGE_READWRITE,改为PAGE_EXECUTE_READWRITE就可以了
RoadingAnt 2013-12-06
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
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;
}
引用 10 楼 mzz_810 的回复:
打开Debug权限
还是不行,可能就是没有管理员权限,无法修改内存属性,包括不能打开debug属性
赵4老师 2013-12-04
  • 打赏
  • 举报
回复
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;
}
RoadingAnt 2013-12-04
  • 打赏
  • 举报
回复
引用 6 楼 u012908616 的回复:
或许是权限问题,用管理员身份运行下试试(如果你有开UAC的话)
引用 5 楼 bebusy 的回复:
用VirtualProtectEx 还是一样的错误
引用 3 楼 u012908616 的回复:
也许 VirtualProtectEx 可以?
我也怀疑是权限问题,我是远程到windows2003客户端写的程序
Todd_Pointer 2013-12-04
  • 打赏
  • 举报
回复
或许是权限问题,用管理员身份运行下试试(如果你有开UAC的话)
引用 5 楼 bebusy 的回复:
用VirtualProtectEx 还是一样的错误
引用 3 楼 u012908616 的回复:
也许 VirtualProtectEx 可以?
RoadingAnt 2013-12-04
  • 打赏
  • 举报
回复
用VirtualProtectEx 还是一样的错误
引用 3 楼 u012908616 的回复:
也许 VirtualProtectEx 可以?
mzz_810 2013-12-04
  • 打赏
  • 举报
回复
打开Debug权限
RoadingAnt 2013-12-04
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
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;
}
可否给点解释?小弟水平不佳,看着困难
xlrtx 2013-12-04
  • 打赏
  • 举报
回复
楼主的意思是os版本问题 可是看了下msdn,windows server 2003是支持的啊.. 如果实在没注意,就吧pe头的text节表属性改下,加上write属性
Todd_Pointer 2013-12-03
  • 打赏
  • 举报
回复
也许 VirtualProtectEx 可以?
RoadingAnt 2013-12-03
  • 打赏
  • 举报
回复
传递参数没问题,在winowsXP的机器上运行正常,搬到Window2003上就出了这个错误
max_min_ 2013-12-03
  • 打赏
  • 举报
回复
内存出错啊!确认下传递的参数地址是否都是有效的!

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧