The apk is not protected. we used www.decompileandroid.com to get the source.
sqllite db in located in assets/db.db which contains IV and key:
a5efdbd57b84ca36
37eaae0141f1a3adf8a1dee655853714we changed the src/edu/sharif/ctf/security/KeyVerifier.java to make it decrypt the VALID_LICENCE
import java.util.*;
import java.lang.*;
import java.io.*;
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
class Ideone {
static String IV = "a5efdbd57b84ca36";
static String encryptionKey = "37eaae0141f1a3adf8a1dee655853714";
public static void main(String[] args) {
try {
byte[] cipher = hexStringToBytes("29a002d9340fc4bd54492f327269f3e051619b889dc8da723e135ce486965d84");
System.out.println("cipher: ");
for (int i = 0; i < cipher.length; i++)
System.out.print(new Integer(cipher[i]) + " ");
String decrypted = decrypt(cipher, encryptionKey);
System.out.println("");
System.out.println("decrypt: " + decrypted);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
public static byte[] encrypt(String plainText, String encryptionKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec key = new SecretKeySpec(hexStringToBytes(encryptionKey), "AES");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV.getBytes()));
return cipher.doFinal(plainText.getBytes("UTF-8"));
}
public static String decrypt(byte[] cipherText, String encryptionKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec key = new SecretKeySpec(hexStringToBytes(encryptionKey), "AES");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(IV.getBytes()));
return new String(cipher.doFinal(cipherText), "UTF-8");
}
public static byte[] hexStringToBytes(String s) {
int i = s.length();
byte abyte0[] = new byte[i / 2];
int j = 0;
do {
if (j >= i) {
return abyte0;
}
abyte0[j / 2] = (byte)((Character.digit(s.charAt(j), 16) << 4) + Character.digit(s.charAt(j + 1), 16));
j += 2;
} while (true);
}
public static String bytesToHexString(byte abyte0[]) {
StringBuilder stringbuilder = new StringBuilder();
int i = abyte0.length;
int j = 0;
do {
if (j >= i) {
return stringbuilder.toString();
}
byte byte0 = abyte0[j];
Object aobj[] = new Object[1];
aobj[0] = Integer.valueOf(byte0 & 0xff);
stringbuilder.append(String.format("%02x", aobj));
j++;
} while (true);
}
}
result:
cipher: 41 -96 2 -39 52 15 -60 -67 84 73 47 50 114 105 -13 -32 81 97 -101 -120 -99 -56 -38 114 62 19 92 -28 -122 -106 93 -124 decrypt: fl-ag-IS-se-ri-al-NU-MB-ER
No comments:
Post a Comment