讲完了基础,现在我们进入正题,我会尽可能以我第一心理的视角,去讲解我是如何寻找加解密函数以及密钥的。前面的burp数据包截图大家应该都看到了,其中包含请求的接口以及参数,一般我会有两种查找思路。第一种,我会直接全局搜索加解密函数关键字,比如:encrypt、encode、decrypt、decode、cipher等等。不过在这里并没有得到理想的答案。这里虽然找到了看似加解密函数的地方,但是debug之后发现并没有触发,那就说明不在这个位置。后面也尝试了其他的一些函数关键字,但都无法触发,没有定位到真正加解密的地方,这个时候就得用第二种方法了。第二种,我会根据数据包中请求的参数、接口等信息作为关键字进行全局搜索,这个方法也是经验总结,屡试不爽。这里也确实比较幸运,通过 pwa 关键字,一下子就准确定位到了加密函数的大概位置,之所以用大概,是因为它的代码是经过混淆的,我一开始也不能百分百确定。咱就说,就这段代码,谁看不迷糊啊,如果不是参数名没混淆,真的要找一阵子了。通过咱的顶级理解,“l”必定是加密后的数据了,知道了这个要素之后,后面就要盯着“l”找了,要知道它从哪里来,要到哪里去。先格式化一下代码,虽然混(看)淆(不)了(懂),但也不能忘了优雅。可以看到最外层定义的函数名为bLu,其实不重要,那个a参数,我这里盲猜应该是加密前的请求参数,打个断点看看。果不其然,看代码还是一如既往的准,看到pwa、token就可以断定这个是请求参数没错了。知道了参数在哪,下面就要研究在哪个步骤加密以及如何加密的了。第一行可以看到定义了一些变量:var s = 0, r = A.A(t.z), q, p, o, n, m, l, k, j。这里和加解密没啥关系,继续往下看。这里的 cbc 引起了我的主意,让我想起了工商银行,哦不,让我想起了AES/CBC加密模式,前面我们刚说过,忘记了可以往上翻翻。这里我猜测应该是在创建加解密对象,那么$.bQf()就很可能是我们要找的东西,跟进去看一下可以看到返回一个长度为16字节的数组,16字节?是不是有点熟悉又陌生的感觉,这里我先假定它为key,混(看)淆(不)了(懂)就只能靠猜了。然后再进入A.au9函数看看做了什么操作哎!看到了吗,那熟悉的AEC/CBC/PKCS7,看来是找到组织了,到这里就更加坚定我的猜想了返回au8对象之后,我们回到上一层,看一下aOQ函数,这里我选择优先看$.bQe函数,因为根据前面的经验,这个极有可能是iv,跟入果然,返回的也是一个16字节的数组,看到这里我大概可以判断,它应该使用的是aes-128-cbc模式加解密的。如何验证我的猜测对不对呢?其实也很简单,我们把key、iv单独拿出来,自己写一个脚本测试一下就知道了。这里的key和iv我是这样取得,因为他是16字节数组嘛,所以我们把它打印出来,再将每个元素转为字符,key如图iv转换如图如果你非要问我为什么如此断定$.bQf()是key而$.bQe()是iv呢,那我只能告诉你,总共就两个参数,不是key就是iv,搞错了就颠倒一下,试错成本很低(笑哭)有了key和iv,就可以写一段代码测试了尝试运行看看解密成功,到这里已经算成功一半了,为什么是一半呢,因为还有签名算法没弄出来
评论