我想实施安全检查 - 应用程序(或dex文件)的签名验证,以验证未修改的应用程序是否使用我的共享本地库(* .so)与NDK构建。我想直接在C++中执行所有签名检查,而不使用Java。目前我发现可以在这里访问apk文件:/data/app/--1/base.apk。从apk文件我猜可能得到原始的dex文件的内容可能甚至没有提取作为apk文件对齐。从android本地库中获取原始的dex文件
- 有谁知道如何阅读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/...)。
- 有没有其他更好的方法来检查应用程序是否是使用普通C++的本地库的原创? (不通过JNI调用Java)
对于应用程序认证,我实际上最终使用了类似于你最后一点的东西。我在META-INF/CERT.RSA中找到的Native库公共证书中进行了硬编码,并使用zlib来提取APK,并将嵌入的值与实际APK中找到的值进行比较。实际上嵌入的值字符串是加密的。这里不需要OpenSSL。攻击者必须攻击(例如调试)二进制本地库绕过这个检查,这是我想要的。 APK中的META-INF/CERT.RSA不能伪造 - Android可以确保这一点。 – jozols