android原生签名,如何在Android原生C中获得APK签名签名?

本文详细介绍了使用JNI从Android应用程序中获取签名和IssuerDN的过程,涉及PackageManager、PackageInfo、Signature和X509Certificate等关键组件的调用和操作。
摘要由CSDN通过智能技术生成

Sadegh Ghanb..

5

经过多次研究,我找到了可以获得签名和IssuerDN的代码.

JNIEXPORT void JNICALL

Java_org_telegram_messenger_ApplicationLoader_st(JNIEnv *env, jobject obj)

{

jclass cls = (*env)->GetObjectClass(env, obj);

jmethodID mid = (*env)->GetMethodID(env, cls,"getPackageManager" ,"()Landroid/content/pm/PackageManager;");

jobject packageManager = (*env)->CallObjectMethod(env, obj, mid);

// this.getPackageName()

mid = (*env)->GetMethodID(env, cls, "getPackageName", "()Ljava/lang/String;");//

jstring packageName = (jstring) (*env)->CallObjectMethod(env, obj, mid);

// packageManager->getPackageInfo(packageName, GET_SIGNATURES);

cls = (*env)->GetObjectClass(env, packageManager);

mid = (*env)->GetMethodID(env, cls, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");

jint flags = 0x00000040;

jobject packageInfo = (*env)->CallObjectMethod(env, packageManager, mid, packageName, flags);

// packageInfo->signatures

cls = (*env)->GetObjectClass(env, packageInfo);

jfieldID fid = (*env)->GetFieldID(env, cls, "signatures", "[Landroid/content/pm/Signature;");

jobject signatures = (*env)->GetObjectField(env, packageInfo, fid);

// signatures[0]

jobject signature = (*env)->GetObjectArrayElement(env, signatures, 0);

// signature->toByteArray()

cls = (*env)->GetObjectClass(env, signature);

mid = (*env)->GetMethodID(env, cls, "toByteArray", "()[B");

jbyteArray appSig = (*env)->CallObjectMethod(env, signature, mid);

// X509Certificate appCertificate = X509Certificate.getInstance(appSignature.toByteArray());

cls = (*env)->FindClass(env,"javax/security/cert/X509Certificate" );

if(cls !=0) {

int mid_static = (*env)->GetStaticMethodID(env, cls, "getInstance", "([B)Ljavax/security/cert/X509Certificate;");

if (mid_static != 0) {

jobject cerObj = (jstring) (*env)->CallStaticObjectMethod(env, cls, mid_static,appSig );//

jclass tmpCls = (*env)->GetObjectClass(env, cerObj);

jmethodID mid = (*env)->GetMethodID(env, tmpCls, "getIssuerDN","()Ljava/security/Principal;");

//Principal tmpObj = appCertificate.getIssuerDN();

jobject tmpObj = (*env)->CallObjectMethod(env, cerObj, mid);

cls = (*env)->GetObjectClass(env, tmpObj);

int mid2 = (*env)->GetMethodID(env, cls, "toString", "()Ljava/lang/String;");

jstring ow = (jstring) (*env)->CallObjectMethod(env, tmpObj, mid2);//get app Owner

const char *tmpOW = (*env)->GetStringUTFChars(env, ow, 0);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值