2021年8月28日
简介
最近在论坛看到一款卡西欧高级计算器,当初在初中可是被誉为神器,没想到有手机版
原帖中有破解思路,所以萌新我不妨来试试
原帖:https://www.52pojie.cn/thread-1499562-1-1.html
APP
从play商店下载后用skit把安装包导出,得到CalcES (5.2.9.702).apk
谷歌原版安装包,蓝奏:https://wwa.lanzoui.com/ipAa8ta09ve
支持正版,不提供成品下载
打开,发现高级版需要购买,嘿嘿嘿
Crake步骤
找一些关键词:lifetime purchase ,高级,广告,theme,license,free,plus,premium,pro,……
中文有可能是Unicode编码
用论坛的androidkiller反编译apk
求助大佬们现在有没有比ak更好用的工具
搜索下上面提到的一些关键词,点进去观察下,发现premium比较可疑
看搜索结果
res中多为一些资源文件,string name是不是很熟悉
smali advanced中猜测是一些解锁后高级功能的程序
一个一个点进去发现这个比较可疑
有跳转而且附近还有一个“free”
观察逻辑发现if-else中调用的函数都是相同的,唯一的不同点就是premium和free
可以直接改字,或者将if --> if not
编译
出大问题,没报错但是编译失败
具体输出:https://txtpad.cn/apktoolbuildfailure
看上去大多数是资源问题
试过apktool版本后,发现需要编译时需要忽略资源(似乎是反编译导致xml乱码)
双击加个参数 -r
重新反编译后编译成功,但是没有解锁
但是没有实现crake,回到刚刚的代码
分支是通过判断 v1的,看起来判断后的内容并不是关键,有可能只是界面的显示功能,也可能其他地方也会判断v1的值
可以看到v1调用了f/b/h/i/e中的c函数返回的Boolean
找到c函数
打开后c函数详细内容
.method public static c(Landroid/content/Context;)Z
.locals 3
new-instance v0, Ljava/io/File;
invoke-virtual {p0}, Landroid/content/Context;->getFilesDir()Ljava/io/File;
move-result-object v1
const-string v2, "license"
invoke-direct {v0, v1, v2}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V
invoke-virtual {v0}, Ljava/io/File;->exists()Z
move-result v1
if-eqz v1, :cond_0
invoke-static {v0}, Lf/b/h/i/e;->e(Ljava/io/File;)Ljava/lang/String;
move-result-object v0
if-eqz v0, :cond_0
invoke-virtual {v0}, Ljava/lang/String;->isEmpty()Z
move-result v1
if-nez v1, :cond_0
invoke-static {v0}, Le/u/m/g;->b(Ljava/lang/String;)Ljava/lang/String;
move-result-object v0
invoke-static {p0}, Lf/b/h/i/c;->a(Landroid/content/Context;)Ljava/lang/String;
move-result-object p0
invoke-virtual {v0, p0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result p0
return p0
:cond_0
const/4 p0, 0x0
return p0
.end method
函数大致意思应该是判断一个license文件及内容,发现有很多cond_0,一系列的判断失败都return 0,简单粗暴直接改为检查失败return 1
const/4 p0, 0x1
编译安装试试
编译签名安装成功
可以看到激活已经没有了
总结
很简单的一个app尝试,关键点比较好找,但在实践中出现的一些问题加深了我的理解,发出来给大家乐呵乐呵
难点和疑问
使用方法
shift对应按键左上标功能,alpha对应右上角字母运算符
还有好多功能,编程都有,不过有些功能需要外网