1 通过Network 我们发现了2个数据接口 getrsakey dologin
在dologin 密码是做了加密处理
2 通过搜索关键字password 然后我们确定了一个数据接口 login.js....
继续去它的源码当中搜索关键字 password 。然后逐个分析 var encryptedPassword = RSA.encrypt(password, pubKey); 它可能可以
3 通过断点调试的方式 我们分析到了 它的第一个参数就是传递的我们明文的密码 第二个参数作为公钥来进行加密的
4 var pubKey = RSA.getPublicKey(results.publickey_mod, results.publickey_exp); 通过getrsakey捕获这这个数据 publickey_mod publickey_exp
5 js调试(非常灵活)
首先自己定义了一个函数getPwd()
我们把一些核心的代码复制过来 var encryptedPassword ... var pubKey ...
但是我们要满足代码以及函数之间的调用关系RSA.getPublicKey它的内部实现(RSA加密)
看它的源码 不知道复制那一段代码 但是经过分析 rsa.js文件 我们就把这个文件当中的所有的代码进行了复制
在手动的 把mod exp 的数据添加了进来
总结:
1 我们分析关键字 pwd password xxxx
1.1 search 进行关键字的查询 (小技巧 可以加空格= 空格: = :)
1.2 进行数据的筛选(这个过程有点繁琐 因为正常的情况下我们不一定能够立马甄别出这个就是我们要的数据接口 login.jsxxxx )
1.3 代码格式化 在代码当中继续查找关键字 通过这个步骤继续筛选 可疑的数据
2 确定好有问题的数据之后 打断点 继续进行分析
2.1 分析的过程当中 我们来进一步确定它采用的是什么样的算法
2.2 点进去看它内部的实现逻辑
3 进行JS调试
3.1 你的逻辑要清晰 哪些代码要复制 哪些代码需要改动
3.2 原则上 有问题的代码可以删除 也可以去找这些代码相关的实现 如果还是调试不出来,可以把整个的代码都进行复制
先保证语法没有问题 然后在进行调试
3.3 进行函数的调用 看对明文加密之后的结果
4 Python代码的实现
4.1 创建js文件
4.2 创建py文件 通过py文件来执行js文件
源代码:
import requests
import execjs
url = 'https://store.steampowered.com/login/getrsakey/'
data = {
'donotcache': '1625832100582',
'username': '[email protected]'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
res = requests.post(url=url,headers=headers,data=data).json()
exp = res['publickey_exp']
mod = res['publickey_mod']
# print(exp,mod)
node = execjs.get()
ctx = node.compile(open('steam.js',encoding='utf-8').read())
funcName = 'getPwd("{0}","{1}","{2}")'.format('123456',mod,exp)
pwd = ctx.eval(funcName)
print(pwd)
需求:实现百度翻译(英-->中)
https://fanyi.baidu.com/v2transapi?from=en&to=zh
post请求
hello的
from: en
to: zh
query: hello
transtype: realtime
simple_means_flag: 3
sign: 54706.276099
token: b63c1baede6bec4146706a3fbe53b2ed
domain: common
apple的
from: en
to: zh
query: apple
transtype: realtime
simple_means_flag: 3
sign: 704513.926512
token: b63c1baede6bec4146706a3fbe53b2ed
domain: common
核心点 就是找到这个sign是如何生成的 通过函数来实现的
1 我们还是搜索关键字sign
2 找到了这个关键字所对应的一个函数 e(r) 点击进去看它的内部实现。大多数代码看不懂 有一行代码感觉和我们的这个sing的格式靠谱 p.toString() + "." + (p ^ m)
3 我们就把这个代码块中的所有的代码复制进行调试 调用函数e()
i 未定义
其实它的逻辑是 u 需要一个gtk值 那个值没有所以我们得不到这个sing值
在js代码当中 看到 window 那么它所对应的内容就可以在响应内容中获取到
实现步骤
第一步 获取gtk和token值
目标url 发起请求 get https://fanyi.baidu.com/?aldtype=16047
第二步 实现翻译的逻辑
目标url https://fanyi.baidu.com/v2transapi?from=en&to=zh
携带 data
headers
第三步 数据解析
源代码:
import requests
import json
import re
import execjs
class BaiduSpider:
def __init__(self):
self.get_url = 'https://fanyi.baidu.com/?aldtype=16047'
self.post_url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
#headers不能全都要,因为全写反而不行--》要测试
self.headers = {
# "Accept": "*/*",
# "Accept-Language": "zh-CN,zh;q=0.9",
# "Connection": "keep-alive",
# "Content-Length": "135",
# "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "BIDUPSID=23F0C104655E78ACD11DB1E20FA56630; PSTM=1592045183; FANYI_WORD_SWITCH=1; REALTIME_TRANS_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BAIDUID=23F0C104655E78AC9F0FB18960BCA3D3:SL=0:NR=10:FG=1; BDUSS=lLWjlWMG8zVlpkR3ZzeTh6TkNXallnUk5MVkowMEQ1WUQ4eUN4WWFNUGVxOVJmRVFBQUFBJCQAAAAAAAAAAAEAAADzvSajSjdnaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN4erV~eHq1fbG; BDUSS_BFESS=lLWjlWMG8zVlpkR3ZzeTh6TkNXallnUk5MVkowMEQ1WUQ4eUN4WWFNUGVxOVJmRVFBQUFBJCQAAAAAAAAAAAEAAADzvSajSjdnaGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN4erV~eHq1fbG; __yjs_duid=1_75291bdf8aa1f58166d737d1ab964de51617626867942; MCITY=-158%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESS=478FD12D9AE1E0A668EC95F77E76ED85:FG=1; H_PS_PSSID=33800_33816_31660_33849_33759_33607_33894; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=6; BA_HECTOR=8hahakak2425ahahr01g94eqi0q; BCLID=10200353588141363286; BDSFRCVID=qeIOJexroG38EYbeuG5fMFdQm_weG7bTDYLtOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKKLmOTHpKF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tR3aQ5rtKRTffjrnhPF3KtLPXP6-hnjy3bAOKxTt545nMJQEQ4OGhq4Wbttf5q3RymJJ2-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvX-ug3-7jBM5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIE3-oJqC-WhK043J; BCLID_BFESS=10200353588141363286; BDSFRCVID_BFESS=qeIOJexroG38EYbeuG5fMFdQm_weG7bTDYLtOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKKLmOTHpKF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tR3aQ5rtKRTffjrnhPF3KtLPXP6-hnjy3bAOKxTt545nMJQEQ4OGhq4Wbttf5q3RymJJ2-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvX-ug3-7jBM5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIE3-oJqC-WhK043J; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1619332963,1620111468,1620136920,1620196183; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1620196183; __yjs_st=2_ZWU5NzQ5MzExOWMzMzMxNjE2MzhmODM1ZWQwZjUxNGZhYWQ0NTBkMTRiYjRlMDZmMWJiMzhkMWQxNzRkZmZiZDdjZGU1OTBkNzhiNzdiMWI2ZTRiODg3YmVkMDQzMDBkMTcwMTgwYzg2ZTBlMjVjZjE1YThhZTgyNTYxYjVlODhkYWU5NDA3ZmExYWRhYTU3MGMyZDNjODIzMGRhOTBiNzFhMmIwNDYxZDI1M2M1MGY4ZjcxYjI0NjAxOTllNDJlYThhMzc0NDY5NDg3OGRkMzg2ZmJjYTdmOTNlM2JjOWZlM2IxN2FkMjVjNmQ3MjIxZGI1ZTkzMTQzZDhiNGE0NDc4ZjIyNGY2ZmNiZTEwYTEzNzY2MmNiZGU3ZTM2OWJkXzdfYjY1OTEyZjU=; ab_sr=1.0.0_ODZhNTQxOWVlOWQ5ODM2MTlkODhmNmI2NGM2MDI2YzVkNTRmNGQzOWU2ZDRjZTU1OTEwMGM2MzY0NjNjYzY5MjMyZTcwOTljYTM2MDNjYWExMGUwODY2ZTI0YWYyM2JjMTIzMzcyMTljMTk5M2U4Zjg1NGQ2ZWRkNTYxOTZkNDE=",
"Host": "fanyi.baidu.com",
"Origin": "https://fanyi.baidu.com",
"Referer": "https://fanyi.baidu.com/?aldtype=16047",
# "sec-ch-ua-mobile": "?0",
# "Sec-Fetch-Dest": "empty",
# "Sec-Fetch-Mode": "cors",
# "Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
# "X-Requested-With": "XMLHttpRequest",
}
# 获取gtk和token
def get_gtk_token(self):
html = requests.get(url=self.get_url,headers=self.headers).text
token_re = "token: '(.*?)'"
gtk_re = "window.gtk = '(.*?)'"
# 获取gtk
pattern1 = re.compile(gtk_re)
gtk = pattern1.findall(html)[0]
# 获取token
pattern2 = re.compile(token_re)
token = pattern2.findall(html)[0]
# print(gtk)
# print(token)
return gtk,token
# 获取sign translate.js
def get_sign(self,word,gtk):
with open('baidufanyi.js', 'r') as file_obj:
js_data = file_obj.read()
exec_obj = execjs.compile(js_data)
gtk = 1
sign = exec_obj.eval('e("{}","{}")'.format(word,gtk))
return sign
# 主函数
def main(self):
word = input('请输入您要翻译的内容:')
gtk,token = self.get_gtk_token()
sign = self.get_sign(word,gtk)
data = {
"from": "en",
"to": "zh",
"query": word,
"transtype": "realtime",
"simple_means_flag": "3",
"sign": sign,
"token": token,
"domain": "common",
}
html = requests.post(url=self.post_url,data=data,headers=self.headers).json()
result = html['trans_result']['data'][0]['dst']
print(result)
if __name__ == '__main__':
b = BaiduSpider()
b.main()
调试js代码遇到的问题:
js调试时遇到的问题:哪里不行删哪里,
‘BigInteger’ 未定义:搜索 BigInteger 然后复制这个function(或其所在的整个js文档)
对象不支持此属性或方法 复制这个function所在的整个js文档
‘navigator’ 未定义:加navigator = this;
–>返回类型:空
–>该类型结果此版本不支持 python中再试