vc++6 -- 逆向获取/修改类的私有成员数据实例
【vc++6 -- 逆向获取/修改类的私有成员数据实例】下面以非常出名的游戏<<植物大战僵尸>> 为实例.
1.有用的几个内存地址
阳光地址:[[0x006A9EC0]+0x768]+5560
怪物数上限地址:[[0x006A9EC0]+0x768]+94
金币地址:[[0x006A9EC0]+0x82C]+0x28
注意:[] 的意思是指从这个地址读取数据.
由这么多数据可以知道,[[0x006A9EC0]+0x768] 保存着游戏场景和用户的相关数据,[[0x006A9EC0]+0x82C] 保存着游戏设置.
这些内存地址告诉了我们什么东西呢?首先,地址0x006A9EC0 是关系到整个游戏数据的,但是它可能不是游戏程序的基址(因为电脑没有PVF 所以没有办法调试程序的基址).根据类的私有数据成员特性可知,[[0x006A9EC0]+0x768] 和[[0x006A9EC0]+0x82C] 是this 指针,而且0x006A9EC0 可能就是游戏类的全局变量.据此可得PVF 的简单系统架构图:
上面已经得到结论:类中组合的类的私有数据成员地址可能会与原来的类共存在同一堆栈下.也就是说,game 类中堆栈可以直接访问game_setting 的私有数据成员,不过,由上面的地址数据可以知道,要访问game_setting 和game_data 是要偏移一定位置的指针的,对此合理的解释就是"game 类的组合类game_setting 和game_data 是类的指针",这样就可以解释为什么访问类的私有数据成员需要进行第一次数据偏移了(比如:game_data 类的this 指针:[0x006A9EC0]+0x768 ,game_setting 类的this 指针:[0x006A9EC0]+0x82C ),进而访问类内的数据成员时,就需要对this 指针进行操作了(对阳光数据读写:[[0x006A9EC0]+0x768]+5560 <=> this->suns [此时this 的game_data 的类指针]).
本文来源 我爱IT技术网 http://www.52ij.com/jishu/4153.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
