2016-11-05 79 views
1

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

  1. 有谁知道如何阅读dex文件,而无需从apk中提取?

我说原来的dex文件,因为如果我理解正确(并纠正我,如果我错了)当apk安装时,dex文件被转换为ELF共享对象 - 特定于设备体系结构的二进制可执行文件。这就是为什么我无法检查/验证/ proc/self/maps中列出的* .dex文件的签名的原因(例如:/data/dalvik-cache/x86/[email protected]@[email protected] .apk @ classes.dex),因为在编译时不可能知道签名,因为dex文件将被更改。

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

  1. 有没有其他更好的方法来检查应用程序是否是使用普通C++的本地库的原创? (不通过JNI调用Java)

回答

1
  1. 有没有人知道如何阅读dex文件,而无需从apk中提取?

副手,我想不出有办法做到这一点。

  1. 有没有其他更好的方法来检查应用程序是否是使用普通C++的本地库的原创? (不通过JNI调用Java)

我能想到的一些(和他们的帽子全都是疯):

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

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

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

对于应用程序认证,我实际上最终使用了类似于你最后一点的东西。我在META-INF/CERT.RSA中找到的Native库公共证书中进行了硬编码,并使用zlib来提取APK,并将嵌入的值与实际APK中找到的值进行比较。实际上嵌入的值字符串是加密的。这里不需要OpenSSL。攻击者必须攻击(例如调试)二进制本地库绕过这个检查,这是我想要的。 APK中的META-INF/CERT.RSA不能伪造 - Android可以确保这一点。 – jozols

相关问题