用CE找到血的基址不是固定的

暗夜初上 2012-08-29 11:35:15
MFC程序有一个变量保存血值,用CE查找到的基址不是固定的,只是后四位是相同的
010420A0、013020A0、000C20A0、009720A0、011120A0,这个情况要怎么处理啊?我是看郁金香教程做的
系统win764位,VS2010,基于对话框的MFC应用程序,用OD找到call地址也是后四位相同
用代码执行代码注入会提示访问违规,然后那个血值程序会关闭。
这个怎么解决?
...全文
1823 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
谁学逆向工程 2014-01-21
  • 打赏
  • 举报
回复
我也在想怎么解决这个问题,这是内存分页问题吧。在启动进程时页面是由操作系统分配的,而物理内存紧张时也会重新分配物理内存页
yy2080 2014-01-19
  • 打赏
  • 举报
回复
因为类对象是动态分配内存的,每次打开游戏地址都不同,但是只要游戏不更新,偏移都不会变,每次分配那个对象的语句在内存中的位置也不会变,即所谓base address。所以必须要找到基址才行
lyramilk 2013-06-25
  • 打赏
  • 举报
回复
ALSR??一般不用考虑ALSR吧。。。ALSR是防止被溢出攻击的,不是用来保护这个的。如果要破解,开不开ALSR都是一样的,没多大区别。PE从来都不是绝对定位,开不开ALSR分析的难度是相同的。 如果你说的那个内存所在的数据结构是在new或malloc这样的动态分配的地址上,那个数据结构整个就是随机的。你可以试着找到程序利用这个数据结构时用的那个指针。
PalmerWang 2013-06-23
  • 打赏
  • 举报
回复
引用 12 楼 adlay 的回复:
基址动态后会涉及到代码的重定位问题, 会影响启动速度. 而且基址动态后只是计算麻烦一点, 又不是隐藏了找不到.
哦,那基址动态以后,我想调用Call,也就是函数首地址的话,这个基址变了,函数的地址也就变了,怎么找这个函数的地址呢?
PalmerWang 2013-06-23
  • 打赏
  • 举报
回复
同问啊,这个为什么Ce找出来的,绿色的地址是变的
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
基址动态后会涉及到代码的重定位问题, 会影响启动速度. 而且基址动态后只是计算麻烦一点, 又不是隐藏了找不到.
PalmerWang 2013-06-23
  • 打赏
  • 举报
回复
引用 10 楼 adlay 的回复:
编译的时候设置 /DYNAMICBASE:NO 选项就行了, 而且我的 win7 + VS2005 默认就是关闭的哦
嗯,有用,但是有点不明白的地方,既然可以设置成静态基址和动态的,为什么大型游戏不设置成动态基址链接编译方式?动态的不是更安全,防破解
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
编译的时候设置 /DYNAMICBASE:NO 选项就行了, 而且我的 win7 + VS2005 默认就是关闭的哦
PalmerWang 2013-06-23
  • 打赏
  • 举报
回复
引用 7 楼 a87437734 的回复:
几乎所有的数据都是动态分配的!
这个不对的,vista以下好像没有用到动态基址的技术
PalmerWang 2013-06-23
  • 打赏
  • 举报
回复
有啊,是全局变量,但是,我用的Win8的系统+vs2012好像,有种动态基址的技术,比如模块基址是Game.exe+0x0120,但是每次重新开机,这个Game.exe的模块首地址会变的
心留 2013-06-23
  • 打赏
  • 举报
回复
几乎所有的数据都是动态分配的!
PalmerWang 2013-06-23
  • 打赏
  • 举报
回复
我试试,有QQ吗,楼上高手?交流下,呵呵
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
把找到的函数地址减去当时模块的基址就是偏移了
PalmerWang 2013-06-23
  • 打赏
  • 举报
回复
不知道怎么找函数地址的偏移
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
你有用全局变量来保存血量吗?全局或函数静态变量地址才会是固定的 要测试 4 个地址哪个是对的,一个一个修改,看修改到哪个时显示的会变化
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
函数地址不用一个地址来表示, 换成基址 + 偏移的方式表示, 基址变了, 偏移不会变, 找到新的基址后加上偏移不就行了.
暗夜初上 2012-08-30
  • 打赏
  • 举报
回复
----加血--------
HWND h; //窗口变量
h=::FindWindow(NULL,"BloodGame"); //查找窗口句柄需要全局标识符
DWORD id; //进程ID
LPDWORD Pid=&id; //定义临时变量方便调用
::GetWindowThreadProcessId(h,Pid); //取得指定窗口的进程ID 存放到变量id里边
HANDLE hp=OpenProcess(PROCESS_ALL_ACCESS,false,id);//获取访问进程权限 存放至hp
DWORD tid; //定义临时变量方便调用
CreateRemoteThread(hp,NULL,0,(LPTHREAD_START_ROUTINE)0x413440 ,NULL,0,&tid);
----结束加血----

自己写的客户端----加血------
void CBloodGameDlg::OnBnClickedButtonAdd()
{
// TODO: 在此添加控件通知处理程序代码

blood += 22;
char buffer[10];
_itoa( blood, buffer, 10 );
m_blood.SetWindowText(buffer);
}
------结束----------
远程加血之后执行到 m_blood.SetWindowText(buffer);时变量值为
this 0xoooooooo{CBloodGameDlg hWnd=???}
buffer 0x0273ff68 "3044"
然后执行void CWnd::SetWindowText(LPCTSTR lpszString)
{
ENSURE(this);
ENSURE(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));

if (m_pCtrlSite == NULL)
::SetWindowText(m_hWnd, lpszString);
else
m_pCtrlSite->SetWindowText(lpszString);
}
到ENSURE(this);时临时变量值
this 0x000000bc{CWnd hWnd=???}
lpszString 0x0273ff68"3044"
接着执行出现错误:BloodGame.exe 中的 0x5828f363 (mfc100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x000000dc 时发生访问冲突
这个应该怎么解决呢?this指针的值怎么不知道呢?
暗夜初上 2012-08-29
  • 打赏
  • 举报
回复
有可以告诉是怎么回事吗!!!顶起
  • 打赏
  • 举报
回复
用调试器硬件断点上述地址,条件为写,看看血变化的时候哪个地址被修改了。
WJN92 2012-08-29
  • 打赏
  • 举报
回复
有可能是临时分配出来的

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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