在Android NDK中识别调用应用程序

4

我有一个本地的Android库(.so),我正在将其与某些应用程序捆绑在一起。在本地代码中,我想要验证调用应用程序的签名者/包名称。

原因是,目前任何人都可以打开.apk文件,获取我的.so文件并用它来构建自己的应用程序。

是否有一种安全的方式从Java端识别调用应用程序?这可以是包名称、签名或任何其他可以唯一识别Android应用程序的东西。

2个回答

2

JNI代码与Java包名称耦合,只能从同一包和类中调用。为了进一步提高安全性,您可以从JNI代码中检查一些Java private static final字段。


另一个应用程序只需使用相同的包和类名调用函数即可。这并不困难,他们只需要查看.so文件中导出函数的列表。但我想,私有静态常量字段可以增加额外的安全性。攻击者仍然可以通过反汇编我的应用程序来绕过它,但这是一种很小的可能性。谢谢您的回答! - Szere Dyeri
攻击者总是可以打破你的防御。最好的安全措施是法律防御。 - ognian
你可以使用一些花哨的加密呼叫和响应协议来安排应用程序,但是任何你添加到.so文件中的检查都可以通过修改.so文件来禁用。你可以使代码的重复使用变得任意困难,但你无法使其变得不可能。决定你愿意投入多少努力。 - fadden

0
在本地代码中,我想要验证调用应用程序的签名者/包名。这个怎么样?
#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_x_y_TestActivity_stringFromJNI(JNIEnv *env, jobject thiz)
{ 
    jclass jActivity_class = env->GetObjectClass(thiz);
    jmethodID jMethod_id_pn = env->GetMethodID(jActivity_class,"getPackageName","()Ljava/lang/String;");
    jstring package_name = (jstring) env->CallObjectMethod(thiz,jMethod_id_pn);
    return package_name;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接