新聞中心
分析網(wǎng)址:'aHR0cHM6Ly9tbXMucGluZHVvZHVvLmNvbS9nb29kcy9nb29kc19saXN0'

創(chuàng)新互聯(lián)自2013年起,公司以做網(wǎng)站、網(wǎng)站制作、系統(tǒng)開(kāi)發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶(hù)1000+,涉及國(guó)內(nèi)多個(gè)省份客戶(hù)。擁有多年網(wǎng)站建設(shè)開(kāi)發(fā)經(jīng)驗(yàn)。為企業(yè)提供專(zhuān)業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過(guò)專(zhuān)業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶(hù)提供各種風(fēng)格的特色服務(wù)。
1.介紹-為什么要逆向anti-content參數(shù)
用代碼訪(fǎng)問(wèn)后臺(tái)數(shù)據(jù)不帶anti參數(shù)的話(huà)會(huì)提示“訪(fǎng)問(wèn)頻繁”,所以需要逆向出這個(gè)參數(shù)!
2.開(kāi)始逆向js
2.1 找參數(shù)所在位置-先在控制臺(tái)全局搜索參數(shù)名字
搜索出來(lái)10個(gè)結(jié)果 不算多,每個(gè)都點(diǎn)進(jìn)去 在差不多的關(guān)鍵詞位置打上斷點(diǎn)先。
因?yàn)樗麬jax請(qǐng)求每個(gè)頁(yè)面都要anti參數(shù) 所以我們下斷點(diǎn)之后隨便點(diǎn)個(gè)按鈕都能用 已經(jīng)斷下來(lái)了,這個(gè)aa1d開(kāi)頭的js文件(你們的不一定叫這名),可以把其他斷點(diǎn)取消了,現(xiàn)在來(lái)著重分析這個(gè)。
2.2 跟棧-找加密的方法
return Promise.resolve(u(t.rawFetch, d).catch((function() {}
直接f8放過(guò)去 再重新點(diǎn)一次 會(huì)到達(dá)上面那個(gè)斷點(diǎn)
f11單步調(diào)試進(jìn)來(lái) 會(huì)跟到這里
getCrawlerInfo: function(t) {
return Promise.resolve(G((function() {
var e = I.a.getInstance(t);
return Promise.resolve(e.getServerTime()).then(F)
}
), (function() {
return ""
}
)))
}
對(duì)于異步不太懂的 我這里強(qiáng)行演示一波 (百度小抄一下改改)
//1. Promise.resolve("111")
Promise.resolve("111")
//Promise {: '111'}
// [[Prototype]]: Promise
// [[PromiseState]]: "fulfilled" 這是完成的狀態(tài)
// [[PromiseResult]]: "111" 這是結(jié)果
//2.Promise.resolve("").then(函數(shù)())
Promise.resolve("我是參數(shù)?").then(function(a){console.log("111",a);return "123"})
//111 我是參數(shù)?
//Promise {: '123'}
// [[Prototype]]: Promise
// [[PromiseState]]: "fulfilled"
// [[PromiseResult]]: "123"
所以e是時(shí)間戳,f是主要函數(shù) 下斷點(diǎn)到這 f8直接過(guò)來(lái) 再單步兩次到F
要的是里面的這串代碼 :new一個(gè)對(duì)象 對(duì)象傳入一個(gè)包含serverTime的對(duì)象這里我也不太理解 最后messagePack肯定就是方法了。不管他直接復(fù)制在控制臺(tái)跑一下出結(jié)果了。
new (n("eDaA"))({
serverTime: t
}).messagePack()
2.3 代碼分析
n("eDaA") 我第一眼看這不就是個(gè)webpack嗎 當(dāng)時(shí)覺(jué)得還是以前的玩法 找到n方法的加載器 再?gòu)?fù)制eDaA這個(gè)模塊就可以跑了。沒(méi)想到跟進(jìn)去發(fā)現(xiàn) eDaA里面又是一個(gè)加載器和模塊 第一次見(jiàn)到這樣的 沒(méi)玩過(guò),研究了半天
eDaA導(dǎo)出fbeZ fbeZ又導(dǎo)出里面的整個(gè)webpack
所以最后我們只要fbeZ里面的webpack 跳過(guò)第一層直接取它, 因?yàn)樗堑诙拥?加載器不適用,需要找個(gè)通用的加載器
下面的加載器可以輸出"111"就行
window=global;
!(function (e) {
var i = {}
, o = {
index: 0
}
function c(t) {
if (i[t])
return i[t].exports;
var n = i[t] = {
i: t,
l: !1,
exports: {}
};
// console.log(t)
return e[t].call(n.exports, n, n.exports, c),
n.l = !0,
n.exports
}
window.hliang1 = c
}
)([
function(e,t,n){
console.log("111")
}
])
window.hliang1(0)
復(fù)制過(guò)來(lái)后 把前面列表的[和屁股后面的}]刪除掉一個(gè) 因?yàn)闀?huì)復(fù)制多
因?yàn)橛胣otepad++代碼格式化的問(wèn)題,有一個(gè)模塊會(huì)提示代碼有問(wèn)題
去網(wǎng)站重新粘貼一下這串代碼到vscode(pycharm)
這樣就完成了,用window.hliang1 就可以調(diào)用模塊了
下面開(kāi)始復(fù)制qe對(duì)象
它new 的qe對(duì)象就在模塊里面啊,我不知道怎么直接new 所以新建了一個(gè)函數(shù) 然后對(duì)它改寫(xiě)
全部復(fù)制下來(lái)
function hliang_qe(){
//復(fù)制進(jìn)這里來(lái)
}
(function (e, t) {}).call(this,a,b) 這種就是 把a(bǔ),b傳參到e,t
所以改寫(xiě) 匿名刪除去掉,.call去掉,傳參的e,t直接設(shè)置成
var e=window.hliang1(3) 還有其他地方n() 這里加載器名字改一下
t原本的作用是導(dǎo)出(t.exports)那我這里不要t了 直接導(dǎo)出改成return
如下圖
復(fù)制到瀏覽器執(zhí)行,成功出結(jié)果。但是這個(gè)代碼在node.js還需要補(bǔ)環(huán)境和改環(huán)境。
3.環(huán)境檢測(cè)
在瀏覽器能跑 在node.js跑不了 需要補(bǔ)環(huán)境。
這都啥報(bào)錯(cuò)啊,看不懂。 先上環(huán)境吧。
算了懶得寫(xiě)了。
直接告訴你們要補(bǔ)啥吧。
cookie和localStorage.Item傳入自己的就行了 過(guò)期的也沒(méi)事
window = global
document={
addEventListener:function addEventListener(a,b){
// console.log("addevent",a,b)
return undefined
},
referrer:'',
getElementById:function getElementById(a){
console.log("getbyid",a)
return ""
},
cookie:''//這里傳一個(gè)自己的cookie 過(guò)期了的也沒(méi)事
}
var Plugins={0:{}}
navigator={
webdriver:false,
plugins: Plugins,
languages:["zh-CN","zh"],
hasOwnProperty:function hasOwnProperty(a){
// console.log(a,"hasOwnProperty");
if (a=="webdriver"){
return false
}
},
userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.36"
}
screen={availWidth:1920,availHeight:1040}
history={
back:function back(){console.log("back",arguments)}
}
location={
href:"https://mms.pinduoduo.com/goods/goods_list",
port:""
}
chrome={}
localStorage={
getItem:function getItem(a){
// console.log("item",arguments)
if (a=="_nano_fp"){
return "" //這里也傳一個(gè)自己的
}
}
}
window["chrome"]=chrome
window["location"]=location
window["navigator"]=navigator
window["history"]=history
window["document"]=document
window["screen"]=screen
window["localStorage"]=localStorage
Object.defineProperty && Object.defineProperty(window, "outerHeight", {
value: 1040,
writable: false
});
Object.defineProperty && Object.defineProperty(window, "outerWidth", {
value: 1920,
writable: false
});
function DeviceOrientationEvent(){
console.log("DeviceOrientationEvent",arguments)
}
window["DeviceOrientationEvent"]=DeviceOrientationEvent
function DeviceMotionEvent(){
console.log("DeviceMotionEvent",arguments)
}
window["DeviceMotionEvent"]=DeviceMotionEvent
//delete window.Buffer //e("0x3c", "anZ%")
document.getElementById.toString=function(){
return 'function getElementById() { [native code] }'
}
可以了。環(huán)境+上面的代碼就能跑了
{"success":true,"errorCode":1000000,"errorMsg":null,"result":{"sessionId":"e70ae011c9c64f8fbf0e70fada362385","total":0,"goods_list":[]}}
演示地址:
??http://z.hl98.cn/index.php?share/file&user=102&sid=CiAXx7ry??
小伙伴們,快快用實(shí)踐一下吧!
本文名稱(chēng):拼刀刀店鋪后臺(tái)的參數(shù)Anti-content逆向分析
轉(zhuǎn)載來(lái)源:http://m.fisionsoft.com.cn/article/copogog.html


咨詢(xún)
建站咨詢(xún)
