项目地址:aHR0cHM6Ly9tdXNpYy4xNjMuY29tLw==
观前提示:
本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除
定位加密点
老规矩先找包
根据包返回内容判断是否为关键包确定了查看参数
可见到有俩个参数皆为密文 小本本记下来 params 和 encSecKey
全局搜索看看
params
结果很多 那我们一个一个看一个一个下断点?那就太麻烦了 我们不是还有另外一个参数嘛 搜一搜再决定也不迟
encSecKey
对比一下 这个就很舒服了
接下来就是常规操作啦 观察下断点
简简单单 加密位置就找到了 接下来就是分析一下加密逻辑扣代码啦
逻辑分析
由逻辑可知
params => encText
encSecKey=>encSecKey
所以对应的值也就很清晰了
params
h.encText = b(d, g), h.encText = b(h.encText, i)
参数分析
d为明文
password
看起来像是md5 经过测试 的确是md5不管
checkToken
这个是易盾风控 不讲 讲起来太多了
{ "phone":"xxxxxxxxxxxx", "password":"e10adc3949ba59abbe56e057f20f883e", "rememberLogin":"true", "checkToken":"9ca17ae2e6ffcda170e2e6ee97c968e9f183d4fc61bab48fb7d45b938a8a84f14dfba6f984aa61e9b2ff90c52af0feaec3b92a8cb9bad3d36df894aa82c84f869b9fa6c45ba8f58dd6fc7baeabffd0cd7be9adee9e", "csrf_token":"" }
g按猜测应该是key
b函数进来
AES明晃晃出现在眼前
iv=>0102030405060708
mode=>CBC
也顺便验证了g为传入key
然后往上堆栈看key是怎么来的
直接往上找最后一个变量怎么来就行了
看起来像是固定的了
key=>0CoJUm6Qyw8W8jud
经过观察encText被AES了俩次 密匙不同
第一次key 为 0CoJUm6Qyw8W8jud
第二次key 为 a(16) 的方法
a方法进去观察一波发现 这不就是随机数16位字符串嘛
function a(a) { var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = ""; for (d = 0; a > d; d += 1) e = Math.random() * b.length, e = Math.floor(e), c += b.charAt(e); return c }
逻辑分析好直接套库就行了
encSecKey
这个逻辑很简单 就一行加密代码
h.encSecKey = c(i, e, f)
参数分析
i=>前面第二次aes的key
e=>010001固定
f=>
使用 bqN4R(Ya2x.md)进行加密得到f值
全局搜索一下Ya2x.md确定是不是动态
由搜索可知大概是固定的
f=>00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
参数分析完就来分析一波 c 函数
点击进入函数
这就直白的RSA加密啦 接着把我们刚刚分析的参数带上去加密就行了
整理一下逻辑
i=a(16);//生成动态key h.encText = b(d, g) //第一次加密固定key h.encText = b(h.encText, i) //第二次加密动态key h.encSecKey = c(i, e, f)//把第二次加密的动态key进行rsa加密
所以encText和encSecKey这俩个参数是绑定的 不然服务器rsa解密不到第二次的key就无法解密出正确的结果
到此 这俩个参数加密逻辑就分析完成啦 js就不扣了
感谢各位老板的观看