日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

DuFile网盘逆向下载链接免等待破解思路

發布時間:2023/12/13 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 DuFile网盘逆向下载链接免等待破解思路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在逛某論壇時碰到了DuFile網盤的資源,對于這列靠下載限速+繁瑣跳轉促使用戶付費的收費盤,當然要破解一下玩玩。經過幾個小時的分析,筆者發現這家網盤的策略是比較有趣的,故此記錄一下。

注意:此類收費盤,破解會員高速通道在理論上基本是不可能的,我們能做的只是規避掉等待時間。

打開鏈接,http://dufile.com/file/xxx2e80bxxxx00da.html(地址已做處理),能看出網站的模板都是那種收費網盤的大路貨,直接開調試模式抓包,但這里就遇到了第一個坑。

網頁直接進入無法點擊的調試狀態,只要不關閉調試窗口就一直這樣,而且事后證明如果在訪問網址前就開啟調試面板則網頁根本就不會加載。這實際是一種不太常見的前端反逆向措施(常見的是js代碼混淆),詳情可見這篇文章,破解方法見此。

破解后繼續在調試工具里查看,下一個跳轉的頁面地址是把/file/換成/down/,這也是此類網盤地址跳轉的一概路子,新頁面里我們輸入驗證碼,追蹤到下載按鈕綁定的函數,發現它的代碼在http://dufile.com/js/file.js里,這里的代碼根本沒法讀,不過它用的是最簡單的編碼加密,在線解密一下就明晰了很多;為了增加逆向難度,前端對變量名也做了隨機化處理。我們關注第一行的var _0x100e列表變量,里面出現了debug,console等字樣,可以猜想它們在經過某些處理后形成的語句就會對常用的前端調試手段產生干擾。

幸運的是函數名沒有加密,我們找到down_file函數(其余函數都是舉報,開vip以及無關緊要的xxx),然后用查找功能追蹤里面涉及到的變量,發現引用關系很簡單,只涉及一小段代碼

var _0x100e = ['<divfrmmask"></div>' + _0x5289('0x67') + _0x5289('0x68') + _0x5289('0x69') + '<iframe id="show_down" frameborder="0" scrolling="no" width="352" height="316" scrolling="auto" src="about:blank"></iframe></div></div>';
    document[_0x5289('0x19')][_0x5289('0x6a')](_0x385fa2);
    showMask(!![], 0x15a, 0x164);
    document[_0x5289('0x10')](_0x5289('0x6b'))['src'] = _0x5289('0x6c') + _0x5876ce + _0x5289('0x6d') + _0x3d630b;
}

View Code

將變量名作替換后就很明了

var elelist = ['<divfrmmask"></div>' + _0x5289('0x67') + _0x5289('0x68') + _0x5289('0x69') + '<iframe id="show_down" frameborder="0" scrolling="no" width="352" height="316" scrolling="auto" src="about:blank"></iframe></div></div>';
    document[_0x5289('0x19')][_0x5289('0x6a')](_0x385fa2);
    showMask(!![], 0x15a, 0x164);
*/
    document[getelefunc('0x10')](getelefunc('0x6b'))['src'] = getelefunc('0x6c') + fileid + getelefunc('0x6d') +'0';
//關鍵在于getelefunc('0x6c') + fileid + getelefunc('0x6d'),分別對應elelist[108]和elelist[109],一查便知。
}

View Code

指向了一個鏈接:http://dufile.com/dd.php?file_key=xxxxxxxxxxxx&p=0,而此鏈接GET返回的內容里就含有直接下載地址。

事實上更簡單的方法是直接用第三方工具抓包,比如Charles

可以很直觀的看出發包次序和包內容,于是構造Python腳本如下:

import requests
from bs4 import BeautifulSoup as Bs
import re


class DuFile(object):
    def __init__(self):
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"}
  
    def getfile(self, url, filepath):
        session = requests.session() #用session來維持訪問中的cookie
        req1 = session.get(url, headers=self.headers)
        if req1.status_code==200:
            content = Bs(req1.text, 'lxml')
            file_size = content.select_one('#fbody1').select_one('b').text
            filename = content.select_one('.title').text
            filename = filename.split("下載")[1].strip()
            print("filename: %s, filesize: %sKB" %(filename, file_size))
        else:
            return 'error'
        
        targetaddr = url.replace('/file/','/down/')
        self.headers.update({'Host':'dufile.com', "Referer":url})
        req2 = session.get(targetaddr, headers=self.headers)
        file_id = re.search(r'/down/([a-z0-9]+)', targetaddr).group(1)
        self.headers.update({"Referer":targetaddr})
     
        req4 = session.get("http://dufile.com/dd.php?file_key={}&p=0".format(file_id), headers=self.headers)
        downurl = re.search(r"id="downs" href="(http.+?)"", req4.text).group(1)
        host = re.search(r'http://(.+?)/down', downurl).group(1)
        req_file = session.get(downurl, headers={'Host':host, 'Referer':"http://dufile.com/dd.php?file_key={}&p=0".format(file_id)})
        with open(filepath+filename, 'wb') as f:
            f.write(req_file.content)
        return filename

View Code

但使用中直接拋出了異常,req4返回了意外的結果,是一個地址,打開后

被認出來了......那么疏漏在哪里了呢?

回顧之前的抓包,腳本比正常訪問少的只有

兩處。2發包時間在問題點的后面,應該不是,那就只有1,1是驗證碼的相關操作,分為一個get圖片請求和一個post輸入值提交,如果輸入值正確即返回1。因為絕大多數網盤(飛貓、訊牛等)只會用這個返回值來決定是否執行下一步的下載函數,所以根本不需要去真的填寫驗證碼(飛貓云曾有一段時間把真正地址寫在返回值里,這種是沒辦法跳過去的),DuFile是否在這里也做了驗證?

經試驗,DuFile的驗證碼圖片分為兩種,分別是4位純數字和計算加減法,受URL里的down_code加不加下劃線控制,因為我們不是搞CV的,所以沒必要花時間研究驗證碼識別問題,直接調第三方服務就好,打碼服務百度一下就能找到,一個碼一般1分到幾分錢,還是很便宜的,如果是那種比較白給的驗證碼,甚至可以試試百度免費的圖片轉文字服務,這里就不多做介紹了。直接上修改版代碼

import requests
from bs4 import BeautifulSoup as Bs
import re
import random
import base64
import time
import json
import hashlib


def md5(ss):
    fd = hashlib.md5() 
    fd.update(ss.encode('utf-8'))
    return fd.hexdigest()

def veryimg(img_data):
    link = "http://xxxx.xxxx.com/api/capreg" #這里就不放具體是哪家了
    timestamp = str(int(time.time()))
    pd_id = YOUR_ID
    pd_key = YOUR_KEY
    sign = md5(pd_id + timestamp + md5( timestamp + pd_key))
    predict_type = '10400'  #4位純數字
    
    data = {
        'user_id':pd_id,
        'timestamp':timestamp,
        'sign':sign,
        'predict_type':predict_type,
        'img_data':img_data
    }
    req = requests.post(link, data)
    result = json.loads(req.text)['RspData']
    code = json.loads(result)['result']
    return code

class DuFile(object):
    def __init__(self):
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"}
  
    def getfile(self, url, filepath):
        session = requests.session() #用session來維持訪問中的cookie
        req1 = session.get(url, headers=self.headers)
        if req1.status_code==200:
            content = Bs(req1.text, 'lxml')
            file_size = content.select_one('#fbody1').select_one('b').text
            filename = content.select_one('.title').text
            filename = filename.split("下載")[1].strip()
            print("filename: %s, filesize: %sKB" %(filename, file_size))
        else:
            return 'error'
        
        targetaddr = url.replace('/file/','/down/')
        self.headers.update({'Host':'dufile.com', "Referer":url})
        req2 = session.get(targetaddr, headers=self.headers)
        file_id = re.search(r'/down/([a-z0-9]+)', targetaddr).group(1)
        self.headers.update({"Referer":targetaddr})
        
        '''
        新增驗證碼提交
        '''
        req3 = session.get("http://dufile.com/downcode.php?{}".format(str(random.random())), headers=self.headers)
        # 這里的隨機值是防止瀏覽器去讀緩存而設的,我們腳本里其實不加也行
        if req3.status_code==200:
            # 將圖片二進制轉為base64字符串傳入接口
            code = veryimg(base64.b64encode(req3.content).decode())
        else:
            return 'error'
        req_p = session.post("http://dufile.com/downcode.php", data={'action':'yz','id':file_id, 'code':code}, headers=self.headers)
        
#        
        req4 = session.get("http://dufile.com/dd.php?file_key={}&p=0".format(file_id), headers=self.headers)
        downurl = re.search(r"id="downs" href="(http.+?)"", req4.text).group(1)
        host = re.search(r'http://(.+?)/down', downurl).group(1)
        req_file = session.get(downurl, headers={'Host':host, 'Referer':"http://dufile.com/dd.php?file_key={}&p=0".format(file_id)})
        # 直接一次性請求,如果文件比較大建議用分塊下載(不要用多線程,免費用戶不支持的),寫法網上教程很多這里不贅述
        with open(filepath+filename, 'wb') as f:
            f.write(req_file.content)
        return filename

View Code

重新運行,搞定!

總結

筆者對Yunfile, 飛貓云,彩虹云,訊牛,城通,Busdisk等多家收費盤均進行過逆向破解,DuFile不是難度最大的一個,但它的反破解套路比較有趣,一方面用到了禁調試腳本,一方面又細心地在驗證碼上下了功夫,這兩種在筆者看來都有些劍走偏鋒的意思;特別是驗證碼的部分,誤導性很強,如果配合上彩虹云用的js修改cookies驗證,應該能攔住一大波人。而且經筆者測試,DuFile的下載間隔限制是IP級的,所以即使每次的session都是新生成,也得老老實實等上10分鐘,或者上IP代理池,這點許多網盤也沒能做到。

真有下載剛需的話(嘿嘿嘿~你懂的),還是建議充個會員,中國的服務器、帶寬真心挺貴的,人家也要恰飯嘛。

總結

以上是生活随笔為你收集整理的DuFile网盘逆向下载链接免等待破解思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。