【问题标题】:How to get app package name or applicationId using JNI android如何使用 JNI android 获取应用程序包名称或 applicationId
【发布时间】:2017-03-21 04:59:38
【问题描述】:

对于共享库的保护问题,我会尝试使用 JNI 获取包名,但它会报错。那么,是否可以使用 JNI 获取包名或 applicationId?如果有人对此问题有示例或参考,则建议。因为没有任何好的教程或解决方案可用。其他任何其他方式都建议保护共享库。

【问题讨论】:

  • 不,你不能“使用 JNI 获取包名或 applicationId”
  • 有任何其他的保护解决方案。
  • “保护”是什么意思?
  • 库的可重用性,例如您为您的应用程序创建了一个共享库,但一些攻击者反编译 apk 并从应用程序中获取共享库。并重用于其他应用程序。
  • 所以以某种方式加密你的 .so 文件

标签: android android-ndk java-native-interface


【解决方案1】:

是的,这是可能的。 Android是基于Linux的,我们可以在内核提供的用户空间中获取大量信息。

在你的例子中,这里存储的信息/proc/${process_id}/cmdline

我们可以读取这个文件,得到应用的id。

看一个简单的例子

#include <jni.h>
#include <unistd.h>
#include <android/log.h>
#include <stdio.h>

#define TAG "YOURAPPTAG"

extern "C"
JNIEXPORT void JNICALL
Java_com_x_y_MyNative_showApplicationId(JNIEnv *env, jclass type) {

    pid_t pid = getpid();
    __android_log_print(ANDROID_LOG_DEBUG, TAG, "process id %d\n", pid);
    char path[64] = { 0 };
    sprintf(path, "/proc/%d/cmdline", pid);
    FILE *cmdline = fopen(path, "r");
    if (cmdline) {
        char application_id[64] = { 0 };
        fread(application_id, sizeof(application_id), 1, cmdline);
        __android_log_print(ANDROID_LOG_DEBUG, TAG, "application id %s\n", application_id);
        fclose(cmdline);
    }
}

【讨论】:

  • 您可以更轻松地使用/proc/self/cmdline,从而跳过对getpid()的调用。
【解决方案2】:

这对我有用:

  static jstring get_package_name(
      JNIEnv *env,
      jobject jActivity
  ) {
    jclass jActivity_class = env->GetObjectClass(jActivity);

    jmethodID jMethod_id_pn = env->GetMethodID(
        jActivity_class,
        "getPackageName",
        "()Ljava/lang/String;");
    jstring package_name = (jstring) env->CallObjectMethod(
        jActivity,
        jMethod_id_pn);

    return package_name;
  }

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2023-04-08
    • 1970-01-01
    • 2014-01-19
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多