首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测Apk中的代码篡改

检测Apk中的代码篡改
EN

Stack Overflow用户
提问于 2018-05-02 11:37:02
回答 2查看 1.6K关注 0票数 2

我对app开发特别陌生,最近了解到apk的整个签名过程,为什么它是强制性的,以及防止应用程序未经授权和篡改的重要性。著名的签名检查之一是使用PackageManager类进行签名验证。有没有其他方法可以检查apk本身的META-INF目录中的篡改或其他滥用行为,以验证应用程序没有被篡改,并且原始签名完好无损?

EN

回答 2

Stack Overflow用户

发布于 2018-12-04 16:18:08

此代码获取Classes.dex文件的CRC校验和,并将其与提供的校验和进行比较。

代码语言:javascript
复制
private void crcTest() throws IOException {
    boolean modified = false;
    // required dex crc value stored as a text string.
    // it could be any invisible layout element
    long dexCrc = Long.parseLong(Main.MyContext.getString(R.string.dex_crc));

    ZipFile zf = new ZipFile(Main.MyContext.getPackageCodePath());
    ZipEntry ze = zf.getEntry("classes.dex");

    if ( ze.getCrc() != dexCrc ) {
        // dex has been modified
        modified = true;
    }
    else {
        // dex not tampered with
        modified = false;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-04-10 21:21:17

最佳做法是无法打补丁的服务器端篡改检测

下面是如何实现的:

使用Android SafetyNet。这就是Android Pay自我验证的方式。

基本流程是:

  • 你的服务器生成一个随机数并发送到客户端应用程序。谷歌应用程序通过

Play

  • 发送带有该随机数的验证请求,验证本地设备是否未修改并通过CTS。
  • 谷歌签名的响应(“证明”)将返回给你的应用程序,其中包括通过/失败的结果和有关你的应用程序的APK的信息(散列和签名certificate).
  • Your应用程序将证明发送到你的服务器。
  • 你的服务器验证nonce和APK签名,然后将证明提交到谷歌服务器进行验证。谷歌检查认证签名,并告诉你它是否是真的。

如果这通过了,你可以相当有信心地相信,用户正在未经修改的系统上运行你的应用程序的正版。应用程序应该在启动时获得认证,并在每次事务请求时将其发送到您的服务器。

但请注意,这意味着:

安装了自定义或第三方只读存储器/固件/操作系统的

  • 用户将无法通过这些检查无法访问谷歌Play服务的
  • 用户(例如亚马逊设备、中国人)将无法通过这些检查

因此,...and将无法使用您的应用程序。您的公司需要做出业务决策,决定这些限制(以及随之而来的令人不快的用户)是否可以接受。

最后,要认识到这并不是一个完全无懈可击的解决方案。有了超级用户访问权限和Xposed,就有可能修改SafetyNet库来欺骗谷歌的服务器,告诉它们“正确”的答案,以获得谷歌签名的验证通过结果。实际上,SafetyNet只是移动了球门柱,使恶意攻击者更难做到这一点。由于这些检查最终必须在您无法控制的设备上运行,因此设计一个完全安全的系统确实是不可能的。

Read an excellent analysis of how the internals of SafetyNet work here.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50126775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档