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

简介: 安卓逆向 -- 自吐算法(MAC)

一、MAC算法源码


import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
String bs= "逆向有你a";
SecretKeySpec key = new SecretKeySpec("12345".getBytes(StandardCharsets.UTF_8), "HmacSHA256");//申请一个密钥,长度内容随便写
Mac mac = Mac.getInstance("HmacSHA256");//告诉系统我用的加密码方式是HmacSHA256
mac.init(key);
byte[] macres = mac.doFinal(bs.getBytes(StandardCharsets.UTF_8));//开始加密
System.out.println("HmacSHA1加密(字节):"+Arrays.toString(macres));
System.out.println("HmacSHA1加密(字符串):"+bytes2HexString(macres));
SecretKeySpec key1 = new SecretKeySpec("12345".getBytes(StandardCharsets.UTF_8), "HmacSHA256");//申请一个密钥,长度内容随便写
Mac mac1 = Mac.getInstance("HmacSHA256");//告诉系统我用的加密码方式是HmacSHA256
mac1.init(key1);
mac1.update("逆向".getBytes(StandardCharsets.UTF_8));
mac1.update("有你".getBytes(StandardCharsets.UTF_8));
byte[] macres1 = mac1.doFinal("a".getBytes(StandardCharsets.UTF_8));
System.out.println(bytes2HexString(macres1));


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


1、hook类是javax.crypto.Mac,javax.crypto.spec.SecretKeySpec


2、hook的方法:SecretKeySpec,doFinal


三、hook源码


XposedBridge.hookAllMethods(XposedHelpers.findClass("javax.crypto.Mac", loadPackageParam.classLoader)
        , "doFinal",
        new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
                if(param.args.length==2) return;
                Mac mc = (Mac) param.thisObject;//实例化
                String algorithm = mc.getAlgorithm();//获取加密算法的名称
                if (param.args.length == 2) {
                    byte[] params = (byte[]) param.args[0];
                    String data = new String(params);
                    String datahex = b2s(params);
                    String datab64 = Base64.encodeToString(params, 0);
                    Log.d("逆向有你",algorithm+"data:"+data);
                    Log.d("逆向有你",algorithm+"datahex:"+datahex);
                    Log.d("逆向有你",algorithm+"datab64:"+datab64);
                }
                byte[] res=(byte[])param.getResult();
                String reshex = b2s(res);
                String resb64 = Base64.encodeToString(res, 0);
                Log.d("逆向有你",algorithm+"resulthex:"+reshex);
                Log.d("逆向有你",algorithm+"resultb64:"+resb64);
                Log.d("逆向有你","========================================================================");
            }
        });
XposedBridge.hookAllConstructors(XposedHelpers.findClass("javax.crypto.spec.SecretKeySpec", loadPackageParam.classLoader)
        , new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
                byte[] secretKey = (byte[]) param.args[0];
                int offset=0;
                int size=0;
                String algorithm=null;
                if (param.args.length != 2) {
                    offset = ((Integer) param.args[1]).intValue();
                    size = ((Integer) param.args[2]).intValue();
                    algorithm = (String) param.args[3];
                }else
                {
                    size=secretKey.length;
                    algorithm= (String) param.args[1];
                }
                byte[] keyres=new byte[size];
                System.arraycopy(secretKey,offset,keyres,0,size);
                String keyreshex = b2s(keyres);
                String keyresb64 = Base64.encodeToString(keyres, 0);
                Log.d("逆向有你",algorithm+"secretkey:"+new String(keyres));
                Log.d("逆向有你",algorithm+"secretkeyhex:"+keyreshex);
                Log.d("逆向有你",algorithm+"secretkeyb64:"+keyresb64);
                Log.d("逆向有你","========================================================================");
            }
        });


四、运行结果


0a2653c851af460fa595bd959398a8f1.png


禁止非法,后果自负

目录
相关文章
|
6月前
|
算法 Android开发
Android签名算法的原理
Android签名算法的原理
68 0
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
110 1
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
72 2
|
4月前
|
算法 安全 网络安全
信息安全: MAC(消息认证码)算法,保护数据完整性和真实性的利器
MAC 算法在保证数据完整性和真实性方面扮演着重要角色。HMAC 和 CMAC 作为两种主要的 MAC 算法,因其高安全性和广泛应用,已经成为现代通信和数据保护中不可或缺的一部分。通过本文的介绍,希望读者能够更好地理解和使用 MAC 算法,保障信息的安全性。
|
5月前
|
算法 Java API
记录我第一次在Android开发图像处理算法的经历
记录我第一次在Android开发图像处理算法的经历
35 1
|
6月前
|
自然语言处理 算法 搜索推荐
Android文字匹配度算法
【5月更文挑战第15天】
|
6月前
|
算法 前端开发 Android开发
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
|
6月前
|
算法 Java API
Groovy脚本基础全攻略,android面试算法题
Groovy脚本基础全攻略,android面试算法题
|
6月前
|
算法 架构师 网络协议
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
|
6月前
|
移动开发 算法 搜索推荐
2024最新Android算法相关面试大全,请查收
2024最新Android算法相关面试大全,请查收