最近在捣鼓安卓yuzu模拟器,发现一个问题:JoyCon通过蓝牙连接手机后,两个手柄无法识别为一个设备。电脑上可以用betterjoy解决,安卓上搜了一下据说Joy-Con Enabler这个app可以解决。下载下来发现需要付费才能开启,就研究了一下安卓逆向。
打开app,提示需要升级到PRO版,搜一下关键字
dump出apk,拖到jadx里定位到关键点,还好apk没有加壳,其实也就是看Java代码。可以看到第一个点是会判断hVar.f1655b是否为joyconenablerpro这个字符串安卓逆向不能直接修改Java,需要修改smali字节码,随便搜一个语法教程:https://zhuanlan.zhihu.com/p/580962131,把if-eqz改成if-nez,反转一下逻辑即可绕过。修改smali有很多种办法,mt管理器比较方便,但是需要买会员,所以后来选了个破解的np管理器,修改后自动签名,安装。装上后发现不行,提示License校验失败,继续搜索关键字发现这里jadx报错了,有一个小坑,需要改一下jadx的配置:文件 - 首选项 - 反编译 里面的显示不一致代码 选中 保存退出然后就可以正常反编译了发现有一个这样的逻辑:
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
搜一下this.f502f这个变量在哪儿被赋值过都给他强行赋值为true,这里有个坑:f502f是重命名后的结果,f502f的原名称是f,为了防止跟包名冲突了
破解完终于可以正常启动了,可惜的是最后他这个软件还是无法使用。。。看了下评论都是在喷他不能用的,还好没有花钱买pro。。。
看了下代码,大概的原理是模拟了一个输入法,通过获取不同的蓝牙指令映射为不同的key。这个apk大概是5-6年前的,猜测可能是随着版本迭代key已经更新,也许更新一下最新的映射或许还能用?这部分就等后面有空了再研究吧。