X = 1621779426453
U = 1621779410888
w = 1621779395276
jt.data = 1621779395276
s
O
监听垂直滚动条事件(scrollTop)
window.document.body.scrollTop
O.data = [{
scrollTop: xxx,
timestamp = Date.now() - w // w = 1621523124040
}]
R
监听鼠标点击事件, 按下鼠标(mousedown)
R.data = [
{
clientX: 715
clientY: 325
elementId: ""
timestamp: Date.now() - w
},
....
]
时间戳w
Lt
case "0":
r[n("0x97", "bpr9")](qt);
continue;
case "1":
this[n("0x132", "GmkI")](t[j] || 879609302220);
continue;
case "2":
r[n("0xf2", "^o[d")](Gt, Z, et);
continue;
case "3":
Z = ot[w]();
continue;
case "4":
r[n("0x150", "%LaC")](It);
continue
}
Wt
监听鼠标点击事件(click), 如果Wt.data > 1执行Wt.data.shift(). 即记录的是最后一条点击事件
Wt.data = [{
clientX: 715
clientY: 325
elementId: ""
timestamp: Date.now() - w
}]
pt
当前页面地址
document.location.href
pt.data = {
href: "http://yangkeduo.com/pincard_share_card_popup.html?_pdd_fs=1&_pdd_tc=00ffffff&categoryId=39236&refer_origin_page_sn=17542&refer_page_name=list_channel&refer_page_id=67387_1615819189608_3dep3yqyuo&refer_page_sn=67387&refer_abtest_info=%7B%7D",
port: ""
}
mt
mt.data = {
availHeight: 1025,
availWidth: 1891
}
vt
vt.data = "3287976604829790-1621528579964" // vt.data = 随机数-U
U
Lt[d("0x1d", "s2FC")][d("0x40", "cn*L")] = function(t) {
X = ot[w](),
U = t // 1621528579964
}
bt
验证浏览器环境
bt.data = 8192
# bt的验证参数r
r = [
0: 0 // 判断当前window.outHeight < 1 || window.outWidth < 1
1: 0 // 判断档期是否有windwow._phantom || window.callPhantom
2: 0 // 判断有无window.Buffer
3: 0 // 判断有无window.emit
4: 0 // 判断有无window.spawn
5: 0 // 判断有无navigator.webdriver
6: 0 // 判断有无window.domAutomation
8: 0 // 判断navigator.plugins是否大于0
9: 0 // 判断navigator.language是否为""
10: 0 // 判断有无window.vendor
11: 0 // 判断有无window.Modernizr
12: 0 // 判断有无window.chrome
13: 1 // 判断'webdriver' in navigaotr
14: 0 // 判断navigator.hasOwnProperty('webdriver')是否为true
15: 0 // 判断History.back.toString()中是否有'ipcRenderer'
16: 0 // 判断browser.versions 是否有module
17: 0 // 判断window.document.getElementById.toString() 是否含有native code
]
gt
gt.data = c.pbc(window.location.href)
kt
// DeviceOrientationEvent 表示手机屏幕翻转
kt.data = 'n' // 网页端固定为n
_t
// DeviceMotionEvent位置和方向改变速度的信号
_t.data = 'n' // 网页端固定为n
yt
yt.data = Date.now() - X // x = 1621528592265
wt
wt.data = User-Agent
Ct
cookie中的_nano_fp
Ct.data = {
nano_cookie_fp: "XpEaX0galpCxlpXylT_1I6dtvD7pLG1UO7xZIpLs",
nano_storage_fp: "XpEaX0galpCxlpXylT_1I6dtvD7pLG1UO7xZIpLs"
}
St
St.data = window.document.referrer.split("?")[0]
Ot
cookie中的pdd_user_id
Ot.data = "pdd_user_id"
Rt
cookie中的api_uid
Rt.data = "CksBgV/4eYkFCwBSPt8WAg=="
Pt
请求anti_content的次数
Pt.data = 7
jt
页面初始化的时候产生的时间戳
jt.data = w
Dt
cookie中的pdd_vds
Dt.data = "gaLLNIyLQNiimoGtPyOQEQOIaomoabtNNGbGnQQmIbnLPEQatNOtbPOaLLam"
扣加密函数的时候最好用源文件来扣, 我们自己还原的文件可能会有略微差异, 也就是说我们还原的文件只适合参考
混淆变量的函数可能不唯一, 导致了结果不同
AntiContent生成函数At的环境和调用c.encode
的环境是不一样的
At
控制anti_content生成的流程
c
实际加密, 加工参数的对象, 里面有各种加密函数
Lt
初始化参数中的一些时间戳
找到两者作用域的合集fbeZ
补全fbez
所需要的参数, 并调用fbez
对比真实环境和我们node环境下上下文环境是否一致
将需要的window环境和document环境补全
安装环境
npm install express //服务框架
npm install body-parser // 解析库
启动服务
const express = require('express');
const bodyParser = require("body-parser");
const getAntiContent = require("./obj_anti_content").getAntiContent
const app = express()
app.use(bodyParser.json({limit: '50mb'}))
app.use(bodyParser.urlencoded({ extend: true, limit: '50mb'}))
app.post("/anti_content", function (req, res){
...
})
const server = app.listen(1111, function (){
let host = server.address().address;
let port = server.address().port;
console.log("Server is running at http: //%s: %s", host, port)
})
json.dumps
转为json数据格式传递getAnticontent
需要使用JSON.parse
解析json数据格式parseInt
转变为整数requestTimes
和当前page
是有关系的, 不可以随便给, 当前`requestTime >= page