0、前言
记上一篇的续集,租车平台除了某州之外还有一个某一,两个都是好用的自营平台,故做此逆向,在官网查看数据,进行请求抓取之后,发现请求头参数和响应参数都是加密了,故进行逆向解密,写此文章记录AES的加密/解密学习
1、逆向对象
随便选择参数之后发送请求,可以看到参数是加密的
响应也是如此
一大串又臭又长,目标是解密该加密数据
2、开始逆向解密
逆向思路永远是从F12中的调用链中去看源码的请求链路,然后打断点去看加密/解密的核心函数是哪
看到一个疑似加密的方法,有加密就有解密,点进去往下看,打个断点看看
看到有一些明文参数,剩下的应该是w函数中加密的,进入w函数
通过尝试发现是 JSON.parse(I.a.decrypt(t.data)) 进行解密的,再打断点进去看实现
进来之后一目了然,是AES加密,AES的核心是key、option,可以参考这篇文章 其中iv是n,key就是r,发现是全局变量,往上翻阅源码就可以看到密钥
其中这个a就是CryptoJS这个类库,那接下来就很好复刻这个解密源码了
const CryptoJS = require('crypto-js');
let encrypy =
'pRimcmk3pm1x05XioQ4oR43sAEIszBNZGG8MnaeS/cY1KahvA$aDTP$jFzb29zPFA8SqW3vGVfG0hygSj1JpzRWf3LFCxl6bAYHZF2BgPS8QrYR2V$0jf8Jvzz$4ZaGihS9y4vkDQIsqzIX4i1e6M5m8/EOnfcFpev2y7f2ULyqa4C63HJa6VkDiDK4XGKU3ChmxqWtCeSeLsohTWFpiQuaS6uCcuo6boeJHGAAoGk0yrKiJ2HlGz0Te6d$u0iCc1aXkjPEWY1kCWj8gYAYH1RKGE4PMv3hqeVuLOWZl4JqUVA//VbIS2$J551wZ6JUN9PjfnrryqbMVCfMJLi6Q0pf8lab2XnXEFjrVx671qP3L7YqpkloJZU2MVLpiLEFSbo5t/0MjnahdP9HLrer1Ba8TE73xwNNw/YRX$IR$ykwm/P0AjzJI1vC8e$9pwR9vDvSoGiQVfgP7g2RhQiX0j04ImTithUvhf1wItB87GLTgbD9HSXvA3k8zjDz05yDfY1gI6uuiUIBQOvT2DQtKaIFYNvAy1ZKm1YPz5joaOIfTkkW2FnP1zF2U/sAUCInI5bskhzJAniVfXJcRGFx3JM2JsOFrNaqnitUhl2Ia0pFgbzGwUo8drnfSKUw9XUCg8/Qn9eFu/8KDufDd9QMX97LHjFnJJQMlF/m/beUzLyWCLoWiDQ7PDlLJRudte1iPgi1USbvy6g9DW0fTElTbw0nKG$QMAojpyTgVSkgPTdiA1UOHkHocsBegMMyXWJ2t'
.replaceAll(
' ',
''
);
//这里replaceAll的原因是因为抓包发现有些特殊空格,需要手动替换
const u = CryptoJS.enc.Base64.parse('R99N6Jr7ZuPN6KKr2UsnwLVMCEU7nGPwzBARo0cIfhg='),
l = CryptoJS.enc.Base64.parse('LcP31iA3MVkRdDPn4/+3Dg==');
encrypy = (encrypy = decodeURIComponent(encrypy)).replace(/*/g, '=').replace(/$/g, '+');
const o = CryptoJS.AES.decrypt(encrypy, u, {
iv: l,
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.Pkcs7,
});
console.log(CryptoJS.enc.Utf8.stringify(o));
得到输出
3、破解加密
同理加密的参数也是这些key进行加密把decrypt改为encrypt即可