操作
第一步我们先查看一下软件是否加壳,经过检查发现,软件并未加壳。然后需要重新编译一下,用于判断当前软件是否有签名检查,以免一顿操作,发现无法使用。使用下面命令进行重新编译
# apk 拆包
$ java -jar apktool_2.4.1.jar d com.universal.artsignature.apk
# apk 打包
$ java -jar apktool_2.4.1.jar b -o rebuild-unsigned.apk com.universal.artsignature
# 进行签名
$ jarsigner \
-verbose \
-keystore debug.keystore \
-storepass android \
-keypass android \
-signedjar rebuild-signed.apk \
rebuild-unsigned.apk \
androiddebugkey
# 安装重新签名的apk
$ adb install -r rebuild-signed.apk
安装完运行,发现可以正常打开软件,但是进入界面之后又弹出了下面界面,看来还是有签名检查。
移除签名
安装提示,寻找字符串【更新】,发现只有一处匹配,应该就是提示的地方。

定位到代码,然后直接将这个方法清空,暴力手段,眼不见心不烦。这里只是将显示地方删除了,程序的后台还是该怎么检查还是这么检查,这个治标不治本。

重新打包、签名、安装后发现已经没有这个提示了,OK,这部分搞定。
经过测试发现,这样并不能完美的移除签名检查,因为免费的签名可不可以使用,我们还需要进一步的破解签名检查。
定位到获取软件签名的代码,发现是这样写的

知道了逻辑,那就手写一个app,用来检测这个app的返回值,具体代码:
val md5:String= view.context.packageManager.getPackageInfo("com.universal.artsignature", PackageManager.GET_SIGNATURES).signatures[0].toByteArray().md5()
logger.info("MainActivity|onClickRunTest|md5={}", md5)
得出的结果是:
05cb73988cec20986f33e87e3bdcf3dd
,有了这个,那咱门就可以修改方法了。修改后是这样的:
# direct methods
.method public static a(Landroid/content/Context;)Ljava/lang/String;
.locals 2
const-string v0, "05cb73988cec20986f33e87e3bdcf3dd"
return-object v0
.end method
支付破解
随便找个能付费的地方,寻找特征,如下面特征【支付失败】

然后去代码中搜索【支付失败】,发现有三处,明显第一个更符合特征,第一处追进去查看代码如下:

发现检查逻辑极其简单,之判断了一个
z
参数,如果
z == true
就执行正常代码,其他情况就显示支付失败的提示。 明白了逻辑,直接修改smali代码:

然后运行,发现这样就OK了,付费的就可以免费用了。App就不放出来了,想研究的自己找吧,这里之当做一下笔记。