从android本机库获取原始dex文件

时间:2016-11-05 13:21:41

标签: android c++ android-ndk dex

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

  1. 有没有人知道如何在没有从apk中提取的情况下阅读dex文件?
  2. 我说原始dex文件,因为如果我理解正确(并且如果我错了就纠正我的话)dex文件在安装apk时被转换为ELF共享对象 - 特定于设备架构的二进制可执行文件。这就是为什么我无法检查/验证/ proc / self / maps中列出的* .dex文件的签名的原因(例如:/data/dalvik-cache/x86/data@app@com.asdf.pkg@base .apk @ classes.dex)因为在编译时无法知道签名,因为dex文件将被更改。

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

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

1 个答案:

答案 0 :(得分:1)

  1. 有没有人知道如何在没有从apk中提取的情况下阅读dex文件?
  2. 副手,我想不出办法做到这一点。

    1. 还有其他更好的方法可以使用普通的C ++来检查应用程序是否来自本机库的原始应用程序? (不通过JNI调用Java)
    2. 我能想到几个(而且他们都像帽子一样疯狂):

      1. 执行APK的哈希并与外部Web服务器上的哈希进行比较。无法硬编码哈希,因为这样做会改变哈希值。这应该是最简单的。对于奖励积分,请在本地保存,以便将来运行不需要网络连接。
      2. 在您的应用中嵌入jarsigner。将它放在您的assets文件夹中,并使用exec或C ++使用的任何内容从本机调用它。 Hosting an executable within Android application说可以做到。 Oracle documentation of jarsigner说自签名罐子为出版商输出UNKNOWN。有人不太可能将应用程序上传到Google Play,但理论上他们可以使用正版证书对其进行签名,因此不确定这是否真的安全。然后,您应该能够检查它是否已使用您的证书签名。
      3. 对于像我这样使用基于英特尔设备的愚蠢的人来说可能会失败。

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