JS逆向解析-笔记《python爬虫使用》


最主要的还是自己要耐心在浏览器中搜索自己想要的代码数据,然后一步步把加密结果回退;

一、总结

搜索:全局搜索、代码内搜索
debug:常规debug、XHR debug、行为debug
查看请求调用的堆栈
执行堆内存中的函数
修改堆栈中的参数值
写js代码
打印windows对象的值
勾子:cookie钩子、请求钩子、header钩子

二、目前加密的方式总结有下面几点:

对称加密(加密解密密钥相同):DES、DES3、AES

非对称加密(分公钥私钥):RSA

信息摘要算法/签名算法:MD5、HMAC、SHA

前端实际使用中MD5、AES、RSA,自定义加密函数使用频率是最高的

几种加密方式配合次序:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,用签名算法生成非对称加密的摘要

DES、DES3、AES、RSA、MD5、SHA、HMAC传入的消息或者密钥都是bytes数据类型,不是bytes数据类型的需要先转换;密钥一般是8的倍数

Python实现RSA中,在rsa库中带有生成签名和校对签名的方法

安全性:DES<DES3=AES<RSA,至于MD5、SHA、HMAC不好说了
搜其他关键词如RSA、encrypt,尤其是encrypt

扫描二维码关注公众号,回复: 14969649 查看本文章

其中this.exponent是RSA加密偏移量 ,数值一般在HTML文件里面,全局搜索,其value值就是

密钥的值一般在网页源码的一个元素值。全局搜索,其value值就是,或者是js中找到

三、逆向解密解决思路:

(1)是根据加密参数,如“x-uab”关键字在所有关键中查找

打开chrome浏览器 按F12

找到点击source中 按ctrl + shift + F快捷键 ,输入x-uab找到js代码

接下来,打个断点调试一下:在数字那里点一下,数字位置出现蓝点,表示添加断点成功

然后刷新获取店铺列表的页面,程序会在断点处停下,在控制台调试o.getUA()函数,看一下输出

继续向下查看这个关键词参数 js 生成函数的引用,一步步往回推,找到最原始的 js 生成方法

找到以后,把这个function 方法全部代码取出来,另存为一个js文件。

(2)怎么用python执行js脚本?

方法一:
​ 自己搞懂生成的过程,是md5还是AES加密,找到key值,时间戳其余参数啥的也可以生成,做过后台开发的会比较清楚其生成原理,因为需要对接前后端接口

方法二:execjs
因为在上面复制出来的脚本中,只单单定义了一个方法,并没有调用这个方法,所以,要在js文件的末尾添加一些代码来调用

function getParam() {
    
    
 var a;
 var param = e(2,a);
 return param
};

Python代码
原理:将execjs的引擎换成PhantomJS这个无头浏览器,换句话说就是用PhantomJS来执行js脚本,PhantomJS是一个浏览器,自然就会创建window对象。

import execjs
  
import os
os.environ["EXECJS_RUNTIME"] = "PhantomJS"
node = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)

不用PhantomJS方法

import execjs
  
node = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)

可能会报错:execjs._exceptions.ProgramError: TypeError: ‘window’ 未定义
原因:window对象估计是浏览器打开是创建的,蕴含浏览器的信息,所以用Python来执行这段代码时,没有这个对象
方法三:

思路和方案二类似,不过更加粗暴一些。因为没在浏览器执行,那就模拟浏览器来执行。

在执行之前,同样要修改js脚本,在js文件末尾调用e方法,添加如下代码,例:

var a;
var param = e(2,a);
return param;

注意:调用方法不要放在任何函数里面,我之前就是因为将这段代码放在函数里头强制执行,导致的结果就是在浏览器里可以获取加密字符串,但是在Python中获取到的却是None

模拟浏览器用的selenium和chrome的webDriver,代码如下:

from selenium import webdriver
  
browser = webdriver.Chrome(executable_path='chromedriver.exe')
with open('eleme.js', 'r') as f:
     js = f.read()
print(browser.execute_script(js))

最终获得加密之后的字符串

最后,有必要说一下,如果需要获取大量的x-uab,采用方案三效率会高一下,因为采用方案二的话,可以自打开一个浏览器(都调用一个webdriver对象),然后快速执行js,返回加密字符串。

猜你喜欢

转载自blog.csdn.net/G_GUi/article/details/127344019