如何内存锁定

xiazaihrl 2011-03-04 01:20:21
就像单机游戏中那种 生命锁定,金钱锁定一样

我是这么弄的。。。
最前面省略...
void ShowErrorCode()
{
int err =GetLastError();
char errch[5]={0};
sprintf(errch,"%d",err);
AfxMessageBox(errch);
}

已有前提,我用 pHp这个地址 正确改写到了里面的 生命数值。
用的是 WriteProcessMemory

如下
		if(VirtualQueryEx(hGta, (void *)pHp, &mbi, sizeof(mbi)) != sizeof(mbi))
{
AfxMessageBox("Query Error");
ShowErrorCode();
return ;
}
else
{
dwOld =mbi.AllocationProtect;
}

if(0==VirtualProtectEx(hGta,(void *)pHp,sizeof(buf),PAGE_READWRITE,&dwOld))
{
AfxMessageBox("Vp1 Error");
ShowErrorCode();
return ;
}

if(0==WriteProcessMemory(hGta,(void *)pHp,buf,sizeof(buf),&realwrite))
{
AfxMessageBox("Write Error");
ShowErrorCode();
return ;
}

当再用 VirtualProtectEx 时,想把内存改为 READ_ONLY
可是老是返回0,为什么?


if(0==VirtualProtectEx(hGta,(void *)pHp,sizeof(buf),PAGE_READONLY,&dwOld))
{
AfxMessageBox("Vp2 Error");
ShowErrorCode();
return ;
}


...全文
483 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinzhou520 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiazaihrl 的回复:]

引用 12 楼 lactoferrin 的回复:

我没别的简单方法,等更厉害的过来

恩,顶你个肺
[/Quote]
年轻人,太容易冲动了.
xiazaihrl 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lactoferrin 的回复:]

引用 11 楼 xiazaihrl 的回复:
该回复于2011-03-05 09:01:33被管理员删除


xxx
[/Quote]
要不他会没事做的...
Lactoferrin 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiazaihrl 的回复:]
该回复于2011-03-05 09:01:33被管理员删除
[/Quote]

xxx
xiazaihrl 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lactoferrin 的回复:]

你可以发现你的肺回复被删了
[/Quote]
那怎么可能...
Lactoferrin 2011-03-05
  • 打赏
  • 举报
回复
你可以发现你的肺回复被删了
xiazaihrl 2011-03-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wangell 的回复:]

引用 13 楼 xiazaihrl 的回复:

引用 12 楼 lactoferrin 的回复:

我没别的简单方法,等更厉害的过来

恩,顶你个肺

年轻人,太容易冲动了.
[/Quote]
这哪里是冲动。。。幽默而已,顶你个肺.
xiazaihrl 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lactoferrin 的回复:]

我没别的简单方法,等更厉害的过来
[/Quote]
恩,顶你个肺
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
我没别的简单方法,等更厉害的过来
xiazaihrl 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiazaihrl 的回复:]

引用 8 楼 lactoferrin 的回复:

不用判断,直接不停地写

额,觉得有点不好就是
[/Quote]
还有没什么其他方法
xiazaihrl 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lactoferrin 的回复:]

不用判断,直接不停地写
[/Quote]
额,觉得有点不好就是
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
不用判断,直接不停地写
xiazaihrl 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lactoferrin 的回复:]

引用 5 楼 xiazaihrl 的回复:
引用 3 楼 lactoferrin 的回复:

我觉得通过修改页的保护方式来锁定不可行,因为一旦把目标页设置为只读,游戏尝试写那个地址时就会发生异常,这样会导致游戏崩溃退出

会崩溃吗? 没怎么试过

你就在自己的进程试一下写入只读的页
[/Quote]
貌似先不想试,主要问下内存锁定的,不是那种 settimer 读出来 判断 再写回去吧
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiazaihrl 的回复:]
引用 3 楼 lactoferrin 的回复:

我觉得通过修改页的保护方式来锁定不可行,因为一旦把目标页设置为只读,游戏尝试写那个地址时就会发生异常,这样会导致游戏崩溃退出

会崩溃吗? 没怎么试过
[/Quote]
你就在自己的进程试一下写入只读的页
xiazaihrl 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lactoferrin 的回复:]

我觉得通过修改页的保护方式来锁定不可行,因为一旦把目标页设置为只读,游戏尝试写那个地址时就会发生异常,这样会导致游戏崩溃退出
[/Quote]
会崩溃吗? 没怎么试过
xiazaihrl 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 void_wuyu 的回复:]

这个锁定有两种的,一般是你这么实现的,不过有可能游戏本身有控制,这个就需要你检测监控了。
[/Quote]
如何检查监控?
Lactoferrin 2011-03-04
  • 打赏
  • 举报
回复
我觉得通过修改页的保护方式来锁定不可行,因为一旦把目标页设置为只读,游戏尝试写那个地址时就会发生异常,这样会导致游戏崩溃退出
乐CC 2011-03-04
  • 打赏
  • 举报
回复
这个锁定有两种的,一般是你这么实现的,不过有可能游戏本身有控制,这个就需要你检测监控了。
赵4老师 2011-03-04
  • 打赏
  • 举报
回复
是ReadProcessMemory、AdjustTokenPrivileges和WriteProcessMemory

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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