占内存小的游戏地址:动态分配占内存小的游戏的游戏怎么样找占内存小的游戏

[转载]动态分配内存的游戏怎么样找内存地址实例
&游戏:天龙八部
版本:0.13.0402
系统:windows xp
工具:CE5.2+OD1.10
目标:搜索人物基地址
第一步,用CE搜索人物HP,得到一堆地址,掉血后继续搜索,得到唯一地址0ABDC360(HP地址)
第二步,切换地图后发现该地址里的值已经不是HP,是动态地址,重复第一步搜索出新的HP地址(地址省略)
第三步,这时候不再切换地图,用CE5.2对找到的HP地址下写访问内存断点,此步也可用OD下写内存断点,找到汇编语句如下
&&&&55&&&&&&&&&&&&&&PUSH&EBP
&&&&8BEC&&&&&&&&&&&&MOV&EBP,ESP
&&&&56&&&&&&&&&&&&&&PUSH&ESI
&&&&8BF1&&&&&&&&&&&&MOV&ESI,ECX&&;&1.2&esi=ecx
&&&&8B4E&04&&&&&&&&&MOV&ECX,DWORD&PTR&DS:[ESI+4]
&&&&8B01&&&&&&&&&&&&MOV&EAX,DWORD&PTR&DS:[ECX]
0044B28B&&&&57&&&&&&&&&&&&&&PUSH&EDI
0044B28C&&&&FF90&&&&CALL&DWORD&PTR&DS:[EAX+114]
&&&&83F8&02&&&&&&&&&CMP&EAX,2
&&&&8B3D&&&&MOV&EDI,DWORD&PTR&DS:[&&tEngine.?tThrowS&
;&tEngine.?tThrowStringException@@YAXPBDZZ
0044B29B&&&&75&19&&&&&&&&&&&JNZ&SHORT&Game.
0044B29D&&&&68&&&&&&PUSH&563
&&&&68&&&&&&PUSH&Game.&&
;&ASCII&".\DataPool\GMDP_CharacterData.cpp"
&&&&68&&&&&&PUSH&Game.&&
;&ASCII&"CT_MONSTER"
0044B2AC&&&&68&&&&&&PUSH&Game.&&
;&ASCII&"Character&must&not&%s,(File:%s&Line:%d)"
&&&&FFD7&&&&&&&&&&&&CALL&EDI
&&&&83C4&10&&&&&&&&&ADD&ESP,10
&&&&8B4E&04&&&&&&&&&MOV&ECX,DWORD&PTR&DS:[ESI+4]
&&&&8B11&&&&&&&&&&&&MOV&EDX,DWORD&PTR&DS:[ECX]
0044B2BB&&&&FF92&&&&CALL&DWORD&PTR&DS:[EDX+114]
&&&&83F8&01&&&&&&&&&CMP&EAX,1
&&&&75&19&&&&&&&&&&&JNZ&SHORT&Game.0044B2DF
&&&&68&&&&&&PUSH&564
0044B2CB&&&&68&&&&&&PUSH&Game.&&
;&ASCII&".\DataPool\GMDP_CharacterData.cpp"
&&&&68&&&&&&PUSH&Game.&&
;&ASCII&"CT_PLAYEROTHER"
&&&&68&&&&&&PUSH&Game.&&
;&ASCII&"Character&must&not&%s,(File:%s&Line:%d)"
0044B2DA&&&&FFD7&&&&&&&&&&&&CALL&EDI
0044B2DC&&&&83C4&10&&&&&&&&&ADD&ESP,10
0044B2DF&&&&8B46&08&&&&&&&&&MOV&EAX,DWORD&PTR&DS:[ESI+8]
;&1.2&eax=[esi+8]
&&&&8B4D&08&&&&&&&&&MOV&ECX,DWORD&PTR&SS:[EBP+8]
;&01.1&血来自父函数第一个参数
&&&&8988&B8060000&&&MOV&DWORD&PTR&DS:[EAX+6B8],ECX&
;&1.1&血被写入
0044B2EB&&&&8B0D&9C975B00&&&MOV&ECX,DWORD&PTR&DS:[5B979C]
&&&&8B11&&&&&&&&&&&&MOV&EDX,DWORD&PTR&DS:[ECX]
&&&&68&B4545700&&&&&PUSH&Game.&&&&&&&&&&&&
;&ASCII&"player"
&&&&6A&19&&&&&&&&&&&PUSH&19
0044B2FA&&&&FF52&4C&&&&&&&&&CALL&DWORD&PTR&DS:[EDX+4C]
0044B2FD&&&&5F&&&&&&&&&&&&&&POP&EDI
0044B2FE&&&&5E&&&&&&&&&&&&&&POP&ESI
0044B2FF&&&&5D&&&&&&&&&&&&&&POP&EBP
&&&&C2&0400&&&&&&&&&RETN&4
这是完整的子函数,实际血被写入的那句代码是红色那句,由此可得知血被存在[eax+6b8]中,6b8是个偏移量,HP指针地址其实存在eax中,根据该段代码的分析,得知eax=[esi+8],而esi=调用函数带进来的ecx,以上代码中注释1.1,1.2,1.3有说明,记好此时的eax,ecx两个值,下面一步就是要查这两个值存的东西变不变
第四步,让自己掉一次血,发现HP地址没变,OD中行代码处下断点,发现此时的eax,ecx也没变,猜测HP地址切换地图时才可能重新分配
第五步:切换一次地图后代码中断,发现此时的eax,ecx与上次又不一样了,上步的猜测可能正确,因为eax=[esi+8]=[ecx+8],所以eax是依赖ecx的,ecx又是来自调用函数的,所以使用调用堆栈去查看调用函数中ecx是怎么来的,OD中调用堆栈的父函数处回车即可,以下是父函数代码
004D7A10&&&&55&&&&&&&&&&&&&&PUSH&EBP
004D7A11&&&&8BEC&&&&&&&&&&&&MOV&EBP,ESP
004D7A13&&&&51&&&&&&&&&&&&&&PUSH&ECX
004D7A14&&&&A1&F0975B00&&&&&MOV&EAX,DWORD&PTR&DS:[5B97F0]
004D7A19&&&&3B05&E4975B00&&&CMP&EAX,DWORD&PTR&DS:[5B97E4]
004D7A1F&&&&53&&&&&&&&&&&&&&PUSH&EBX
004D7A20&&&&56&&&&&&&&&&&&&&PUSH&ESI
004D7A21&&&&0F85&AB080000&&&JNZ&Game.004D82D2
004D7A27&&&&8B75&08&&&&&&&&&MOV&ESI,DWORD&PTR&SS:[EBP+8]
004D7A2A&&&&8B0D&78695B00&&&MOV&ECX,DWORD&PTR&DS:[5B6978]
004D7A30&&&&8B46&08&&&&&&&&&MOV&EAX,DWORD&PTR&DS:[ESI+8]
004D7A33&&&&8B11&&&&&&&&&&&&MOV&EDX,DWORD&PTR&DS:[ECX]
004D7A35&&&&50&&&&&&&&&&&&&&PUSH&EAX
004D7A36&&&&FF52&44&&&&&&&&&CALL&DWORD&PTR&DS:[EDX+44]&
;&2.5&eax是该函数的返回值,该函数返回一个重要的地址
004D7A39&&&&8BD8&&&&&&&&&&&&MOV&EBX,EAX&&&&&&&&&&&&&&&&
;&2.4&ebx=eax
004D7A3B&&&&85DB&&&&&&&&&&&&TEST&EBX,EBX
004D7A3D&&&&0F84&8F080000&&&JE&Game.004D82D2
004D7A43&&&&33C0&&&&&&&&&&&&XOR&EAX,EAX
004D7A45&&&&8A46&0C&&&&&&&&&MOV&AL,BYTE&PTR&DS:[ESI+C]
004D7A48&&&&57&&&&&&&&&&&&&&PUSH&EDI
004D7A49&&&&8BBB&2C010000&&&MOV&EDI,DWORD&PTR&DS:[EBX+12C]&
;&2.3&edi=[ebx+12c]
004D7A4F&&&&83E0&01&&&&&&&&&AND&EAX,1
004D7A52&&&&8945&FC&&&&&&&&&MOV&DWORD&PTR&SS:[EBP-4],EAX
004D7A55&&&&74&2B&&&&&&&&&&&JE&SHORT&Game.004D7A82
004D7A57&&&&8B4E&18&&&&&&&&&MOV&ECX,DWORD&PTR&DS:[ESI+18]
004D7A5A&&&&51&&&&&&&&&&&&&&PUSH&ECX
004D7A5B&&&&8BCF&&&&&&&&&&&&MOV&ECX,EDI
004D7A5D&&&&E8&DE1FF7FF&&&&&CALL&Game.00449A40
004D7A62&&&&8B15&78695B00&&&MOV&EDX,DWORD&PTR&DS:[5B6978]
004D7A68&&&&3B5A&44&&&&&&&&&CMP&EBX,DWORD&PTR&DS:[EDX+44]
004D7A6B&&&&75&15&&&&&&&&&&&JNZ&SHORT&Game.004D7A82
004D7A6D&&&&8B57&08&&&&&&&&&MOV&EDX,DWORD&PTR&DS:[EDI+8]
004D7A70&&&&8B0D&10985B00&&&MOV&ECX,DWORD&PTR&DS:[5B9810]
004D7A76&&&&8B52&70&&&&&&&&&MOV&EDX,DWORD&PTR&DS:[EDX+70]
004D7A79&&&&8B01&&&&&&&&&&&&MOV&EAX,DWORD&PTR&DS:[ECX]
004D7A7B&&&&52&&&&&&&&&&&&&&PUSH&EDX
004D7A7C&&&&FF90&A0000000&&&CALL&DWORD&PTR&DS:[EAX+A0]
004D7A82&&&&33C0&&&&&&&&&&&&XOR&EAX,EAX
004D7A84&&&&8A46&0C&&&&&&&&&MOV&AL,BYTE&PTR&DS:[ESI+C]
004D7A87&&&&83E0&02&&&&&&&&&AND&EAX,2
004D7A8A&&&&D1E8&&&&&&&&&&&&SHR&EAX,1
004D7A8C&&&&85C0&&&&&&&&&&&&TEST&EAX,EAX
004D7A8E&&&&74&0B&&&&&&&&&&&JE&SHORT&Game.004D7A9B
004D7A90&&&&8B46&20&&&&&&&&&MOV&EAX,DWORD&PTR&DS:[ESI+20]
004D7A93&&&&50&&&&&&&&&&&&&&PUSH&EAX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&02.1&eax里存放了血,给子函数使用
004D7A94&&&&8BCF&&&&&&&&&&&&MOV&ECX,EDI&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;&2.2&ecx=edi
004D7A96&&&&E8&E537F7FF&&&&&CALL&Game.&&&&&&&&&&&&&&&&&&&&&&&
;&2.1&ecx影响了子函数
004D7A9B&&&&33C0&&&&&&&&&&&&XOR&EAX,EAX
Game.即第三步找到的子函数,调用子函数时血量值作为参数传进去,具体的子函数功能我也没搞清楚,大体感觉上可能是拿到数据包后给内存中的HP地址赋值。
继续分析这段代码,2.1,2.2,2.3这三句发现ecx=[ebx+12c],看来这里的12c又是一个偏移量,在2.3上下断点,获取到此时的ebx=0B387708,继续分析发现2.4,2.5中ebx=eax=2.5调用的子函数的返回值,动态调试跟下去发现2.5那行调用的子函数里,的确是为了获取这个0b387708,具体函数功能没看懂,里面是一堆比较复杂的地址运算得到了这个值
第六步:CE中查找0b387708存在什么地址里,找到两个地址013D2BD8和013D6064,随后切换地图发现这两个地址里的值都改变了,但还是相同,用这个新值进行[[[新值+12c]+8]+6b8]运算,终于得到了HP值。感觉这两个地址有可能是个不变的值,重开游戏后确认,的确同样的运算还能得到HP值。姑且任务第一个值013D2BD8为要查找的基地址,而血是经过偏移3次后找到的,偏移量分别是12c,8,6b8
目标基本完成,
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)怎样查自己电脑的内存地址空间分配_百度知道
怎样查自己电脑的内存地址空间分配
我有更好的答案
码区:就是存放你的程序的编译后的可执行代码的地方了   数据区,还有New给指针用的空间,都在这里分配,局部变量(自动变量)等:在分配给一个程序的内存中,除了上面三部分,剩下的就是堆了,也就是程序的自由空间:在函数调用中,保存程序的当前运行状态、函数的参数、返回结果等。   堆:存放你的程序静态数据,如全局变量、常量等。   栈
北京谷数科技有限公司
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。关于软件程序基址与动态内存地址的问题_百度知道
关于软件程序基址与动态内存地址的问题
基址是不变的,偏移也是不变的,但是为什么每次打开软件取到的动态内存地址就会发生改变呢,可以详细的解释一下原理么
因为动态内存是被基址随机指定的 基址会访问动态基址进行赋值
可以详细的说一下么
还是不太理解
就是每次启动这个程序 基址都会对每一层偏移的地址进行赋值 最后得到的就是动态地址每次赋值都是随机的 所以动态地址也是会变的
采纳率:37%
为您推荐:
其他类似问题
动态内存的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。2009年 总版技术专家分年内排行榜第四
2009年2月 总版技术专家分月排行榜第一2009年1月 总版技术专家分月排行榜第一2008年11月 总版技术专家分月排行榜第一2008年10月 总版技术专家分月排行榜第一2008年9月 总版技术专家分月排行榜第一2008年8月 总版技术专家分月排行榜第一2008年7月 总版技术专家分月排行榜第一2008年6月 总版技术专家分月排行榜第一2008年5月 总版技术专家分月排行榜第一2008年4月 总版技术专家分月排行榜第一
2009年 总版技术专家分年内排行榜第四
2009年2月 总版技术专家分月排行榜第一2009年1月 总版技术专家分月排行榜第一2008年11月 总版技术专家分月排行榜第一2008年10月 总版技术专家分月排行榜第一2008年9月 总版技术专家分月排行榜第一2008年8月 总版技术专家分月排行榜第一2008年7月 总版技术专家分月排行榜第一2008年6月 总版技术专家分月排行榜第一2008年5月 总版技术专家分月排行榜第一2008年4月 总版技术专家分月排行榜第一
2009年 总版技术专家分年内排行榜第四
2009年2月 总版技术专家分月排行榜第一2009年1月 总版技术专家分月排行榜第一2008年11月 总版技术专家分月排行榜第一2008年10月 总版技术专家分月排行榜第一2008年9月 总版技术专家分月排行榜第一2008年8月 总版技术专家分月排行榜第一2008年7月 总版技术专家分月排行榜第一2008年6月 总版技术专家分月排行榜第一2008年5月 总版技术专家分月排行榜第一2008年4月 总版技术专家分月排行榜第一
匿名用户不能发表回复!|}

我要回帖

更多关于 gdb watch 内存地址 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信