package mobi.acpm.inspeckage.hooks; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.callbacks.XC_LoadPackage; import mobi.acpm.inspeckage.util.Util; import static de.robv.android.xposed.XposedHelpers.findAndHookConstructor; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; /** * Created by acpm on 16/11/15. */ public class CryptoHook extends XC_MethodHook { public static final String TAG = "Inspeckage_Crypto:"; private static StringBuffer sb; public static void initAllHooks(final XC_LoadPackage.LoadPackageParam loadPackageParam) { findAndHookConstructor(SecretKeySpec.class, byte[].class, String.class, new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { sb = new StringBuffer(); sb.append("SecretKeySpec(" + Util.byteArrayToString((byte[]) param.args[0]) + ","+(String) param.args[1]+")"); } }); findAndHookMethod(Cipher.class, "doFinal", byte[].class, new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (sb == null) { sb = new StringBuffer(); } sb.append(" (" + Util.byteArrayToString((byte[]) param.args[0]) + " , "); sb.append(Util.byteArrayToString((byte[]) param.getResult()) + ")"); XposedBridge.log(TAG + sb.toString()); sb = new StringBuffer(); } }); findAndHookMethod(Cipher.class, "getIV", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (sb == null) { sb = new StringBuffer(); } sb.append(" IV:" + (String) param.getResult()); } }); findAndHookConstructor(IvParameterSpec.class, byte[].class, new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (sb == null) { sb = new StringBuffer(); } sb.append(" IV: " + Util.byteArrayToString((byte[]) param.args[0])); } }); findAndHookMethod(SecureRandom.class, "setSeed", byte[].class, new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (sb == null) { sb = new StringBuffer(); } sb.append(" Seed:" + Util.byteArrayToString((byte[]) param.args[0])); } }); findAndHookMethod(Cipher.class, "getInstance", String.class, new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (sb == null) { sb = new StringBuffer(); } //Transformation ex AES/CBC/PKCS7Padding sb.append(" , Cipher[" + (String) param.args[0] + "] "); } }); findAndHookConstructor(PBEKeySpec.class, char[].class, byte[].class, int.class, int.class, new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (sb == null) sb = new StringBuffer(); sb.append("[PBEKeySpec] - Password: " + String.valueOf((char[])param.args[0]) + " || Salt: " + Util.byteArrayToString((byte[])param.args[1])); XposedBridge.log(TAG + sb.toString()); sb = new StringBuffer(); } }); } }