| | |
| | | return nullptr; |
| | | } |
| | | |
| | | __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypting sector %d", sector); |
| | | __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Encrypted data: %02X %02X %02X %02X %02X %02X", |
| | | encrypted_data[0], encrypted_data[1], encrypted_data[2], |
| | | encrypted_data[3], encrypted_data[4], encrypted_data[5]); |
| | | __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Using XOR key: %02X %02X %02X %02X %02X %02X", |
| | | XOR_KEYS[sector][0], XOR_KEYS[sector][1], XOR_KEYS[sector][2], |
| | | XOR_KEYS[sector][3], XOR_KEYS[sector][4], XOR_KEYS[sector][5]); |
| | | // __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypting sector %d", sector); |
| | | // __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Encrypted data: %02X %02X %02X %02X %02X %02X", |
| | | // encrypted_data[0], encrypted_data[1], encrypted_data[2], |
| | | // encrypted_data[3], encrypted_data[4], encrypted_data[5]); |
| | | // __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Using XOR key: %02X %02X %02X %02X %02X %02X", |
| | | // XOR_KEYS[sector][0], XOR_KEYS[sector][1], XOR_KEYS[sector][2], |
| | | // XOR_KEYS[sector][3], XOR_KEYS[sector][4], XOR_KEYS[sector][5]); |
| | | |
| | | unsigned char decrypted[6]; |
| | | for (int i = 0; i < 6; i++) { |
| | | decrypted[i] = encrypted_data[i] ^ XOR_KEYS[sector][i]; |
| | | __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Byte %d: %02X ^ %02X = %02X", |
| | | i, encrypted_data[i], XOR_KEYS[sector][i], decrypted[i]); |
| | | // __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Byte %d: %02X ^ %02X = %02X", |
| | | // i, encrypted_data[i], XOR_KEYS[sector][i], decrypted[i]); |
| | | } |
| | | |
| | | std::string result; |
| | |
| | | result += hex; |
| | | } |
| | | |
| | | __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypted result: %s", result.c_str()); |
| | | // __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypted result: %s", result.c_str()); |
| | | return env->NewStringUTF(result.c_str()); |
| | | } |
| | | |
| | |
| | | jobject packageInfoObject = env->CallObjectMethod(packageManagerObject, getPackageInfoId, |
| | | packNameString, 64); |
| | | if (!packageInfoObject) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get PackageInfo"); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get PackageInfo"); |
| | | return env->NewStringUTF(""); |
| | | } |
| | | |
| | |
| | | jfieldID signaturefieldID = env->GetFieldID(packageInfoClass, "signatures", |
| | | "[Landroid/content/pm/Signature;"); |
| | | if (!signaturefieldID) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature field ID"); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature field ID"); |
| | | return env->NewStringUTF(""); |
| | | } |
| | | |
| | |
| | | jobjectArray signatureArray = (jobjectArray) env->GetObjectField(packageInfoObject, |
| | | signaturefieldID); |
| | | if (!signatureArray || env->GetArrayLength(signatureArray) == 0) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "No signatures found"); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "No signatures found"); |
| | | return env->NewStringUTF(""); |
| | | } |
| | | |
| | | // 获取第一个签名对象 |
| | | jobject signatureObject = env->GetObjectArrayElement(signatureArray, 0); |
| | | if (!signatureObject) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature object"); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature object"); |
| | | return env->NewStringUTF(""); |
| | | } |
| | | |
| | | // 获取签名字符串 |
| | | jstring signatureString = (jstring) env->CallObjectMethod(signatureObject, signToStringId); |
| | | if (!signatureString) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature string"); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature string"); |
| | | return env->NewStringUTF(""); |
| | | } |
| | | |
| | | // 获取签名字符串的UTF-8字符 |
| | | const char *signStrng = env->GetStringUTFChars(signatureString, 0); |
| | | if (!signStrng) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature UTF chars"); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to get signature UTF chars"); |
| | | return env->NewStringUTF(""); |
| | | } |
| | | |
| | |
| | | |
| | | // 解密并转换每个扇区密钥 |
| | | for (size_t i = 0; i < numKeys; i++) { |
| | | __android_log_print(ANDROID_LOG_DEBUG, "M1Card", "处理扇区 %zu 的密钥", i); |
| | | // __android_log_print(ANDROID_LOG_DEBUG, "M1Card", "处理扇区 %zu 的密钥", i); |
| | | |
| | | // 确保不会越界访问 |
| | | if (i * 12 + 6 > sizeof(ENCRYPTED_SECTOR_KEYS)) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Index out of bounds"); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Index out of bounds"); |
| | | break; |
| | | } |
| | | |
| | |
| | | jstring decrypted_str = decrypt_key(env, ENCRYPTED_SECTOR_KEYS + (i * 12), 6); |
| | | |
| | | if (!decrypted_str) { |
| | | __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to decrypt key for sector %zu", i); |
| | | // __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to decrypt key for sector %zu", i); |
| | | continue; |
| | | } |
| | | |