抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

果然, 从小到大, 我最大的动力来源就是玩游戏耍帅… 今天本来是想打猎了但是回不去广州, 只好玩3ds上的4G, 然而这毕竟5年前的老游戏了, 那时怪猎在中文圈可能也不火… 基本找不到任何想要的中文资料(Ping’s Dex因为系统原因用着不太方便), 所以为了好好打游戏…我把黑手伸向了一个需要看广告才能好好用的app….

这个App的收费点在于看广告换积分, 然后凭积分兑换配装器的特定功能次数. 因此我原本的目标是让积分无限或者让兑换的使用次数无限. 我本来想的是程序代码里应该有这么个变量, 没使用一次变量数值就会下降, 我把下降的这一行代码去掉, 那就可以无限使用了.

那么就来操作上.

解包和解析Apk

实际上一个Apk文件就是个压缩包, 直接unzip就可以了, 解压后的软件包应该会包括很多部分, 其中实际的执行文件会是*.dex, 这是编译后的执行文件, 解析的话需要先把这个文件转换为jar, 我使用的是enjarify, 来自github, 克隆下来就能用.

1
2
unzip your.apk
/path/tool/enjarify.sh classes.dex

接下来就是查看java代码了, 我使用的是jd-gui, AUR上可以能找到(aur/jd-gui-bin), 将文件拖进去就行. 这里就纯粹是代码阅读了, 由于代码不是咱写的, 而且作者为了保护自己也可能会加上一些混淆的东西, 可能会难定位. 所以我就想到了靠日志定位的方式:

  1. 首先使用adb shell连接手机终端, pm list packages查看目标app的名称
  2. 根据名称抓取指定app的日志adb logcat device_id|grep you.app.name
  3. 在手机上操作这个app, 比如我就进入了app的付费页面, 就能从日志上看到是调用了什么class

完成定位后就很枯燥了… 猜指定文件中的代码逻辑怎样(毕竟我根本不懂java…), 然后尝试想一个解决方案,

反编译Apk并对代码进行修改

我使用的是apktools, 加了archlinuxcn源之后直接sudo pacman -S android-apktool就行, 安装好了之后apktool d your.apk进行反编译就行了.

反编译后进入产生文件夹的smali文件夹内, 这个文件夹和jar里面的看到的java项目的目录结构是一样的, 只不过里面的是smali这种汇编语言的代码, 而不是java. 虽然语言不一样(甚至里面部分实现逻辑都是不太一样的), 但是实现一样的东西, 所以根据前面看过的java代码, 可以对应去文件里找相应的部分, 找到之后就可以按照smali的语法对代码进行更改了.

重打包与签名

修改完代码文件就可以用修改后的文件夹重新生成Apk文件了: apktool b -o your.mod.apk your_path.

不过重新打包的Apk是不能直接用的, 还得签名… 这个签名完整的过程是要先给信息生成密钥, 然后再签名, 我觉得太麻烦就直接github上找了一个快速签名用的项目uber-apk-signer, 直接给未注册的Apk文件, 他会用内置的测试签名快速签, 然后就能装来用了.

1
java -jar  uber-apk-signer-1.1.0.jar --apks your.mod.apk

之后就是对修改后的App进行测试, 如果没有达到效果就再改就是了. 然后我实际上没有达到最初预想的效果, 因为我并没有在代码中找到那个数值下降的位置(因为实在看不懂java), 但是我却在购买的位置找到了判断积分是否充足的部分, 于是我直接跳过这个判断, 直接让积分兑换完成, 换了个方式实现了我要的效果… 唯一不足的就是… 我还得进购买页面疯狂兑换去…

嘛, 毕竟这么做对原作者不好… 所以我就不给App名称和实际的代码了…

不知道这次的技能以后会不会又在奇怪的地方有奇效…

评论

留下友善的评论吧~