安卓逆向 -- 自吐算法(DES)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 安卓逆向 -- 自吐算法(DES)

一、DES算法源码


DESKeySpec deskey = new DESKeySpec("123456789".getBytes(StandardCharsets.UTF_8));//将密钥实例化
SecretKeyFactory key = SecretKeyFactory.getInstance("DES");//加密算法
SecretKey secretKey = key.generateSecret(deskey);//处理成系统可识别的密钥
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");//加密方式
cipher.init(1,secretKey);//1是加密,2是解密,初始化加密
byte[] desres = cipher.doFinal(bs.getBytes());
System.out.println("DES加密(字节):"+Arrays.toString(desres));
System.out.println("DES加密(Hex):"+bytes2HexString(desres));
System.out.println("DES加密(Base64):"+Base64.getEncoder().encodeToString(desres));
cipher.init(2,secretKey);//初始化解密
byte[] jmdesres = cipher.doFinal(Base64.getDecoder().decode("R7R5cToMh5QxnyoH/32OQw==".getBytes(StandardCharsets.UTF_8)));
System.out.println("DES解密(Base64):"+new String(jmdesres));
byte[] deshexbyte =hexString2Bytes("47B479713A0C8794319F2A07FF7D8E43");
jmdesres=cipher.doFinal(deshexbyte);
System.out.println("DES解密(Hex):"+new String(jmdesres));


二、分析源码,需hook的内容


1、hook的类:javax.crypto.spec.DESKeySpec,javax.crypto.spec.IvParameterSpec,javax.crypto.Cipher


2、hook的方法:key,IV,doFinal


三、hook源码


XposedBridge.hookAllConstructors(XposedHelpers.findClass(
        "javax.crypto.spec.DESKeySpec",
        loadPackageParam.classLoader),
        new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
                byte[] keybyte = new byte[8];
                int offset = 0;
                if (param.args.length != 1) {
                    offset = ((Integer) param.args[1]).intValue();
                }
                System.arraycopy((byte[])param.args[0], offset, keybyte, 0, 8);
                String keyHex = b2s(keybyte);
                String keyB64 = Base64.encodeToString(keybyte, 0);
                Log.d("逆向有你", "DESKey:" + new String(keybyte));
                Log.d("逆向有你", "DESKeyHex:" + keyHex);
                Log.d("逆向有你", "DESKeyB64:" + keyB64);
                Log.d("逆向有你", "=============DES密钥================");
            }
        });
XposedBridge.hookAllConstructors(XposedHelpers.findClass(
        "javax.crypto.spec.IvParameterSpec",
        loadPackageParam.classLoader),
        new XC_MethodHook() {
            /* access modifiers changed from: protected */
            public void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
                Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
                byte[] ivParameter = (byte[]) param.args[0];
                int offset = 0;
                int size = 0;
                if (param.args.length != 1) {
                    offset = ((Integer) param.args[1]).intValue();
                    size = ((Integer) param.args[2]).intValue();
                } else {
                    size = ivParameter.length;
                }
                byte[] ivbyte = new byte[size];
                System.arraycopy(ivParameter, offset, ivbyte, 0, size);
                String ivHex = b2s(ivbyte);
                String ivB64 = Base64.encodeToString(ivbyte, 0);
                Log.d("逆向有你", "ivParameter:" + new String(ivbyte));
                Log.d("逆向有你", "ivParameterHex:" + ivHex);
                Log.d("逆向有你", "ivParameterB64:" + ivB64);
                Log.d("逆向有你", "======================IV向量===============================");
            }
        });
XposedBridge.hookAllMethods(XposedHelpers.findClass(
        "javax.crypto.Cipher",
        loadPackageParam.classLoader),
        "doFinal",
        new XC_MethodHook() {
            public void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
                Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
                if (param.args.length == 0 || param.args.length == 1 || param.args.length == 3) {
                    Cipher cip = (Cipher) param.thisObject;
                    String Algorithm = cip.getAlgorithm();
                    byte[] dataAll = (byte[]) param.args[0];
                    if (param.args.length == 3) {
                        int offset = ((Integer) param.args[1]).intValue();
                        int size = ((Integer) param.args[2]).intValue();
                        byte[] databyte = new byte[size];
                        System.arraycopy(dataAll, offset, databyte, 0, size);
                        Log.d("逆向有你", Algorithm + "Data" + new String(databyte));
                        String data = new String(databyte);
                        String dataHex = b2s(databyte);
                        String dataB64 = Base64.encodeToString(databyte, 0);
                        Log.d("逆向有你", String.valueOf(Algorithm) + " Data:\n" + data);
                        Log.d("逆向有你", String.valueOf(Algorithm) + " DataHex:\n" + dataHex);
                        Log.d("逆向有你", String.valueOf(Algorithm) + " DataB64:\n" + dataB64);
                    } else if (param.args.length == 1) {
                        String data2 = new String(dataAll);
                        String dataHex2 = b2s(dataAll);
                        String dataB642 = Base64.encodeToString(dataAll, 0);
                        Log.d("逆向有你", String.valueOf(Algorithm) + " Data:\n" + data2);
                        Log.d("逆向有你", String.valueOf(Algorithm) + " DataHex:\n" + dataHex2);
                        Log.d("逆向有你", String.valueOf(Algorithm) + " DataB64:\n" + dataB642);
                    }
                    byte[] res = (byte[]) param.getResult();
                    String resHex = b2s(res);
                    String resB64 = Base64.encodeToString(res, 0);
                    Log.d("逆向有你", String.valueOf(Algorithm) + " resultHex: " + resHex);
                    Log.d("逆向有你", String.valueOf(Algorithm) + " resultB64: " + resB64);
                    Log.d("逆向有你", "================Cipher=============================");
                }
            }
        });


四、运行结果


0a2653c851af460fa595bd959398a8f1.png


禁止非法,后果自负


目录
相关文章
|
6月前
|
算法 Android开发
Android签名算法的原理
Android签名算法的原理
72 0
|
6月前
|
算法 安全 C语言
使用C语言实现DES算法代码
使用C语言实现DES算法代码
202 0
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
139 1
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
77 2
|
3月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
178 1
|
5月前
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
5月前
|
算法 Java API
记录我第一次在Android开发图像处理算法的经历
记录我第一次在Android开发图像处理算法的经历
39 1
|
6月前
|
自然语言处理 算法 搜索推荐
Android文字匹配度算法
【5月更文挑战第15天】
|
6月前
|
算法 前端开发 Android开发
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
|
6月前
|
安全 算法 数据库
MD5、SHA、DES、AES、RSA的算法说明
【5月更文挑战第10天】MD5、SHA、DES、AES、RSA的算法说明
323 2
下一篇
无影云桌面