导语:在版块基本没有看见关于此类游戏的教程,刚好今日有时间,截几张图做一下讲解。
要求学习者者具备一定安卓开发经验、kotlin、Java等语言的基础使用。。或者你想理解基础的一个逆向思维也可以学习,技术永远是第二,逆向思维才是第一[滑稽]四两拨千斤
科普时间到:何为纯Java开发?目前游戏基本离不开unity、Cocos这两大引擎。或者基于其他游戏引擎开发的游戏。他们存在的一个共同点是:主要游戏逻辑(伤害、物品加减)不会存在于dex。位于so动态库、js文件居多。纯java开发的游戏只是一个统称,他可能用Java写的也可能用kotlin写的,毕竟这两者并不分家。简单点说就是他的逻辑位于dex层,代表游戏:公会会长,普通的修改并无意义,我们今天进入的是如何在一个通用的伤害获取方法内实现敌我的判断
找到了关键的方法getfinadamage,伤害获取。这是一个简单直接返回,并无存在相关的判断,继续分析
此时我们找到了一个判定方法,isplayerside,是一个Boolean类型的方法,根据传递进去的对象进行判断
通过调用查询,我们发现了不少关键方法调用了这个判断方法,这一个步骤存在的意义是什么呢?一个是确定他是否为我们需要的存在判定功能。第二个是弄清楚先后关系。那就是伤害执行时有无经过这个方法的判定,他们两个是谁先执行。确定了isplayer是先执行的,那我们直接在这个方法下进行拦截即可
主要思路为:创建一个变量在这个方法内获取他们的返回结果,在伤害方法内通过获取变量进行判断。结合以上思路打开我们的as,开始写代码
开发步骤省略,自行百度哦,第一步创建一个公开类的公开变量,初始值为false,不建议为true,如果程序发癫部分逻辑没走isplayer那么你自己也会被秒杀
第二步在我们自己的类里面实现,我们上面思路的一个模拟获取,用于后续编译后我们可以直接复制粘贴进行修改,模拟获取流程为:模拟取值、模拟判断、模拟赋值
最早我们代码如下:
模拟拦截赋值,拦截任意v0Boolean参数,传递给isplayer
sget-object v1, Lcom/qingdi/modtest/startmod;->INSTANCE:Lcom/qingdi/modtest/startmod;
invoke-virtual {v1, v0}, Lcom/qingdi/modtest/startmod;->setIsplayer(Z)V
模拟取值,读取isplayer字段获取当前值
.line 27sget-object v1, Lcom/qingdi/modtest/startmod;->INSTANCE:Lcom/qingdi/modtest/startmod;invoke-virtual {v1}, Lcom/qingdi/modtest/startmod;->getIsplayer()Zmove-result v1
模拟判断为false或true
if-eqz v1, :cond_4f
为true的执行逻辑
.line 31:cond_4f
为false的执行逻辑
return-void
代码浅析结束,那么我们只需要在上面我们的两个方法内插入这些方法即可
在判断方法内加入我们的模拟赋值代码,将结果存入我们的字段内
在伤害方法插入模拟取值的代码取出值进行判断,注意要先初始获得我们原先的伤害值哦
结合以上代码把我们打包出来的dex放入apk文件即可实现一次简单的敌我判断