加固了就安全了?几个措施让你的 Android 应用更安全

本文讲述了作者在发现其Android应用被破解后,进行的一系列安全分析和加固措施,包括检查和校验应用签名、防范二次打包、防止方法被hook等。通过这些措施,旨在提高应用的安全性,防止恶意篡改。

1、背景

最近新开发了一款工具类型的软件 移动工具箱,然而某天下午忽然群里来了一个不速之客说我的软件被破解了。虽然,该软件无需付费并且没有广告(很良心 😃 ),也进行了安全加固,但是还是很轻易得被别人破解了。现象是,启动页换成了别人的页面,需要用户点击页面上的按钮分享几次破解者的信息才能进入应用。并且,每次打开应用都是如此。

看到这我的心情还是非常复杂的。一开始觉得自己做个应用都赚不到钱,还要被这些人利用。本是同根生,相煎何太急呀。然而,转念一想,这里有些东西还是可以学习一下,于是我去他们的链接下载了软件,本着学习的精神进行了一波分析并制定了几个方案来加强应用安全。

2、分析

2.1 检查破解应用签名

决定要进行分析之后,我首先想到的就是去检查下应用的签名,这里使用 keytool 即可,指令如下:

keytool -printcert -jarfile 你的apk地址

获取的结果如下,

很显然,应用的签名已经发生了变化,应用被别人二次打包了。实际上,我的应用是在 360 上面进行了软件加固(免费版),但是还是如此轻松地被别人完成了二次打包。

2.2 签名校验

如果仅仅是签名发生了变化,那么解决方式倒也简单。在应用内部增加一个签名校验就可以了。不过签名校验也有需要注意的地方。其一,签名校验可以放在 Java 层来完成,也可以放在 native 层通过 C++ 来完成。其二,在应用内部进行整个数字签名的校验还是部分校验。这是因为如果写入完整的数字签名很容易被别人发现,即便写入到 so 中,写入完整字符串比部分更容易被别人找到。

在 Java 中,你可以按照下面这种方式获取应用的数字签名。我已经把相关的方法写成了工具类,你可以在 Github 上面获取 AppUtils

    public static String getAppSignatureMD5(final String packageName) {
   
   
        return getAppSignatureHash(packageName, "MD5");
    }

    private static String getAppSignatureHash(final String packageName, final String algorithm) {
   
   
        if (StringUtils.isSpace(packageName)) return "";
        Signature[] signature = getAppSignature(packageName);
        if (signature == null || signature.length <= 0) return "";
        return StringUtils.bytes2HexString(EncryptUtils.hashTemplate(signature[0].toByteArray(), algorithm
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值