第一次写不知道能否表达清楚
在B站上学习JS逆向,结果学到最后一个练习项目时。因为之前学习得人把人家网站搞崩了。到了我来爬取得时候,这个网站反爬已经大幅度升级了,爬取难度急据升高。
声明:JS逆向成功后我就没有继续爬了,没有攻击对方服务器,如果有什么违规地方,立马删除。(网站url:私聊吧,不然又崩了可不太好)
相关工具 语言:
Python 3.6.1 :: Anaconda 4.4.0 (64-bit)
node.js v14.16.0
第三方库:requests execjs json subprocess partial
开发工具:pycharm,chrome
找到可疑点:
进入开发者模式模式:提示:JS逆向主要是在开发者模式中,断点调试找到加密得地方
理论上这段是不用说的,但这个网站反爬技术很完善
如图该网站禁用了右键和F12
所以可以通过浏览器右上角三个点---->更多工具---->开发者工具,进入
无限debugger进入之后就会发现自动进入到了断点调试的状态,是因为下面这据代码
(function anonymous(
) {
debugger
})
破解方法:选择"debugger"前的行号,右键弹出下图窗口。可以选择1、或者2、
选择1、要在以后输入一个false。选择2、直接就可。两者都要再点击“跳到下一个断点”
具体参照:web反调试之无限debugger饶过方案汇总 - 996station
到这里还不行,你会看到下面的情况
它的的原理是,监视页面的窗口大小,小于某个值就会显示以上内容。破解方法很简单,如下。
两种找到可疑点的方法: 第一种全局搜索fromData参数名:
chrome抓包找到对应的请求
第二种,通过按钮查看绑定的事件,一层层解析
接下来可以看Python爬虫从入门到大神到JS逆向再到APP逆向 持续更新中~_哔哩哔哩_bilibili
最后还是到这
逆向分析从这里可以看到FromData来源与data:{hT5i4Eu2x:pwG2gyr}。pwG2gyr是由“
var pwG2gyr =pIywvl1oiy(mvpDrF875,ooISoR2Gom);”得到的。所以关键函数就是pIywvl1oiy()如下
return function(method, obj){
var appId = '2b3d1754aac69d4e84b3bb5620ba578e';
var clienttype = 'WEB';
var timestamp = new Date().getTime();
// console.log(method, obj,ObjectSort(obj),appId + method + timestamp + 'WEIXIN' + JSON.stringify(ObjectSort(obj)));
var param = {
appId: appId,
method: method,
timestamp: timestamp,
clienttype: clienttype,
object: obj,
secret: hex_md5(appId + method + timestamp + clienttype + JSON.stringify(ObjectSort(obj)))//加密处
};
param = BASE64.encrypt(JSON.stringify(param));//加密处
param = AES.encrypt(param, ackvMDije6Ku, aciiBrTMXFqu);//加密处
return param;
};
})();
可以看出影响结果地方是“hex_md5(appId + method + timestamp + clienttype + JSON.stringify(ObjectSort(obj)))“和 ”param = AES.encrypt(param, ackvMDije6Ku, aciiBrTMXFqu);“
而timestamp、clienttype是不变的,method,obj是我们自己输入的。appId,ackvMDije6Ku,aciiBrTMXFqu乍一看是写死的,其实不是。如果你多次抓包就可以发现它们三在每个文件中的值是变化的,所以必须实时获取。这处很坑,如果不注意就会落入陷阱,觉得一切都是对的但结果就是出不来。appId来自当前函数,ackvMDije6Ku,aciiBrTMXFqu出现在文件开头,如下。
你有没有发现有几个参数的名字特别怪,例如ackvMDije6Ku,pIywvl1oiy,mvpDrF875等。这是因为这些关键字,甚至包括这个文件都是被动态加密的。在这其中有一个很重要的关键字FromData的键,如下图。这个值不能写死,他又时间限制,一段时间后会失效。必须实时获取。见前文这个关键字在Data里。
总上如果我们想要成功加密,就必须动态获取以上几个参数。而在写参数都来自于那个JS文件。这个文件的url,通过左侧的全局搜索得到https://www.xxxxx.cn/js/encrypt_e6Q87gvKk99t.min.js?v=1658658361
而这个URL也是实时生成的如这e6Q87gvKk99t和v=1658658361。后面的是时间戳,而前面的是对方后台生成的,我们无法自己生成。但是学过WEB前端的都知道,js文件一般放在html文件的


