首页 » 网站建设 » js混杂php技巧_JS 解密和混淆破解

js混杂php技巧_JS 解密和混淆破解

访客 2024-11-02 0

扫一扫用手机浏览

文章目录 [+]

如果不幸碰着这种反爬机制,一个明智之举是给站长点个赞,然后恭恭敬敬选择放弃,去别的地方找数据。

当然,还是那句话,我们可以选择不爬,但是对付 JS 加密和 JS 稠浊的方法却不可以不会。

js混杂php技巧_JS 解密和混淆破解

这里就以中国空气质量在线检测平台为例,先容 JS 加密和 JS 稠浊的实现和破解方法。

js混杂php技巧_JS 解密和混淆破解
(图片来自网络侵删)

要爬取的网站:https://www.aqistudy.cn/html/city_detail.html

这个网站正在升级,以是页面无法正常显示。
这也意味着这个网站本身的 JS 解密是有问题的(如果没问题就能显示了),以是末了我们并不能完备解析出数据来。
虽然如此,这个网站仍旧是学习 JS 加密和 JS 稠浊的相称不错的平台。

闲话少说,开始干活!

首先浏览器打开网页,并打开调试台的抓包工具。
修正查询条件(城市的名称 + 韶光范围),然后点击查询按钮,捕获点击按钮后发起要求对应的数据包。
点击查询按钮后,并没有刷新页面,显然发起的是 ajax 要求。
该要求就会将指定查询条件对应的数据加载到当前页面中(我们要爬取的数据便是该 ajax 要求要求到的数据)。

剖析捕获到的数据包

提取出要求的 url:https://www.aqistudy.cn/apinew/aqistudyapi.php要求办法:post要求参数:d: 动态变革一组数据(且加密)相应数据:是加密的密文数据

该数据包要求到的是密文数据,为何在前台页面显示的却是原文数据呢?

原来,在要求要求到密文数据后,前台接管到密文数据后利用指定的解密操作(JS 函数)对密文数据进行理解密操作,然后将原文数据显示在了前台页面。

接下来的事情流程:首先先处理动态变革的要求参数,动态获取该参数的话,就可以携带该参数进行要求发送,将要求到的密文数据捕获到。

将捕获到的密文数据找到对应的解密函数对其进行解密即可。
【重点】须要找到点击查询按钮后对应的 ajax 要求代码,从这组代码中就可以破解动态变革的要求参数和加密的相应数据对应的干系操作。
找 ajax 要求对应的代码,剖析代码获取参数 d 的天生办法和加密的相应数据的解密操作。
直接在页面中,并没有办法直接找到发送 ajax 要求的函数的,由于它以及被封装到别的文件中了。
我们可以基于火狐浏览器定位查询按钮绑定的点击事宜。

抽丝剥茧,首先从 getData 函数实现中找寻 ajax 要求对应的代码。
在该函数的实现中没有找到 ajax 代码,但是创造了其余两个函数的调用,getAQIData() 和 getWeatherData()。
ajax 代码一定是存在于这两个函数实现内部。

其余,这里记住一个参数,type == ’HOUR‘,它的含义是查询韶光因此小时为单位。
这个参数我们后来会用到。

接下来我们就去剖析 getAQIData() 和 getWeatherData(),争取能够找到 ajax 代码。

我们找到这两个函数的定义位置,还是没有找到 ajax 要求代码。
不过我们却创造它们同时调用了其余一个函数,getServerData(method,param,func,0.5)。
它的参数的值可以为:

method 可以是 ‘GETCITYWEATHER’ 或者 ‘GETDETAIL’params 的值是 {city, type, startTime, endTime},也便是查询条件func 是一个匿名函数,看样子是在处理数据。

下一步当然就要找 getServerData 函数了,看看那个函数里面有没有我们同等想要的发送 ajax 要求的代码。

我们考试测验着在页面中搜索,却找不到这个函数。
很显然,它是被封装到其他 js 文件中了。
这时,我们可以基于抓包工具做全局搜索。

好是,我们顺利找到了 getServerData 函数!
坏是,这货长得一点也不像是函数。

这是由于,这段 JS 函数代码被加密的。
这种加密的办法,我们称为 JS 稠浊。

JS 稠浊,也便是对核心的 JS 代码进行加密。

JS 反稠浊,则是对 JS 加密代码进行解密。

接下来我们要做的,便是 JS 反稠浊,让这段我们看不懂的东西,显现出庐山真面孔。

我们用的方法十分大略粗暴,也便是暴力破解。
利用这个网站就可以实现对 JS 稠浊的暴力破解:https://www.bm8.com.cn/jsConfusion/

将 getServerData 函数所在的那一整行代码都复制过来,粘贴到这个网址的文本输入框中,然后点击 开始格式化 即可:

终于,我们看到了 getServerData 的代码,并且在个中创造了发送 ajax 的要求:

function getServerData(method, object, callback, period) { const key = hex_md5(method + JSON.stringify(object)); const data = getDataFromLocalStorage(key, period); if (!data) { var param = getParam(method, object); $.ajax({ url: '../apinew/aqistudyapi.php', data: { d: param }, type: "post", success: function (data) { data = decodeData(data); obj = JSON.parse(data); if (obj.success) { if (period > 0) { obj.result.time = new Date().getTime(); localStorageUtil.save(key, obj.result) } callback(obj.result) } else { console.log(obj.errcode, obj.errmsg) } } }) } else { callback(data) }}

从这段代码中,我们弗成贵出下面这几个信息:

ajax 要求成功后获得到的 data 是加密的相应数据(便是我们最开始通过抓包工具看到的那一串神秘的相应字符串),通过 decodeData(data) 函数,可以将加密的数据解密成我们须要的明文数据。
发送要求时携带的参数,也便是 d 对应的值 param 是通过 getParam(method, object) 函数返回动的态变革的要求参数。
这两个参数我们前面也剖析过:参数 method 可以是 ‘GETCITYWEATHER’ 或者 ‘GETDETAIL’参数 object 则为 {city, type, startTime, endTime},是我们的查询条件我们当然还可以连续终极下去,刨根问题找到它们究竟是通过什么办法进行加密和解密的。
然后,利用 Python 代码,重复这个加密和解密的过程,完成要求数据的天生和相应数据的解析过程。

但是我们并不打算这么做。
由于再连续深挖下去,难度将会陡然增加。
此时我们已经很怠倦了,如果连续下去恐怕要疯掉。
而且,JavaScript 和 Python 毕竟是两种措辞,它们之间的方法和各种包都不相同。
JavaScript 能实现的,Python 未必能够轻松完成。
以是重新写一个加密和解密的脚本,并不是明智之举。

更好的办理方案是,我们供应要求的明文数据,通过网站自己的 JS 代码进行加密,得到加密的要求参数。
利用这个参数,我们发送要求给做事端。
拿到加密的相应数据后,再通过网站的 JS 代码进行解密。

也便是说,我们接下来须要做的便是要调用两个 JS 函数 decodeData 和 getParam,并拿到返回结果即可。

现在的问题是,在 Python 程序中如何调用 JS 函数呢?

这就涉及到一个新的观点:JS 逆向。
JS 逆向,也便是在 Python 中调用 JS 函数代码。

能够实现 JS 逆向的办法有两种:

手动将 JS 函数改写称为 Python 函数并实行。
这种方法我刚刚谈过了,并不现实。
由于 JS 能实现的,Python 未必能够轻易实现。
而且毕竟还要重写函数,比较麻烦。
利用固定模块,实现自动逆向(推举)。
一个很好用的实现 JS 逆向的 Python 库 是 PyExecJS。
PyExecJS 库用来实现仿照 JavaScript 代码实行获取动态加密的要求参数,然后再将加密的相应数据带入 decodeData 进行解密即可。
PyExecJS 须要在本机安装好 nodejs 的环境。
PyExecJS 的安装:

pip install PyExecJS

接下来,我们就可以天生加密的要求数据了。

首先,把我们解析出来的那串代码保存到本地,比如名为 code.js 的文件中。
在里面我们补充一个函数,比如名字叫 getPostParamCode,用来发起我们的数据要求。
之以是这样做是由于利用 PyExecJS 调用 JS 函数时,传入的参数只能是字符串。
而 getParam 方法的参数须要用到 JS 的自定义工具。

我们只需在 code.js 中加高下面的代码即可:

function getPostParamCode(method, type, city, start_time, end_time) { var param = {}; param.type = type; param.city = city; param.start_time = start_time; param.end_time = end_time; return getParam(method, param)}

然后,利用 PyExecJS 调用里面的 getParam 方法,将我们的要求数据加密:

# 仿照实行decodeData的js函数对加密相应数据进行解密import execjsimport requestsnode = execjs.get()# 要求参数method = 'GETCITYWEATHER'type = 'HOUR'city = '北京'start_time = '2020-03-20 00:00:00'end_time = '2020-03-25 00:00:00'# 编译js代码file = 'code.js' # js代码的路径ctx = node.compile(open(file, encoding='utf-8').read())# 将要求数据加密encode_js = f'getPostParamCode("{method}", "{type}", "{city}", "{start_time}", "{end_time}")'params = ctx.eval(encode_js)# 利用加密的参数,发起post要求url = 'https://www.aqistudy.cn/apinew/aqistudyapi.php'response_text = requests.post(url, data={'d': params}).text# 将相应数据解密decode_js = f'decodeData("{response_text}")'decrypted_data = ctx.eval(decode_js) # 如果顺利,返回的将是解密后的原文数据print(decrypted_data) # 实行会报错:目前页面中没有数据。
解密函数只是针对页面中原始的数据进行解密。

自此,我们完成了 JS 加密和 JS 稠浊的处理。
这里我们总结一下这几个观点:

JS 加密,也便是通过 JS 代码,将数据进行加密处理,将明文数据变成密文数据。
如果不能将其解密,密文数据将毫无用途。
JS 解密:通过 JS 代码,将加密的数据解密,也便是将密文数据解析成明文数据。
JS 解密是 JS 加密的逆过程。
JS 稠浊:将 JS 代码(比如 JS 函数)本身进行加密。
JS 反稠浊:将加密了的 JS 代码解密成常规的 JS 代码。
常日直策应用暴力破解即可。
JS 逆向(主要):通过 Python 代码调用 JS 的函数。

附,ajax 要求的各个数据的含义:

$(function () { $(".submit").on("click", function () { var sub = $(".search").val()//拿到输入框的值 $.ajax({ type: "POST", //要求类型 url: 'https://www.aqistudy.cn/apinew/aqistudyapi.php', //要求地址和参数 GET要求才把参数写在这里 data: d // res加密的相应数据 success: function (res) { //要求成功后实行的函数res是返回的值 xxxx // 在对res的密文数据进行解密 } }); });});

标签:

相关文章