安卓逆向初体验

最近在捣鼓安卓yuzu模拟器,发现一个问题:JoyCon通过蓝牙连接手机后,两个手柄无法识别为一个设备。电脑上可以用betterjoy解决,安卓上搜了一下据说Joy-Con Enabler这个app可以解决。下载下来发现需要付费才能开启,就研究了一下安卓逆向。

-1512082603.jpg

打开app,提示需要升级到PRO版,搜一下关键字

-1543368485.jpeg
-1543368519.jpeg

dump出apk,拖到jadx里定位到关键点,还好apk没有加壳,其实也就是看Java代码。可以看到第一个点是会判断hVar.f1655b是否为joycon_enabler_pro这个字符串

image.png
安卓逆向不能直接修改Java,需要修改smali字节码,随便搜一个语法教程:https://zhuanlan.zhihu.com/p/580962131,把if-eqz改成if-nez,反转一下逻辑即可绕过。 修改smali有很多种办法,mt管理器比较方便,但是需要买会员,所以后来选了个破解的np管理器,修改后自动签名,安装。
image.png
装上后发现不行,提示License校验失败,继续搜索关键字
https://cdn.nlark.com/yuque/0/2023/jpeg/1599908/1696757426460-d27f0c07-1bf7-47e8-9148-7c818da4b0b5.jpeg?x-oss-process=image%2Fresize%2Cw_1500%2Climit_0%2Finterlace%2C1#averageHue=%23b3c8e1&from=url&id=RQBTs&originHeight=1125&originWidth=1500&originalType=binary&ratio=2&rotation=0&showTitle=false&status=done&style=none&title=
发现这里jadx报错了,有一个小坑,需要改一下jadx的配置:文件 - 首选项 - 反编译 里面的显示不一致代码 选中 保存退出
image.png
然后就可以正常反编译了
image.png
发现有一个这样的逻辑:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public void a(Context context) {
    try {
        if (!context.getPackageManager().getPackageInfo(context.getPackageName(), 64).signatures[0].toCharsString().contentEquals(getResources().getString(R.string.sin))) {
            this.f502f = false;
        }
    } catch (PackageManager.NameNotFoundException unused) {
        this.f502f = false;
    }
    R = true;
}

问问GPT,发现是检验包签名,如果发现被篡改就把this.f502f设置为false

image.png

image.png
搜一下this.f502f这个变量在哪儿被赋值过
image.png
都给他强行赋值为true,这里有个坑:f502f是重命名后的结果,f502f的原名称是f,为了防止跟包名冲突
image.png
image.png

破解完终于可以正常启动了,可惜的是最后他这个软件还是无法使用。。。看了下评论都是在喷他不能用的,还好没有花钱买pro。。。

-1543367649.jpeg
-1543428131.jpeg

image.png
看了下代码,大概的原理是模拟了一个输入法,通过获取不同的蓝牙指令映射为不同的key。这个apk大概是5-6年前的,猜测可能是随着版本迭代key已经更新,也许更新一下最新的映射或许还能用?这部分就等后面有空了再研究吧。