Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中使用JNI獲得APK簽名的哈希值

Android中使用JNI獲得APK簽名的哈希值

編輯:關於Android編程

  最近在研究android應用中的安全問題,貌似只有將核心代碼寫到JNI底層才是最安全的。通過底層來判斷簽名是否正確,如果正確則繼續執行核心代碼,否則退出程序,這樣就可以防止別人惡意反編譯,並進行二次打包。所以這裡的關鍵就是如何在JNI中獲得簽名。

  我上網查了好多資料,都沒有現成的答案,但是我慢慢的找到了一些思路,於是潛心研究,終於有了結果。不敢獨享,所以過來分享給大家。

  大家都知道,在android中的java代碼裡獲得簽名的哈希值,很簡單,過程如下:

	try {
            PackageInfo packageInfo = getPackageManager().getPackageInfo(
                    "com.klxx.as", PackageManager.GET_SIGNATURES);
            Signature[] signs = packageInfo.signatures;
            Signature sign = signs[0];
            Log.i("test", "hashCode : "+sign.hashCode());
        } catch (Exception e) {
            e.printStackTrace();
        }

  在JNI中提供了許多方法,可以反向調用java中的方法,比如下面一句代碼:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.klxx.as", PackageManager.GET_SIGNATURES);
  我們可以用JNI寫成這樣:

	// 獲得 Context 類
	jclass native_clazz = (*env)->GetObjectClass(env, context);

	// 得到 getPackageManager 方法的 ID
	jmethodID methodID_func = (*env)->GetMethodID(env, native_clazz,
			"getPackageManager", "()Landroid/content/pm/PackageManager;");

	// 獲得應用包的管理器
	jobject package_manager = (*env)->CallObjectMethod(env, thiz, methodID_func);

	// 獲得 PackageManager 類
	jclass pm_clazz = (*env)->GetObjectClass(env, package_manager);

	// 得到 getPackageInfo 方法的 ID
	jmethodID methodID_pm = (*env)->GetMethodID(env, pm_clazz,
			"getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");

	// 獲得應用包的信息
	jobject package_info = (*env)->CallObjectMethod(env, package_manager,
			methodID_pm, (*env)->NewStringUTF(env, "com.example.hellojni"), 64);
  這種方法在java中叫做反射,更多的JNI反射方法可以參考博客《android開發之絕對安全(三) JNI方法集合》。
  通過類似於這種反射機制,我進行一步一步調試和解析,終於獲得了應用的簽名信息,並從簽名信息中獲得了簽名的哈希值。

  我將這段代碼傳到了CSDN上,歡迎大家下載,如果有什麼漏洞,也歡迎大家指點一下。

  下載地址:http://download.csdn.net/detail/iloveyoueveryday/6909583 。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved