发布于:2018-3-5 16:42 | 118761次阅读 作者: 外部投稿 | 原作者: 通化程序员
我们知道游戏中有很多的怪物,那么内存中存放怪物就一定会是一个结构而不是一个一个单独存放的,追这个结构中的单一成员,就会追到这个结构的遍历中去。 那么突破口有很多,怪物的任一属性都可以作为查找的突破口,例如怪物的血量,坐标,结构的属性也可以作为突破口,例如怪物的数量。 其实,还有另外一个突破口,就是人物的对象以及属性,为什么?人物的结构往往和怪物是相同的,很少有程序员会去单独再写一个结构出来。 当然这是大部分情况,不是100%,8层的游戏适用,不适用也没关系,正常去找即可
例如人物对象及属性,我们可以在任意属性上下断或则对象上下断,就可以断到怪物结构中去。 那么为什么是任意属性呢,例如+38我们不知道他是什么属性也可以下断吗? 回答是...你知道不知道他是什么又有什么关系呢?无论偏移是多少,你下断得到的代码一定是对象+属性,至于属性是多少无所谓了。你要追的是对象,追的是对象遍历。
我们直接对对象下断 断到这样的代码位置 当然也有可能断到其他位置,因为对人物对象的访问可不止怪物链接哦,如果断到的位置只是单独人物对象的话,我们就看其他的访问代码即可。
断到的代码 mov edx,[esi] 继续往上追 来源于 mov esi,[EDI+16c] 在这个位置下断 测试偏移表达式是否正确,发现无论怎么断都断不到人物对象 即使条件断也不行, 那么只能说明一点,来源不是这条代码!对吧,否则不可能偏移表达式不对。 那么说明 应该是有跳转或则循环导致的 我们在周围分析跳转哪些跳转可以导致这样的情况 在代码的下面发现了一个循环 esi!=0 不断循环 不断的 mov edx,[esi]产生新对象 新对象等于0的话循环结束, 这样的话 我们就清晰的明白是怎么遍历的了,不过是一个+0的链表而已。 例如第一个对象 第四个对象=[第三个对象]=[[第二个对象]]=[[[第一个对象]]] 我们继续去追链表根 直接就是一个基地址+88而已。
来源:通化程序员-公众号投稿 *转载请注明来自游戏安全实验室(GSLAB.QQ.COM) |
最新评论
发表评论