吾愛破解 - LCG - LSG |安卓破解|病毒分析|huihengkj.com

 找回密碼
 注冊[Register]

QQ登錄

500彩票邀请码只需一步,快速開始

搜索
查看: 740|回復: 9

[Python] 課后網登錄+課程回放分析及代碼實現

[復制鏈接]
樓主
hksnow 發表于 2020-6-3 11:50 回帖獎勵
本帖最后由 hksnow 于 2020-6-3 11:55 編輯

課后網登錄+課程回放分析及代碼實現

0x01 前言

上課沒跟上,準備看回放,登錄過程中就想能不能搞一搞,寫完筆記后就抓包分析了一下。我們上網課使用的是課后網(無限寶),于是就有了這篇帖子。分析+帖子排版耗時大概4h,肝到12:20。

0x02 工具及開發環境

  • Charles(我叫它'插花瓶')
  • Google Chrome
  • Visual Studio Code
  • Python 3.8.1
  • JS調試工具
  • nodejs

0x03 分析

Login

登錄首頁

  • 獲取驗證碼
    =()
    這里獲取驗證碼的scriptid對應首頁網頁源碼script_id,signature對應init_req_sign

response = requests.get(url,headers = headers1)
html_content = response.text.replace(' ','').replace('\t','').replace('\n','').replace('\\','')
#signature = re.findall('id="signature"value="(.*?)"',html_content,re.S)[0]
script_id = re.findall("script_id:\'(.*?)'",html_content,re.S)[0]
init_req_sign = re.findall("init_req_sign:\'(.*?)'",html_content,re.S)[0] # 獲取驗證碼用的'signature'
login_init_sign = re.findall("login_init_sign:\'(.*?)'",html_content,re.S)[0] # 登錄用的'signature'
 login_encry_key = re.findall("login_encry_key:\'(.*?)'",html_content,re.S)[0] # 登錄用的加密key
url = 'http://center.kehou.com/scriptInit.htm?callback=onCallBack&scriptId=' + script_id + '&serverId=5&signature=' + init_req_sign 
response = requests.get(url,headers = headers2)
Token_id = re.findall('"Token_id":"(.*?)"',response.text,re.S)[0]
verify_url = 'http://center.kehou.com/verifyCode.htm?tokenId=' + Token_id
response = requests.get(verify_url)
with open('verify.png','wb') as f:
    f.write(response.content)
  • 構造登陸數據

登錄網址

賬號111111111密碼2222222222的登陸數據(get)

loginType SCRIPT_LOGIN
callbackon CallBack
loginField 1111111111
password        2e3129c366b4455dfe50c587d94c122b
platform        db
serverId        5
verifyCode        2305
ruleId        DEFAULT
url        
signature        2167c852971b961e31c8a76e5d0cc26e
aid        3
scriptId        91D3D5E14ECB42C98F2AA0F304C96CB6
tokenId        B5DCE5867EB347A38ECC775A894494FE
loginSign        ALWAYSASK
        1591072403658

經前后檢查,發現登陸數據signature為登陸首頁源碼的login_init_sign,tokenId為獲取驗證碼時的tokenId。

可以看到只有一個數據是加密的:password,這里瀏覽器調試工具搜索關鍵字

跟蹤scriptLogin

經前后檢查,發現加密loginParam.login_encry_key為登錄首頁獲取的login_encry_key,pw_id_val為密碼明文
這里已經很明顯了,password的加密過程,把部分代碼放到js調試工具,構造加密函數,獲取加密返回值

  • 提交登陸數據后

返回響應內容

onCallBack('{"Status":true,"Multil":false,"LoginType":"SCRIPT_LOGIN","Users":[{"realName":"","agencyDomain":"hdb.kehou.com","agencyName":"省空中課
堂(db)","url":""}');

(部分內容已經清理,涉及個人信息)

500彩票邀请码抓包分析下一步訪問的網址在相應內容的基礎上增加了Token和script_id

url = re.findall('"url":"(.*?)"',response.text,re.S)[0] + '&tokenId=' + Token_id + '&scriptId=' + script_id

500彩票邀请码訪問這個新構造的url,即可完成登錄過程


headers3 = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'sec-fetch-site': 'same-site',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-user': '?1',
        'sec-fetch-dest': 'document',
        'referer': 'http://center.kehou.com/login.htm?serverId=1&url=https%3A%2F%2Fhljskzkt.db.kehou.com%2Findex.htm&platform=db&aid=3'
    }
    response = requests.get(url,headers = headers3)

再次訪問課程網頁可以看到已經可以獲取點播課程,說明登錄獲取的cookie生效

login細節說明及問題

1,上文可以看到我在js調試工具里已經獲取到pwd的加密內容,但在python里卻不能正常獲取。

<u>解決辦法:在運行目錄執行npm install cryptojs,再在js里引用模塊</u>

def get_password(login_encry_key,password):
    with open('getpwd.js','r') as f:
        js_code = f.read()
    encrypt_password = execjs.compile(js_code).call('getpwd',login_encry_key,password)
    return encrypt_password
function getpwd(login_encry_key, password) {
    var CryptoJS = require('crypto-js');
    var key = CryptoJS.enc.Hex.parse(login_encry_key);
    var iv = CryptoJS.enc.Hex.parse("30313233343536373839414243444546");
    var securityPwd = CryptoJS.AES.encrypt(password, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    }).ciphertext.toString();
    return securityPwd;
}

<u>另外這里應該可以用python直接實現加密,奈何本人不會,直接用現成的js代碼實現,如果有大神會的話希望可以分享下代碼,謝謝!</u>
2,使用

requests = requests.session()

幫助處理cookie,避免
3,這類登錄實現一定要注意headers,尤其referer字段,如果錯誤,訪問無法繼續,
耽誤我最長時間的就是這個referer**

完整的登錄代碼(python配合js)


import requests
import execjs
import re
import time
requests = requests.session()
headers2 = {
        'referer': 'http://center.kehou.com/login.htm?serverId=1&url=https%3A%2F%2Fhljskzkt.db.kehou.com%2Findex.htm&platform=db&aid=3',
        'sec-fetch-dest': 'script',
        'sec-fetch-mode':'no-cors',
        'sec-fetch-site': 'same-site',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}
def login(user,password,verify,Token_id,login_init_sign,login_encry_key,script_id):
    url = 'http://center.kehou.com/scriptLogin.htm'
    encrypt_password = get_password(login_encry_key,password)
    params = {'loginType': 'SCRIPT_LOGIN','callback': 'onCallBack','loginField': user,'password': encrypt_password,'platform': 'zj','serverId': '5','verifyCode': verify,'ruleId': 'DEFAULT','url': 'http://hljskzkt.db.kehou.com/index.htm','signature': login_init_sign,'aid': '-1','scriptId': script_id,'tokenId': Token_id,'loginSign': 'ALWAYS_ASK','_': str(int(round(time.time() * 1000)))}
    response = requests.get(url,params = params,headers = headers2)
    print(response.text)
    url = re.findall('"url":"(.*?)"',response.text,re.S)[0] + '&tokenId=' + Token_id + '&scriptId=' + script_id
    headers3 = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'sec-fetch-site': 'same-site',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-user': '?1',
        'sec-fetch-dest': 'document',
        'referer': 'http://center.kehou.com/login.htm?serverId=1&url=https%3A%2F%2Fhljskzkt.db.kehou.com%2Findex.htm&platform=db&aid=3'
    }
    response = requests.get(url,headers = headers3)

    headers4 = {
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-site': 'none',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'referer': 'http://vod.db.kehou.com/vod/myVideoCenter.htm',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
    }
    response = requests.get('http://vod.db.kehou.com/vod/myVideoCenter.htm',headers = headers4)
    print(response.text)
def login_initialize():
    headers1 = {
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-site': 'none',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
    }
    url = 'http://center.kehou.com/login.htm?serverId=1&url=https%3A%2F%2Fhljskzkt.db.kehou.com%2Findex.htm&platform=db&aid=3'
    response = requests.get(url,headers = headers1)
    html_content = response.text.replace(' ','').replace('\t','').replace('\n','').replace('\\','')
    #signature = re.findall('id="signature"value="(.*?)"',html_content,re.S)[0]
    script_id = re.findall("script_id:\'(.*?)'",html_content,re.S)[0]
    init_req_sign = re.findall("init_req_sign:\'(.*?)'",html_content,re.S)[0] # 獲取驗證碼用的'signature'
    login_init_sign = re.findall("login_init_sign:\'(.*?)'",html_content,re.S)[0] # 登錄用的'signature'
    login_encry_key = re.findall("login_encry_key:\'(.*?)'",html_content,re.S)[0] # 登錄用的加密key
    url = 'http://center.kehou.com/scriptInit.htm?callback=onCallBack&scriptId=' + script_id + '&serverId=5&signature=' + init_req_sign 
    response = requests.get(url,headers = headers2)
    Token_id = re.findall('"Token_id":"(.*?)"',response.text,re.S)[0]
    verify_url = 'http://center.kehou.com/verifyCode.htm?tokenId=' + Token_id
    response = requests.get(verify_url)
    with open('verify.png','wb') as f:
        f.write(response.content)
    verify = input("請輸入驗證碼:")
    login('185賬號','(密碼)',verify,Token_id,login_init_sign,login_encry_key,script_id)
def get_password(login_encry_key,password):
    with open('getpwd.js','r') as f:
        js_code = f.read()
    encrypt_password = execjs.compile(js_code).call('getpwd',login_encry_key,password)
    return encrypt_password
if __name__ == "__main__":
    login_initialize()

課程回放(沒有python實現,只有分析過程)

500彩票邀请码在登錄解決后,回放獲取數據就比較容易了。

課程主頁

  • 獲取課程vodid(課程主頁網頁源碼)

  • 通過vodid獲取課程詳情

  • 通過詳情id獲取視頻播放權限狀態及信息

獲取othermsg以及repoterid

  • 獲取視頻播放地址post(指定播放器)

這里的uid對應上面獲取的othermsg

返回的數據去掉':'后面的內容然后通過注冊表注冊協議打開播放器

0x04 其他

1,這個課程回放開始觀看后視頻1天后失效,無法觀看。我剛開始覺得是像服務器提交觀看時間,然后計算失效時間,可以突破視頻時效。結果并不是這樣。
2,Charles(插花瓶)真的好用,安裝ssl證書非常簡單(包括手機端),界面簡潔。目前我使用別人的激活碼,后續會支持正版的。
3,這個登錄過程感覺用手機user-agent模擬后再分析可能會簡單。
4,加密password調用js絕對不是最好的辦法,完全可以用python庫解決,如果有大神會的話希望可以分享下代碼,再次感謝。

0x05 結尾

網課盼開學,開學想網課。我是東三省的學生,還要過一段時間開學,網課期間學習還是沒有在學校認真的。希望大家可以珍惜每一次的學習機會,這次網課經歷絕對可以載入史冊的(滑稽)。
另外閑談一句,感覺網課回放功能有依賴500彩票邀请码,哈哈哈上課不認真聽了,建議切除。

最后祝大家學習進步,工作順利,多多評分評論哦!

免費評分

參與人數 3吾愛幣 +3 熱心值 +2 收起 理由
hshcompass + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
hj170520 + 1 + 1 謝謝@Thanks!
城已空人未散 + 1 用心討論,共獲提升!

查看全部評分

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

沙發
kxykxy157 發表于 2020-6-3 13:34
小白看完后直覺大神真牛,第二直覺就是要是能放個成品軟件試試就好了?
3#
nightring 發表于 2020-6-3 14:23
4#
hj170520 發表于 2020-6-3 15:11
5#
hyzhangyong 發表于 2020-6-3 17:27
python AES解密?
from Crypto.Cipher import AES
key = "xxxxxxxxxx"
iv = "xxxxxxxx"
mode = AES.MODE_CBC
cryptos = AES.new(key, mode, iv)
plain_text = cryptos.decrypt(a2b_hex(text))
securityPwd =  bytes.decode(plain_text).rstrip('\0')
6#
 樓主| hksnow 發表于 2020-6-3 18:19 |樓主
本帖最后由 hksnow 于 2020-6-3 18:21 編輯
hyzhangyong 發表于 2020-6-3 17:27
python AES解密?
from Crypto.Cipher import AES
key = "xxxxxxxxxx"

出現了 大佬出現了

請問這種怎么解決
7#
hyzhangyong 發表于 2020-6-3 19:54
hksnow 發表于 2020-6-3 18:19
出現了 大佬出現了

請問這種怎么解決

key的位數不足?需要補零。錯誤提示不夠完整。
8#
ciker_li 發表于 2020-6-4 06:34
厲害,厲害
9#
hshcompass 發表于 2020-6-4 10:47
真牛!  騰訊課堂可以做嗎?
10#
 樓主| hksnow 發表于 2020-6-4 12:09 |樓主
hyzhangyong 發表于 2020-6-3 19:54
key的位數不足?需要補零。錯誤提示不夠完整。

我百度了很久也沒有解決啊,求個完整的加密代碼
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:本版塊禁止灌水或回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( )

GMT+8, 2020-7-14 20:27

Powered by Discuz!

500彩票邀请码Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表

500彩票邀請碼-彩經網