网络爬虫—js逆向
js逆向
📑 📑在这个大数据时代,我们眼睛所看到的百分之九十的数据都是通过页面呈现出现的,不论是PC端、网页端还是移动端,数据渲染还是基于html/h5+javascript进行的,而大多数的数据都是通过请求后台接口动态渲染的。而想成功的请求成功互联网上的开放/公开接口,必须知道它的URL、Headers、Params、Body等数据是如何生成的。
JavaScript逆向的详细讲解
📑 📑JavaScript逆向工程是指通过分析JavaScript代码和运行行为来理解程序的内部机制。这种技术可以用于破解JavaScript程序的加密和混淆,以及获取程序的逻辑和数据等信息。
以下是JavaScript逆向的详细讲解:
1. JavaScript逆向工程的基本原理
📑 📑JavaScript逆向工程的基本原理是通过分析JavaScript代码和运行行为来理解程序的内部机制。这种技术可以用于破解JavaScript程序的加密和混淆,以及获取程序的逻辑和数据等信息。
JavaScript逆向工程通常包括以下步骤:
1)获取JavaScript代码
:
可以使用浏览器的开发人员工具或其他工具来获取JavaScript代码。
2)分析JavaScript代码
:
可以使用代码编辑器或其他工具来分析JavaScript代码,包括查找函数、变量、常量和操作符等。
3)调试JavaScript代码
:
可以使用浏览器的开发人员工具或其他工具来调试JavaScript代码,包括断点调试、单步调试和变量监视等。
4)破解JavaScript代码
:
可以使用反混淆和反编译工具来破解JavaScript代码,以获取程序的逻辑和数据等信息。
2. JavaScript逆向工程的应用场景
JavaScript逆向工程可以应用于以下场景:
1)破解加密和混淆的JavaScript程序
:JavaScript逆向工程可以破解加密和混淆的JavaScript程序,以获取程序的逻辑和数据等信息。
2)调试和测试JavaScript程序
:JavaScript逆向工程可以帮助开发人员调试和测试JavaScript程序,以发现程序中的错误和问题。
3)优化JavaScript程序的性能和安全性
:JavaScript逆向工程可以帮助开发人员优化JavaScript程序的性能和安全性,以提高程序的质量和可靠性。
4)研究JavaScript程序的内部机制
:JavaScript逆向工程可以帮助研究人员研究JavaScript程序的内部机制,以发现其中的漏洞和安全问题。
3. JavaScript逆向工程的注意事项
在进行JavaScript逆向工程时,需要注意以下事项:
1)遵守法律法规
:
JavaScript逆向工程可能涉及版权、知识产权和隐私等问题,需要遵守相关的法律法规。
2)保护个人隐私
:
在分析JavaScript程序时,需要遵守个人隐私的原则,不得获取个人信息和敏感信息。
3)避免滥用JavaScript逆向技术
:
JavaScript逆向技术可以用于破解和攻击,需要避免滥用。
4)保护JavaScript程序的安全性
:
在进行JavaScript逆向工程时,需要保护JavaScript程序的安全性,不得泄露JavaScript程序的机密信息和漏洞。
5)学习和研究JavaScript逆向技术
:
JavaScript逆向技术是一种有用的技术,需要学习和研究,以提高自己的技能和知识水平。
实战是学习知识最快的途径,下面进行实战演示帮助理解学习。
实战演示
有道翻译
有道翻译
浏览器:谷歌浏览器
右键检查,输入需要翻译的内容,然后开始抓包
🎯点击翻译,我们得到两个数据,一个是key,请求方式是post,状态是200
载荷是西瓜,预览里面出现success,表示翻译成功。
🎯还有一个文件是webtranslate,请求方法同样是post,状态是200,载荷里面有西瓜两个字和一些参数,预览和响应里面是一串加密的数据。
🎯接下来敲代码来获取文件,然后来破解数据
# coding = utf-8
import crawles
url = 'https://dict.youdao.com/webtranslate'
cookies = {
'OUTFOX_SEARCH_USER_ID': '-312652410@10.108.162.134',
'OUTFOX_SEARCH_USER_ID_NCOO': '42958927.495580636',
}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
'Origin': 'https://fanyi.youdao.com',
'Pragma': 'no-cache',
'Referer': 'https://fanyi.youdao.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-site',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
'sec-ch-ua': '\"Google Chrome\";v=\"113\", \"Chromium\";v=\"113\", \"Not-A.Brand\";v=\"24\"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '\"Windows\"',
}
data = {
'i': '西瓜',
'from': 'auto',
'to': '',
'domain': '0',
'dictResult': 'true',
'keyid': 'webfanyi',
'sign': 'f522e5818a8497d9a329a93a522eaa2e',
'client': 'fanyideskweb',
'product': 'webfanyi',
'appVersion': '1.0.0',
'vendor': 'web',
'pointParam': 'client,mysticTime,product',
'mysticTime': '1683270687293',
'keyfrom': 'fanyi.web',
}
response = crawles.post(url, headers=headers, data=data, cookies=cookies)
print(response.text)
运行结果:
🎯接下来我们可以通过多次发多次请求来观察哪些是变的,哪些是不变的数据:
🎯经过对比,我们发现,sign
,mysticTime
这两个字段的参数是动态变化的。
🎯参数大概分析之后,我们就找出对应的js文件,来分析一下js是如何处理的参数
选择文件,点击启动器,然后可以随便点击一个文件,然后点击它。
🎯输入sign后,如果出现多个,我们需要逐个观察,看哪一个符合要求
🎯我们在sign这里打上断点,然后点击翻译,进行抓包处理,得到e和t的值
e: "fsdsogkndfokasodnaso"
t: 1683272866426
🎯然后我们点击其他参数,获取数据
🎯接下来我们写代码,来得到sign的值
import time
t = 'fsdsogkndfokasodnaso'
e = time.time()
e = 1682603344052
d = 'fanyideskweb'
u = 'webfanyi'
data = f'client={d}&mysticTime={e}&product={u}&key={t}'
from hashlib import md5
m = md5()
m.update(data.encode('utf-8'))
nonce = m.hexdigest()
print(nonce)
🎯接下来对字符串进行解密,将解密后的字节码转换为utf-8编码的文本字符串。
import hashlib
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
# 导入必要的模块和库
# pip install pycryptodome
# 将存放模块的文件(Crypto)改成大写开头(Crypto)
def decrypt( decrypt_str):
key = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl"
iv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
key_md5 = hashlib.md5((key).encode('utf-8')).digest()
iv_md5 = hashlib.md5((iv).encode('utf-8')).digest()
print('key_md5:', key_md5)
print('iv_md5:', iv_md5)
print()
aes = AES.new(key=key_md5, mode=AES.MODE_CBC, iv=iv_md5)
code = aes.decrypt(base64.urlsafe_b64decode(decrypt_str))
return unpad(code, AES.block_size).decode('utf8')
print(decrypt(response.text))
设置密钥和初始向量
key = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl"
iv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
对密钥和初始向量进行哈希处理
key_md5 = hashlib.md5((key).encode('utf-8')).digest()
iv_md5 = hashlib.md5((iv).encode('utf-8')).digest()
创建AES对象并解密消息
aes = AES.new(key=key_md5, mode=AES.MODE_CBC, iv=iv_md5)
code = aes.decrypt(base64.urlsafe_b64decode(decrypt_str))
移除padding并返回结果
return unpad(code, AES.block_size).decode('utf8')
🎯这段代码主要实现了一个AES-CBC加密算法的解密过程,使用了哈希函数增强了密钥和初始向量的安全性,并通过base64编解码和padding移除等操作对加密消息进行了处理。
运行结果如下:
🎯后续可以对数据进行解析,提取出我们想要的数据。