【爬虫逆向】逆向某租车H5-AES加密逆向

110 阅读2分钟

0、前言

记上一篇的续集,租车平台除了某州之外还有一个某一,两个都是好用的自营平台,故做此逆向,在官网查看数据,进行请求抓取之后,发现请求头参数和响应参数都是加密了,故进行逆向解密,写此文章记录AES的加密/解密学习

1、逆向对象

随便选择参数之后发送请求,可以看到参数是加密的

image.png

响应也是如此

image.png

一大串又臭又长,目标是解密该加密数据

2、开始逆向解密

逆向思路永远是从F12中的调用链中去看源码的请求链路,然后打断点去看加密/解密的核心函数是哪

image.png

看到一个疑似加密的方法,有加密就有解密,点进去往下看,打个断点看看

image.png

看到有一些明文参数,剩下的应该是w函数中加密的,进入w函数

image.png

通过尝试发现是 JSON.parse(I.a.decrypt(t.data)) 进行解密的,再打断点进去看实现

image.png

进来之后一目了然,是AES加密,AES的核心是key、option,可以参考这篇文章 其中iv是n,key就是r,发现是全局变量,往上翻阅源码就可以看到密钥

image.png

其中这个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));

得到输出

image.png

3、破解加密

同理加密的参数也是这些key进行加密把decrypt改为encrypt即可