【问题标题】:Get original dex file from android native library从android原生库中获取原始的dex文件
【发布时间】:2016-11-25 03:54:29
【问题描述】:

我想实施安全检查 - 应用程序(或 dex 文件)的签名验证,以验证未修改的应用程序使用我的共享本机库 (*.so) 与 NDK 构建。我想直接在 C++ 中执行所有签名检查,而不使用 Java。目前我发现可以在这里访问apk文件:/data/app/--1/base.apk。从 apk 文件中,我猜即使没有提取,也可能获取原始 dex 文件的内容,因为 apk 文件已对齐。

  1. 有人知道如何在不从 apk 中提取的情况下读取 dex 文件吗?

我说原始 dex 文件是因为如果我理解正确(如果我错了,请纠正我)dex 文件会在安装 apk 时转换为 ELF 共享对象 - 特定于设备架构的二进制可执行文件。这就是我无法检查/验证 /proc/self/maps 中列出的 *.dex 文件签名的原因(例如:/data/dalvik-cache/x86/data@app@com.asdf.pkg@base .apk@classes.dex) 因为在编译时无法知道签名,因为 dex 文件会被更改。

我知道检查原始 dex 文件的方法不是很安全,因为我认为它可以通过替换优化的 dex 文件在有根设备上轻松绕过 - 只需在自定义 dex 文件上运行 dex2oat 并将其放在 (/data/dalvik-缓存/...)。

  1. 还有其他更好的方法来检查应用程序是否来自使用纯 C++ 的原生库吗? (不通过 JNI 调用 Java)

【问题讨论】:

    标签: android c++ android-ndk dex


    【解决方案1】:
    1. 有人知道如何在不从 apk 中提取的情况下读取 dex 文件吗?

    顺便说一句,我想不出办法。

    1. 还有其他更好的方法来检查应用程序是否来自使用纯 C++ 的本机库的原始文件吗? (不通过 JNI 调用 Java)

    我能想到几个(他们都疯了):

    1. 对 APK 进行哈希处理,并与外部 Web 服务器上的哈希值进行比较。无法对哈希进行硬编码,因为这样做会更改哈希。这应该是最简单的。对于奖励积分,请将其保存在本地,这样以后的运行将不需要网络连接。
    2. 在您的应用程序中嵌入 jarsigner。将它放在您的资产文件夹中,并使用 exec 或任何 C++ 使用的本机调用它。 Hosting an executable within Android application 说有可能。 Oracle documentation of jarsigner 表示自签名 jar 为发布者输出 UNKNOWN。不太可能有人将应用程序上传到 Google Play,但理论上他们可以使用真实证书对其进行签名,因此不确定这是否真的安全。然后,您应该能够检查它是否使用您的证书签名。

    对于像我这样使用基于 Intel 的设备的愚蠢的人来说可能会失败。

    1. 火和硫磺。使用zlib解压并使用OpenSSL检查证书。在尝试这个之前,我会认真考虑转行,但是,我不是 C/C++ 的粉丝。

    【讨论】:

    • 对于应用程序身份验证,我实际上最终使用了与您最后一点类似的东西。我在 META-INF/CERT.RSA 中找到的本机库公共证书中进行了硬编码,并使用 zlib 提取 APK 并将嵌入的值与实际 APK 中的值进行比较。实际上嵌入的值字符串是加密的。这里不需要 OpenSSL。攻击者必须攻击(例如调试)二进制本机库来绕过我想要的这个检查。无法伪造 APK 中的 META-INF/CERT.RSA - Android 可确保这一点。
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多