【APP逆向】通过修改smali代码绕过签名校验


一、签名校验

签名验证,就是在APP中写入自己私钥的hash值,和一个获取当前签名中的私钥hash值的函数两个值相一致,那么就说明APP没有被改动允许APP运行。如果两值不一致那么说明APP是被二次打包的,APP就自我销毁进程。

签名验证又可以在两个地方做,一个是在MainActivity.java的OnCreate函数中做,一个是在原生代码文件的JNI_OnLoad函数中做。

在OnCreate函数中做,短处是反编译者只要找到在OnCreate中定位到验证函数,然后将其注释,重新打包APP就可以成功运行;好处就是代码简单。

在JNI_OnLoad中做,短处是比较复杂(需要创建支持C/C++原生代码的项目,获取hash需要绕道java代码获取等);好处就是反编译者需要进一步掌握ida等反汇编工具将验证函数删除才能绕过验证。

为了最大限度地提高安全性,可以考滤两种验证都使用。

onCreate函数中:

public static void checkSigAsync(final Context context) {
        com.shuqi.android.a.b.adg().a(10001, 1, new c() {
            public boolean handleToken(int i, int i2) {
                try {
                    if (-1900000000 != context.getPackageManager().getPackageInfo(context.getPackageName(), 64).signatures[0].hashCode()) {
                        Process.killProcess(Process.myPid());  // 结束进程
                    }
                } catch (Exception e) {
                    System.exit(-1);
                }
                return true;
            }

            public int getMaxStep() {
                return 0;
            }
        });
    }
二、定位入口函数

假设这里经过我们二次打包签名后,重新安装在手机上的app打开即闪退,我们判断该app对签名做了校验,检测出我们二次打包了app导致闪退。

apktool反编译后的文件目录:

在这里插入图片描述
查看AndroidManifest.xml–>application–>android:name定位入口函数

在这里插入图片描述

android:name="android.taobao.atlas.startup.AtlasBridgeApplication"

关于AtlasBridgeApplication参考文章:

https://alibaba.github.io/atlas/code_read/atlas_start/atlas_start_1.html

https://blog.csdn.net/M075097/article/details/79225030?utm_source=blogxgwz2

构建过程中会把主工程中的manifest中声明的application会替换为框架中的AtlasBridgeApplication,而该Application是框架初始化的起点,反编译后可见实际的manifest文件中除了会合并所有子bundle的manifest之外还替换了之前声明的application的name。

构建过程中在主工程的manifest中添加了

<meta-data android:name="REAL_APPLICATION" android:value="com.xxxx.xxxx.xxxxApplication"/>//其中xxxxApplication即正常编码中写的自己的Application

其中xxxxApplication即正常编码中写的自己的Application,以下都直接使用RealAppliaction代替自己声明的Application。

构建过程中会根据build文件中配置的multidex_enable在主工程的Manifest中添加

<meta-data android:name="multidex_enable" android:value="true"/>

反编译后的AndroidManifest.xml中

在这里插入图片描述

即入口为ShuqiApplicationShell,这里结合jadx反编译后查看java源码

在这里插入图片描述
在这里插入图片描述
入口函数已经找到了,接下来我们应该找对签名校验的方法了。

三、定位校验签名函数

这里我们需要考虑一个问题,什么时候开始对签名进行校验的?

  • 打开app进入主界面了?已经进入app的生命周期
  • 打开app即闪退?app的生命周期之前
  • 亦或者是进入哪个页面才发生的闪退?已经进入app的生命周期

考虑以上问题的原因方便我们在AndroidManifest.xml定位相关函数

我们测试的app是打开即闪退,还没有进入生命周期,也就是说在入口函数的地方就做了校验。所以我们只需要在入口函数找到用来检验签名的方法对其修改便可绕过。

在这里插入图片描述
OnCreate是Android中的一个特别的函数,用来“表示一个窗口正在生成”。其不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置颜色等。

由上图可见入口类ShuqiApplicationShell继承了ShuqiApplication并调用了父类中的onCreate方法,所以我们需要到父类ShuqiApplication中查看onCreate方法执行了哪些逻辑,有没有执行校验签名的方法。

在这里插入图片描述

在父类ShuqiApplication中找到onCreate方法

在这里插入图片描述
阅读代码发现可疑函数checkSigAsync

在这里插入图片描述
跟踪函数查看里面的执行逻辑

在这里插入图片描述
到这里也就清楚了

在这里插入图片描述

四、修改smali绕过签名校验

根据com.shuqi.app.ShuqiApplication查找对应的smali代码进行修改

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们将这块代码直接删除就不会执行这里对应的逻辑,即可绕过验证

在这里插入图片描述

五、重新打包/签名/安装检验

打包

apktool b shuqi

签名

# 生成证书
keytool -genkeypair -alias roland.keystore -keyalg RSA -validity 500000 -keystore roland.keystore

# 用证书对app进行签名
jarsigner -verbose -keystore roland.keystore -signedjar shuqi_signed.apk shuqi.apk roland.keystore

安装检验

将修改代码后的apk重新打包签名后进行安装,检查是否还会发生闪退现象。

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多学点技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值