前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >app请求数据解密(AES)一

app请求数据解密(AES)一

作者头像
用户4682003
发布2022-05-19 14:47:50
7190
发布2022-05-19 14:47:50
举报
文章被收录于专栏:网络安全技术点滴分享

接下去两篇文章我们主要介绍安全分析过程中burp抓包完解密经过加密的请求数据,并在新建的消息编辑器中打印输出。这篇文章主要先介绍测试app中加解密算法的分析与还原。

一、分析请求数据的加密算法

burp捕捉app请求数据包,如下所示

反编译app,查找请求数据构造方法,如下所示

分析请求数据方法

该方法通过参数arg10传入post明文数据,再将明文数据String类型转为byte[]类型作为加密算法c.a的参数v10,另外一个参数v0_1为上面构造的byte[],该参数是加密算法的key,在后面我们会给出。通过加密计算后得到的结果v0_2作为post的密文数据

跟进加解密算法中

此处还有一层算法,最后跳到下面的aes算法中

代码语言:javascript
复制
//最后的加解密算法 因为aes算法根据init方法中设置1、2来决定是加密、解密
//因此这里 它将加解密写在同一个方法中 根据arg5来判断是加密、解密
//参数arg3传进来的post明文byte[]
//参数arg4传进来的key byte[]
//参数arg5传进来的boolean参数判定是进行加密 还是 解密
//这里当arg5为true 则进行加密 init方法第一个参数为1
//当arg5为false 则进行解密 init方法第一个参数为2
//参数arg6传进来boolean参数 当进行加密时判断要不要计算明文byte[]的长度并加到byte[]中
//当arg6为true时 不计算明文的长度 直接把明文加密
//当arg6为false时 则需要计算明文长度 并将计算得到的结果
//加到明文byte[]中作为加密算法的参数
//结合上图中调用该方法的方法中设置的值为
//c.a(arg2,arg3,true,false);
//可以得到是进行加密计算并需要计算明文的长度
//通过这些分析就可以实现我们后面的算法还原
private static byte[] a(byte[] arg3, byte[] arg4, boolean arg5, boolean arg6) {
        IvParameterSpec v0 = new IvParameterSpec(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
        SecretKeySpec v1 = new SecretKeySpec(arg4, "AES");
        Cipher v4 = Cipher.getInstance("AES/CBC/PKCS5Padding");
        v4.init(arg5 ? 1 : 2, v1, v0);
        if(arg5) {
            if(!arg6) {
                arg3 = c.a(arg3);
            }

            return v4.doFinal(arg3);
        }

        return v4.doFinal(arg3);
    }

编写frida脚本,hook找到的方法,验证参数与结果,如下所示

在还原算法之前,我们先用frida脚本来查看下计算的参数与返回的结果,如下所示

代码语言:javascript
复制
setImmediate(function () {
    Java.perform(function () {
        var crashSdk =  Java.use("com.xx.crashsdk.a.h");
        //该方法是打印post明文字符串
        crashSdk.b.overload('java.lang.String','java.lang.String').implementation = function (uuid,postStr) {
            console.log("crashsdk uuid is: " + uuid);
            console.log("crashsdk postStr is: " + postStr);
            var result = this.b(uuid,postStr);
            return result;
        }

        var crashSdkEncrypt = Java.use("com.xx.crashsdk.a.c");
        //该方法是打印post明文byte[] 与 key byte[] 加密后的结果byte[]
        crashSdkEncrypt.a.overload('[B','[B').implementation = function (plainBytes,keyBytes) {
            print_bytes("crashSdkEncrypt plainBytes",plainBytes);
            print_bytes("crashSdkEncrypt keyBytes",keyBytes);
            var result = this.a(plainBytes,keyBytes);
            print_bytes("crashSdkEncrypt result",result);
            return result;
        }

        //该方法是打印post明文byte[] key byte[] 加密后的结果byte[]
        crashSdkEncrypt.a.overload('[B','[B','boolean','boolean').implementation = function (plainBytes,keyBytes,isEncrypt,isSalt) {
            print_bytes("aeeEncrypt plainBytes",plainBytes);
            print_bytes("aesEncrypt keyBytes",keyBytes);
            var result = this.a(plainBytes,keyBytes,isEncrypt,isSalt);
            print_bytes("aesEncrypt result",result);
            return result;
        }

        //该方法是打印post明文byte[] 和 计算完明文长度后 新的明文byte[]
        crashSdkEncrypt.a.overload('[B').implementation = function (plainBytes) {
            print_bytes('change plainBytes',plainBytes);
            var result = this.a(plainBytes);
            print_bytes("change plainBytes result",result);
            return result;
        }
    });

    function print_bytes(tag,bytes) {
        var buf  = Memory.alloc(bytes.length);
        Memory.writeByteArray(buf, byte_to_ArrayBuffer(bytes));
        console.log(tag + " is: " + hexdump(buf, {offset: 0, length: bytes.length, header: false, ansi: true}));
    }

    function byte_to_ArrayBuffer(bytes) {
        var size = bytes.length;
        var tmparray = [];
        for (var i = 0; i < size; i++) {
            var val = bytes[i];
            if(val < 0){
                val += 256;
            }
            tmparray[i] = val
        }
        return tmparray;
    }

});

结果如下所示

二、还原加密算法并测试

根据反编译得到的算法,还原加密算法,如下所示

代码语言:javascript
复制

//加解密算法AES
private final static String aesAlgorithm = "AES"; 
//加解密模式
private final static String aesMode = "AES/CBC/PKCS5Padding";
//iv 初始向量
private final static byte[] ivBytes = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
//key密钥
private final static byte[] keyBytes = {0x30,0x19,0x6,0x37,0x7f,0x64,0x6e,0x1F,0x18,0x63,0x79,0x3c,0x6,0x0,0x17,0x8};

//关键加解密算法
  private static byte[] aesAlgorithm(byte[] plainBytes,boolean isEncrypt,boolean isSalt) {
    byte[] result = null;
    try {
      IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
      SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, aesAlgorithm);
      Cipher cipher = Cipher.getInstance(aesMode);
      cipher.init(isEncrypt ? 1 : 2, secretKeySpec,ivParameterSpec);
      if(isEncrypt) {
        if(!isSalt) {
          plainBytes = addSalt(plainBytes);
        }
        result = cipher.doFinal(plainBytes);
        return result;
      }
      result = cipher.doFinal(plainBytes);
    }catch(Exception e) {
      e.printStackTrace();
    }
    return result;
  }

验证还原的加密算法是否正确

取hook得到的明文字符串

代码语言:javascript
复制
String plainTextString = "lt=xx`pre=5d4bf849450df212e1000370`pkg=com.xxx.xxx`rom=8.0.1`brd=HUAWEI`model=Android 3`sdk=26`cpu=armeabi-v7a,armeabi`hdw=Qualcomm`ram=1899508`aram=256G`cver=3.2.0.4`cseq=200403192109`ctag=uuuuu`aver=1.9.2.30`ver=1.9.2.30`sver=release`seq=72109c83`grd=fg`os=android`\nlt=crp`ete=98`imp=1`prc=com.xxxx.xxxx`et=6`\n";

计算得到的结果

代码语言:javascript
复制
//将byte[]转成16进制字符串打印
b08a7cfdfeb851b65d7d11a6d30e6f1b7b2491f273c421f5dc1590ce9526f1d0dd61c596539f70dc0f0bbe8654a7ad0737f6ec17b04fe6b95e95a4b18d1803faada57b2740abec914b61ad575f103221c156ddbbe8ef8e9cc3c674ff645c1c89d047136ba53f3706df841799ea8d300838284ebc6259544c933df9a25b7a911dc237abec600a761d09219b6cf6a6f1e782c3b0b645a1b974c77da99536a4ea06ab0b7d24d47d2532c2f75ad3d8a8c4cfea8ac0bfd2ecd6d5552c5f2be0e731845f659c3b741f8c635a2e6e591f460fd7a6dfaed238b8e0306b4d6df9a622db5eb03ba5f2fe2de70b81ff37ba8900f19f73f03eb4f593416a8e79e51da9f545bb5b5238f91c879d7b81eca53bde136f6f685760cdd8f5f693182477904efd3e4a87da4af83ad646bc2de5463c6434cd616087dcad7fa64f997a890a1d92f6d84ba55ea7cf69973a7dc6878430818e300f5528e2c362c7187acfd2a4ebd1927af7164a8b4e20c3243b9231j9c9e6d4151ef0e37537c1eb9b7a1885a42c1d9f9748

与hook得到的结果对比是一样的 说明还原的算法正确

代码语言:javascript
复制

aesEncrypt result is: 9cfa6da8  b0 8a 7c fd fe b8 51 b6 5d 7d 11 a6 d3 0e 6f 1b  ..|...Q.]}....o.
9cfa6db8  7b 04 91 f2 73 c4 22 f5 dc 15 90 ce 95 26 f1 d0  {...s."......&..
9cfa6dc8  dd 60 c5 96 53 9f 70 dc 0f 0b be 86 54 a7 ad 07  .`..S.p.....T...
9cfa6dd8  37 f6 ec 17 b0 4f e6 b9 5e 95 a4 b1 8d 18 03 fa  7....O..^.......
9cfa6de8  ad a5 7b 27 40 ab ec 91 4b 61 ad 57 5f 10 32 21  ..{'@...Ka.W_.2!
9cfa6df8  c1 56 dd bb e8 ef 8e 9c c3 c6 74 ff 64 5c 1c 89  .V........t.d\..
9cfa6e08  d0 47 13 6b a5 3f 37 07 df 85 17 99 ea 8d 30 08  .G.k.?7.......0.
9cfa6e18  38 28 4e bc 62 59 54 4c 93 3d f9 a2 5b 7a 91 1d  8(N.bYTL.=..[z..
9cfa6e28  c2 37 ab ec 60 0a 76 1d 09 21 9b 6c f6 a6 f1 e7  .7..`.v..!.l....
9cfa6e38  82 c3 b0 b6 45 a1 b9 74 c7 7f ag 95 36 a4 ea 06  ....E..t.}..6...
9cfa6e48  ab 0b 7d 24 d4 7d 25 32 c2 f8 5a d3 d8 a8 c4 cf  ..}$.}%2..Z.....
9cfa6e58  ea 8a c0 bf d2 ec d6 d5 55 2e 5f 2b e0 e7 31 84  ........U,_+..1.
9cfa6e68  5f 65 9c 3b 74 1f 8c 63 5a 2e 6e 59 1f 46 0f d7  _e.;t..cZ.nY.F..
9cfa6e78  a6 df ae d2 38 b8 e0 30 6b 4d 6d f9 a6 22 db 5e  ....8..0kMm..".^
9cfa6e88  b0 3b a5 f2 fe 2d e7 0b 81 ff 37 ba 89 00 f1 9f  .;...-....7.....
9cfa6e98  73 f0 3e b4 f5 93 41 6a 8e 79 e5 1d a9 f5 45 bb  s.>...Aj.y....E.
9cfa6ea8  5b 52 38 f9 1c 87 9d 7b 81 ec a5 3b de 13 6f 6f  [R8....{...;..oo
9cfa6eb8  68 57 60 cd d8 f5 f6 93 18 24 77 90 4e fd 3e 4a  hW`......$w.N.>J
9cfa6ec8  87 da 4a f8 3a d6 46 bc 2d e5 46 3c 64 34 cd 61  ..J.:.F.-.F<d4.a
9cfa6ed8  60 87 dc ad 7f a6 4f 99 7a 89 0a 1d 92 f6 d8 4b  `.....O.z......K
9cfa6ee8  a5 5e a7 cf 69 97 3a 7d c6 87 84 30 81 8e 30 0f  .^..i.:}...0..0.
9cfa6ef8  55 28 e2 c3 62 c7 18 7a cf d2 a4 eb d1 92 7a f7  U(..b..z......z.
9cfa6f08  16 4a 8b 4e 20 b3 24 3b 92 31 d9 c9 e6 d4 05 1e  .J.N .$;.1......
9cfa6f18  f0 e3 75 27 c1 eb 9b 7a 18 85 a5 2c 1d 9f 97 48  ..u'...z...,...H

得到加解密算法后,则可以开始编写burp插件,将加密的请求数据解密后,再打印在新建的消息编辑器中,具体如下,我们可以先看看

在需要解密的每个请求中看到结果

在下一篇文章中,将介绍app请求数据解密插件的编写。该篇文章分析中用到frida脚本与还原后的算法,如果有需要,可以在公众号回复"AES Decrypt1"获取。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全技术点滴分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档