安卓逆向之艺术签名

2020年04月20日 223点热度 1人点赞 0条评论

操作

第一步我们先查看一下软件是否加壳,经过检查发现,软件并未加壳。然后需要重新编译一下,用于判断当前软件是否有签名检查,以免一顿操作,发现无法使用。使用下面命令进行重新编译
# 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就不放出来了,想研究的自己找吧,这里之当做一下笔记。

Sollyu

保持饥渴的专注,追求最佳的品质