Android中dll文件的修改,最近下载了一款非常不错的益智类游戏,一打开,顶部还有广告,最讨厌游戏中还带广告的,点又点不掉,又怕误点,真的看了都烦。。。作为程序员,就有种想要把它干掉的想法,作为玩游戏没耐心的人,玩到一半过不了关总想看到最后一关是什么样。不知道你们有没有这种感觉。。。
这个游戏很适合给小学生做数学题(好像小学生以上的都很适合,哈哈),游戏中所要做的就是将下面标注着数字的水球切开或是粘合起来,以符合在框框里标注的数字。如果用手指将水球像两个方向拉伸,水球就变成了大小相同的两个小水球,而上面写着的数字就变成了原来的一半。而让两个小水球合并到一起,上面的数字就会加在一起。在画面中有的区域会出现小框里面也会标注相应的数字,让水球和这些框框里的数字相吻合,紧紧地嵌入框框就可以过关。
好了,下面直接进入正题吧,当前要解决的问题就是:1.去除广告 2.解锁关卡
需要的工具:
一:Android Killer
二:Reflector
拿到apk包后使用Android Killer反编译得到如下:
很明显这个游戏是使用Unity3D引擎开发的,那么,一般它的游戏逻辑都会写在assetsbinDataManagedAssembly-CSharp.dll这个文件里(也有一些会写在其他文件里)。
1.去除广告:
打开它的目录结构如下:
之前看过一篇去除广告的文章,一般它加载广告在smali中都会有invoke-virtual.........->loadAd........;(有些会在so文件里加载广告,这种方式更高级,这里就不说在so文件里是如何加载广告的,其实我也不懂在so文件里面是怎么加载广告的,哈哈哈。。。)那么我们直接就搜“->loadAd”看看,结果如下:
看到有3处调用了“loadAd”的地方,那我们就直接把它注释掉吧,不让它调用,
只需要在被调用的地方加个“#”号就行,这样就注释掉了。简单吧,哪里不要就“#”哪里,妈妈再也不用担心话费乱扣了。。。
注释掉之后,重新打包,运行如下:
这就对了嘛,真干净,看了就很爽。
去除广告成功,妈妈还会担心每个月几百块的话费哪里去吗,哈哈哈。。。
2.解锁关卡:
从上面我们知道使用Unity3D引擎开发的,那么我们直接把它拖入Reflector工具里查看,看到如下:
一般解锁关卡,无非就是unlock什么的,这里我们就直接在此工具下按键盘上的“F3”搜搜看:
看到了吧,里面有很多有关于关卡的解锁逻辑,
尝试过把UnlockAchievements()方法内的this.Level >=XX都改为
this.Level >=1(后面给出怎么修改的方式),但是这样修改,运行之后是没有看到有解锁关卡或别的什么。那肯定是我们没改对地方,导致解锁失败。
在里面我们还看到有LoadLevel(),LoadNextLevel(),这两个方法,
在游戏中我们可以看到界面中 上下关卡只有图中两个按钮。
再看看LoadLevel()这个方法里面好像也没有看到什么“+1”之类的逻辑,
再看看LoadNextLevel()这个方法,
到这里我们就基本锁定上下关卡就是在这里做的操作,但是一旦调用这个方法,进来立马就保存当前关卡,到下面就判断是否要载入上下关卡,那我们就让它一调用这个方法就先给Level加1,也就是this.Level++; 相反的在图中的 this.Level++ 和 this.Level-- ,就要变成
this.Level+=0; this.Level-=2; 因为上面已经加1了,所以这里else if 里面的判断就不能再加1了,而else里面的判断就要多减1,具体的看图:
这里补充一点:
要修改dll文件需要在你的Reflector/Addins目录下有这个两个文件
然后再配置这两个文件,如下图
配置完之后在Tools下就会多出Reflexil v1.6这个选项
终于要开始改了。。。。。。。
继续上面说的,点击Reflexil v1.6这个选项,看到如下:
那我们怎么添加呢,这里其实我也不懂,我也是参照它里面的语句
找到对应的语句就好办了,我们再这样操作,如下图:
添加:ldarg.0
添加:dup
添加ldfld System.Int32 StageController::Level ,
这里分成两步,第一步是OpCode,和Operand type
第二步:
在Operand中:
添加ldc.i4.1
添加add
添加stfld System.Int32 StageController::Level
这个跟上面添加ldfld System.Int32 StageController::Level 是一样的,这里就不贴图了,
最后添加成功后是这样,如下图:
注意:如果上面添加标签的时候不小心点到 ”Append”,会跑到最后去,记得删掉。否则也会报错。
到这里还没完,记得上面说的this.Level++ 和 this.Level-- ,要改为
this.Level+=0; this.Level-=2 ,这里就只贴加法的修改步骤,减法的自行修改
到这里就全部修改完成了,那接下来就是保存了
保存完成之后可以按键盘“F5”刷新一下,看有没有修改成功
最后就是重新打包这个apk文件,运行。。。
。
。
。
进入游戏后发现还是下一关卡按钮还是灰色的,说明没改对地方,这就尴尬了。。。
辛苦大半天还是一样。。。难道this.Level++不是在这改的吗,(这不是废话吗,如果改对了,还会有下文吗,哈哈哈。。。)
没办法了,回去看看哪里还有使用Level变量的。
直接鼠标左击”this.Level++”中的Level会跳到Level的出处,再右键点击Level,选择Analyze
一个是我们刚刚的LoadNextLevel(),还有另一个,那很有可能是在另一个地方被调用了,
很明显,这个两个方法都在同一个类下,右键图中对应的方法选择Go To Member
进入这个方法后看到如下:
改的方法跟上面是一样的,因为是在同一个类下,所以都一样,但是这里需要注意一下,因为它本来已经有this.Level=stageData.Level,直接修改就行,或者把这句对应的语句删掉再重新添加也行,修改后样子如下:
然后修改后,记得我们刚刚在LoadNextLevel()方法里添加的this.Level++记得要删除,
否则进入下一关卡的时候level就相当于加了两次。
好了,经过刚才添加,删除之后我们再保存这个文件(修改完之后最好F5刷新一下,看有没有修改成功),重新打包apk。
成功,嘿嘿
最后放一张gif动图,不知道发布出去,有没有动画效果。
总结:
1.移除XXX广告的方法,正在调用的时候就是一句话,所以只要注释掉关键点就行。
2.对dll文件的修改,利用一些关键词去修改,这只是我的一些思路,如果你有搞怪的方法,还请留言一起探讨下,我一开始也是蒙逼的,删除还好,但是增加就有点困难,特别是要用它里面的方法,一开始都不知道那是啥,哈哈,不过现在总算有点了解了。