· 6 years ago · Oct 31, 2019, 12:42 PM
1extern "C"
2JNIEXPORT jobject JNICALL
3Java_com_mp3_music_player_invenio_A_test(JNIEnv *env, jobject thiz,
4 jobject contexObject) {
5
6 /**
7 * GET PACKAGE NAME
8 */
9 jclass contextTemp = env->FindClass("android/content/Context");
10 jclass contextClass = (jclass) env->NewGlobalRef(contextTemp);
11 jmethodID getPackageManager = env->GetMethodID(contextClass,
12 "getPackageManager",
13 "()Landroid/content/pm/PackageManager;");
14 jobject share = (jobject) env->CallObjectMethod(contexObject, getPackageManager);
15
16 jmethodID getPackageName = env->GetMethodID(contextClass, "getPackageName",
17 "()Ljava/lang/String;");
18 jstring packageName = (jstring) env->CallObjectMethod(contexObject, getPackageName);
19
20 //<===================================================================================>
21
22 /**
23 * GET APPLICATION ID
24 */
25 pid_t pid = getpid();
26 char path[64] = { 0 };
27 sprintf(path, "/proc/%d/cmdline", pid);
28 FILE *cmdline = fopen(path, "r");
29 char application_id[64] = { 0 };
30
31 if (cmdline) {
32 fread(application_id, sizeof(application_id), 1, cmdline);
33 fclose(cmdline);
34 }
35
36 //<===================================================================================>
37
38
39 /**
40 * GET SHA1
41 */
42 jclass clazz = env->FindClass("android/content/pm/PackageManager");
43
44 jfieldID GET_SIGNATURESfid = env->GetStaticFieldID(clazz, "GET_SIGNATURES", "I");
45 jint GET_SIGNATURES = env->GetStaticIntField(clazz, GET_SIGNATURESfid);
46 jclass PackageManagerObj = (jclass) env->NewGlobalRef(clazz);
47 jmethodID getPackageInfoId = env->GetMethodID(PackageManagerObj, "getPackageInfo",
48 "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
49 jobject getPackageInfoObject = (jobject) env->CallObjectMethod(share, getPackageInfoId,
50 packageName, GET_SIGNATURES);
51 jclass packageInfoClass = env->FindClass("android/content/pm/PackageInfo");
52 jfieldID signatures = env->GetFieldID(packageInfoClass, "signatures",
53 "[Landroid/content/pm/Signature;");
54 jobjectArray rows = reinterpret_cast<jobjectArray>(
55 env->GetObjectField(getPackageInfoObject, signatures));
56 int size = env->GetArrayLength(rows);
57 jclass signaturesClass = env->FindClass("android/content/pm/Signature");
58 jclass mEssage = env->FindClass("java/security/MessageDigest");
59 jclass MessageDigestClass = (jclass) env->NewGlobalRef(mEssage);
60 jmethodID mGetInstance = env->GetStaticMethodID(MessageDigestClass, "getInstance",
61 "(Ljava/lang/String;)Ljava/security/MessageDigest;");
62 jmethodID updateMethod = env->GetMethodID(MessageDigestClass, "update", "([B)V");
63 jmethodID toByteArrayMethod = env->GetMethodID(signaturesClass, "toByteArray", "()[B");
64
65 jclass tempBase64 = env->FindClass("android/util/Base64");
66 jclass Base64Class = (jclass) env->NewGlobalRef(tempBase64);
67
68 jmethodID encodeToStringID = env->GetStaticMethodID(Base64Class, "encodeToString",
69 "([BI)Ljava/lang/String;");
70
71 jmethodID digest = env->GetMethodID(MessageDigestClass, "digest", "()[B");
72 jstring apkSHA1 = (jstring) "";
73 for (int i = 0; i < size; i++) {
74 jobject messageDigest = env->CallStaticObjectMethod(MessageDigestClass, mGetInstance,
75 env->NewStringUTF("SHA"));
76 jobject signature = env->GetObjectArrayElement(rows, i);
77 env->CallVoidMethod(messageDigest, updateMethod,
78 (jbyteArray) env->CallObjectMethod(signature, toByteArrayMethod));
79 apkSHA1 = (jstring) env->CallStaticObjectMethod(Base64Class, encodeToStringID,
80 env->CallObjectMethod(messageDigest,
81 digest),
82 (jint) 0);
83 break;
84 }
85
86 //<======================================================================================>
87
88 char package[count + 1] = {'\0'};
89 memset(package, 0x0, count);
90 getPackage(package);
91 char sha[100] = {'\0'};
92 getSecretSHA(sha);
93
94 char appId[100] = {'\0'};
95 getApplicationId(appId);
96
97 __android_log_print(ANDROID_LOG_ERROR,"TAG", "sha origin %s input %s", sha, env->GetStringUTFChars(apkSHA1,0));
98 __android_log_print(ANDROID_LOG_ERROR,"TAG", "package origin %s input %s", package, env->GetStringUTFChars(packageName,0));
99 __android_log_print(ANDROID_LOG_ERROR,"TAG", "appid origin %s input %s", appId, application_id);
100
101 if(compare(package, (char *)env->GetStringUTFChars(packageName,0))
102 && (cmdline && compare(application_id, appId))
103 &&compare(sha, (char*)env->GetStringUTFChars(apkSHA1,0))){
104
105 __android_log_print(ANDROID_LOG_ERROR, "TAG", "COMPARE");
106 char prefix [100] = {'\0'};
107 getSecretPrefix(prefix);
108 __android_log_print(ANDROID_LOG_ERROR, "TAG", "prefix %s", prefix);
109 char* res = const_cast<char *>(base64_decode(encoded).c_str());
110 __android_log_print(ANDROID_LOG_ERROR, "TAG", "ENCODED 1 %s size %d", res, strlen(res));
111 const size_t len = strlen(res);
112 for(int i=0; i<len/2; i++)
113 {
114 char temp=res[i];
115 res[i]=res[len-i-1];
116 res[len-i-1]=temp;
117 }
118 __android_log_print(ANDROID_LOG_ERROR, "TAG", "ENCODED 2 %s", res);
119// const char* ivEncrypt = base64_decode(iv).c_str();
120// char* iv = xorEncryptDecrypt((char*)ivEncrypt, prefix);
121
122 jclass secretKeyFactory = env->FindClass("javax/crypto/SecretKeyFactory");
123 jmethodID skfConstructor = env->GetStaticMethodID(secretKeyFactory, "getInstance",
124 "(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;");
125 jstring skfString = env->NewStringUTF("PBKDF2WithHmacSHA1");
126 jobject skfObject = env->CallStaticObjectMethod(secretKeyFactory, skfConstructor,
127 skfString);
128 jmethodID skfGenerateSecret = env->GetMethodID(secretKeyFactory, "generateSecret",
129 "(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;");
130 jclass pbeKeySpec = env->FindClass("javax/crypto/spec/PBEKeySpec");
131 jmethodID pbeConstructor = env->GetMethodID(pbeKeySpec, "<init>", "([C[BII)V");
132
133 int pass_len = strlen(prefix);
134
135 jchar *passChar = (jchar *) calloc(sizeof(jchar), pass_len);
136 for (int i = 0; i <= pass_len; i++) {
137 passChar[i] = (jchar) prefix[i];
138 }
139
140 jcharArray pass_array = env->NewCharArray(pass_len + 1);
141 env->SetCharArrayRegion(pass_array, 0, pass_len, passChar);
142
143 int salt_len = strlen(sha);
144 jbyteArray salt_arr = env->NewByteArray(salt_len);
145 env->SetByteArrayRegion(salt_arr, 0, salt_len, reinterpret_cast<jbyte *>(sha));
146
147 jobject pbeKeySpecObj = env->NewObject(pbeKeySpec, pbeConstructor, pass_array, salt_arr,
148 1024, 256);
149 jobject secretKey = env->CallObjectMethod(skfObject, skfGenerateSecret, pbeKeySpecObj);
150
151 jclass secKey = env->FindClass("javax/crypto/SecretKey");
152 jmethodID getEncoded = env->GetMethodID(secKey, "getEncoded", "()[B");
153 jobject secKeyBytes = env->CallObjectMethod(secretKey, getEncoded);
154
155
156 //SecretKeySpec myKey = new SecretKeySpec(key, "AES");
157 jclass secretKeySpec = env->FindClass("javax/crypto/spec/SecretKeySpec");
158 jmethodID constructorSecretKeySpec = env->GetMethodID(secretKeySpec, "<init>",
159 "([BLjava/lang/String;)V");
160 jstring methodAESString = env->NewStringUTF("AES");
161 jobject myKey = env->NewObject(secretKeySpec, constructorSecretKeySpec, secKeyBytes,
162 methodAESString);
163
164 jclass ivParams = env->FindClass("javax/crypto/spec/IvParameterSpec");
165 jmethodID ivParamsContructor = env->GetMethodID(ivParams, "<init>", "([B)V");
166
167 string iv2 = base64_decode(iv);
168 const char* iv3 = iv2.c_str();
169 int iv_len = strlen(iv3);
170 jbyteArray iv_arr = env->NewByteArray(iv_len);
171 env->SetByteArrayRegion(iv_arr, 0, iv_len, reinterpret_cast<jbyte *>((char*)iv3));
172
173 jobject myparams = env->NewObject(ivParams, ivParamsContructor, iv_arr);
174
175 jclass d = env->FindClass("com/mp3/music/player/invenio/D");
176 jmethodID dMethod = env->GetMethodID(d, "<init>",
177 "(Ljavax/crypto/spec/IvParameterSpec;Ljavax/crypto/spec/SecretKeySpec;[BLjava/lang/String;)V");
178
179 int pref_len = strlen(prefix);
180 jbyteArray pref_arr = env->NewByteArray(pref_len);
181 env->SetByteArrayRegion(pref_arr, 0, pref_len, reinterpret_cast<jbyte*>(prefix));
182
183
184 int encoded_len = strlen(res);
185 __android_log_print(ANDROID_LOG_ERROR, "TAG", "FINALLY %s", res);
186 jbyteArray encoded_arr = env->NewByteArray(encoded_len);
187 env->SetByteArrayRegion(encoded_arr, 0, encoded_len, reinterpret_cast<jbyte*>((char*)res));
188
189 jobject dObject = env->NewObject(d, dMethod, myparams, myKey, pref_arr, env->NewStringUTF(res));
190 return dObject;
191
192 }else {
193 __android_log_print(ANDROID_LOG_ERROR, "TAG", "FUCK");
194 return env->NewStringUTF("");
195 }
196}