读书人

使用VirtualProtect时报0XC0000005异

发布时间: 2013-12-11 16:44:13 作者: rapoo

使用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权限

读书人网 >C++

热点推荐