標籤:
使用Android JNI 擷取應用程式簽名。
擷取基礎上產生自己的簽名password,這可以防止別人反編譯找到自己的原始碼password。
jstring Java_com_masonsdk_jni_JNIUtil_getPWD(JNIEnv* env, jobject thizz,jobject thiz){jclass native_clazz = env->GetObjectClass(thiz); // 得到 getPackageManager 方法的 ID jmethodID methodID_func =env->GetMethodID(native_clazz,"getPackageManager", "()Landroid/content/pm/PackageManager;"); // 獲得應用程式套件的管理器 jobject package_manager = env->CallObjectMethod(thiz, methodID_func); // 獲得 PackageManager 類 jclass pm_clazz = env->GetObjectClass(package_manager); // 得到 getPackageInfo 方法的 ID jmethodID methodID_pm = env->GetMethodID( pm_clazz, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); //擷取包名 jmethodID methodID_packagename =env->GetMethodID(native_clazz,"getPackageName", "()Ljava/lang/String;"); jstring name_str = static_cast<jstring>(env->CallObjectMethod(thiz, methodID_packagename)); // 獲得應用程式套件的資訊 jobject package_info = env->CallObjectMethod(package_manager, methodID_pm, name_str, 64);//env->NewStringUTF("com.example.contasdf") // 獲得 PackageInfo 類 jclass pi_clazz = env->GetObjectClass( package_info); // 獲得簽名數組屬性的 ID jfieldID fieldID_signatures = env->GetFieldID( pi_clazz, "signatures", "[Landroid/content/pm/Signature;"); // 得到簽名數組。待改動 jobject signatur = env->GetObjectField(package_info, fieldID_signatures); jobjectArray signatures = reinterpret_cast<jobjectArray>(signatur); // 得到簽名 jobject signature = env->GetObjectArrayElement(signatures, 0); // 獲得 Signature 類。待改動 jclass s_clazz = env->GetObjectClass(signature); // 得到 hashCode 方法的 ID jmethodID methodID_hc = env->GetMethodID(s_clazz, "hashCode", "()I"); // 獲得應用程式套件的管理器,待改動 int hash_code = env->CallIntMethod(signature, methodID_hc); char str[100]; sprintf(str, "%u", hash_code); return env->NewStringUTF(str);}
原始碼:
https://github.com/mentor811/AndroidUltimateEncrypt
【 聲明:著作權全部分,歡迎轉載,不用於商業用途。 --天盟】
著作權聲明:本文部落格原創文章。部落格,未經同意,不得轉載。
Android JNI 擷取應用程式簽名