本文仅供学习交流使用,禁止用于其他用途。
以搜索接口为例来讲解:
首先搜索一个关键词,进行分页抓包:
跟栈就不做过多讲述了,我们直接定位到加密函数入口处:
有逆向基础的应该都能看出来,这里的加密主要就是针对请求体参数的。
接着我们进入加密函数,查看主要加密逻辑:
进入核心加密函数:
观察函数发现所有的值都通过数组c进行传递,那么我们不妨在switch出打上日志断点,监测数组的变化:
日志的最后生成了我们的h5st参数:
观察参数发现,h5st可能是由多个加密函数组合而成:
向上翻看日志看到了tk和t6的生成,这就印证了我们的猜想:
既然这样那就好办了,我们只需要逐个击破就好。
我们先进行获取多次日志判断哪些是定值:
发现:
933xpgiddmwwphm3;f06cc;和tk是定值(其实tk也是动态的,不过半天才会变一次,所以我们这里直接把它看做定值即可)。
现在日志上的线索就只剩t6这个大字符串了,所以我们就先从他入手:
向上查找日志,找到t6第一次出现的位置:
观察日志推测,在case 71出调用函数生成了t6大字符串,找到71位置处:
在两个分支处打上日志断点,看他究竟做了什么:
点击函数跟进去:
发现是和134一样的格式,那么我们就还是老样子,在switch出打上断点,监测数组变化。
观察日志发现133在最后一步生成了t6大字符串:
看到这三步应该不难猜出,对象字符串转为init对象又转换为t6大字符串。
接下来我们就只需要关注 对象字符串转换为init对象 和 init对象转换为t6大字符串 这两个步骤所需要的函数即可。
依旧是找到case 26的位置打上断点,看他做了什么:
第二个函数:init转换为t6大字符串。
接下来就好办了,直接点击函数进入,将两个函数扣取,然后缺啥补啥即可,做到这里我们的t6大字符串就算是完成了。
至于对象字符串里的参数,虽然是动态的,但是设置为定值也可以请求成功,追求完美可以自己打日志断点慢慢调试,这里就不做过多赘述(其中bu3和bu6分别是head和body的子元素节点数,两个random则是由同一个函数随机生成的)。
现在日志上其他字符的线索已经很少了,那我们不妨给所有switch语句都加上日志断点,宁错杀不放过,获取尽可能多的线索:
接着只需要一个字符串一个字符串的还原:
先搜索第一个类似时间戳格式化的字符:
时间戳上还有一个函数,点进去发现,正是时间戳格式转换函数:
接下来搜索tk字符串后的字符串(由于这个字符串的生成逻辑与最后一个字符串的生成逻辑类似,只是参数变了一下,所以只讲解这一个):
(这里我重新开了一个页面,所以字符串与上面的不一样)
这里猜测字符串是由上面的四位数组(其实就是),想找到四位数组转换为字符串的方法还是老样子,在case 25出打上日志,这里不再讲解。
接下来就需要找到四位数组的生成位置,往上翻日志:
这里的16位数组生成四位数组,想要找到生成函数依旧是去打日志断点输出。
接着往上找16位数组的生成位置
这里发现数组还进行了第一位和第三位的换位。
接着溯源:
这里16位数组由四位数组生成,获取生成函数,还是去相应位置打日志断点获取
再找四位数组生成位置:
这里有一个奇怪的点,四位数组的生成位置(moudle126)的前一个日志并不是在moudle126内,所以说moudle11应该是moudle126调用函数中的步骤,而四位数组的生成函数就是moudle11所在的函数,往上翻日志,找到最后一个moudle126出现的位置:
四位数组的生成参数如图所示,想要看的更加准确和获取生成函数,还是打日志断点进行观察。
下面我们结合后面日志观察这个参数:
发现这个参数的首尾两端就是key值,中间拼接的body则是我们sha256加密的请求体参数,后面还有一个t则是我们传入请求体时一起传入的时间戳。
既然这样我们就只需要知道key值的生成即可,key值的生成逻辑和tk字符串后的那一位字符串极为相似,还是溯源,打日志断点进行分析,所以就跳过了。
到这里我们h5st就算是分析完成了接下来就是拼接字符串。