Crawlerjs逆暗号化パラメータクラッキング-Douyinサードパーティデータ分析プラットフォームの落とし穴

クローラーjsリバースシリーズクローラー
を作成する過程で発生したすべてのjsリバースの問題を分類して表示し、参考のために、現象、ソリューションのアイデア、およびコード実装の観点からそれらを分析します。

クローラーの認識
プログラマーのすべての方向性の中で、クローラーはお金に最も近いものです。あなたは理解していますか?さらに、クローラーは、バックエンドに転送する前に、ビッグデータや人工インテリジェンスなどのさまざまな方向に開発できます。また、クローラーが正常に機能している場合、必要なテクノロジースタックは非常に包括的です。クローラーに興味がある場合は、V:13809090874を追加して、一緒にコミュニケーションしてください。

免責事項:
このコンテンツは学習とコミュニケーションのみを目的としており、商用目的ではありません。侵害が含まれている場合は、作成者に連絡して削除してください

1.リクエストヘッダーを分析します


リクエストヘッダーの内容は次のとおりです。

POST /api/tiktok/ranking/tiktok_goods_sales_rank?ts=1602072436550&he=wqdvbhcTvwD2hXibw4L5RyPHeCsEZ8f7wrD2w4Sh&sign=5e1501c104122454 HTTP/1.1
Host: api.douchacha.com
Connection: keep-alive
Content-Length: 258
dcc-href: https://www.douchacha.com/cable
d-v: NCxaZGJRd3BDVFBzZmlaa1Z4WkhibXdvUUtVc2ZldzZsZ2hkZkR3b09UdWpWeGVPUk13NzlUd3F2VG54SHJLaFlVTkhibUU4YkVHa3BsdzYlMkZVcDhmYVNzZkN3NjhWajhmMkhpY1ROUThNZGtEd1prclV2MlEyVmlNJTJGQ2RiZXc1WkpSMzNVdVNjVHJIZkt3NVlUbzhiYlprZDVaaENVclZ3TWRrVk13cktVb3NiMFprUE13NXAlMkJ3cmNVdmglM0QlM0Q=
Authorization: eyJhbGciOiJIUzI1NiJ9.eyJ0eXBlIjoiUEMiLCJleHAiOjE2MDI2Njg2NDksInVzZXJJZCI6MTI5OTIyNjYzOTc0OTc1MDc4NCwiY3JlYXRlRGF0ZSI6IjIwMjAtMTAtMDcgMTc6NDQ6MDkifQ.ppW18NruEU9gpgRJgbYIaEUkvD7cTmfcRBXgOQ8vamE
Content-Type: application/json;charset=UTF-8
Accept: application/json, text/plain, */*
s-id: 371
dcc-r: https://www.douchacha.com/cable
d-t: 1602072436550
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
j-id: sem
Origin: https://www.douchacha.com
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://www.douchacha.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
  1. urlにはheとtsの2つの暗号化パラメーターがあり、tsはタイムスタンプ(ミリ秒レベル)のように見えます
  2. リクエストヘッダーには、dv、Authorization、dtなどの暗号化パラメータがいくつかあります。

問題に気づきましたか?このウェブサイトはクッキーを使用していません。はい、本人確認にはCookieを使用しませんが、ユーザー確認にはAuthorizationを使用するため、Authorizationの暗号化方法を見つける必要があります。

2.暗号化パラメータがカプセル化されている場所を見つけます

ターゲットWebサイトの暗号化パラメーターを見つけるために、共有するいくつかのアイデアがあります。

  1. キーワードを直接検索し、heやdvなどの暗号化されたパラメーターを探し、jsで直接検索して、それらが見つかるかどうかを確認します。これも最も一般的で直接的な方法です。
  2. 完全に混乱しているjsの場合、直接検索することは不可能なので、呼び出しスタックを確認して、レイヤーごとのブレークポイントを入力するだけです。

クロールしたいウェブサイトはかなりフレンドリーです。彼を直接検索したところ、以下に示すように、dvが対応するコード部分を見つけました。


このコードから、リクエストヘッダーのすべての暗号化されたパラメータがここにカプセル化されていることがわかります。6489行目のコード:

t.url = "".concat(t.url, "?ts=").concat(e, "&he=").concat(s, "&sign=").concat(c);
1

これは、url、tsおよびhe、ts = e、he = s、sign = cのカプセル化パラメーターです。

return i && (t.headers.common["Authorization"] = i),
            t.headers.common["d-t"] = e,
            u && (t.headers.common["j-id"] = u),
            d && (t.headers.common["s-id"] = d),
            g && (t.headers.common["dcc-href"] = g),
            t.headers.common["dcc-r"] = document.referrer || "",
            t

これは、リクエストヘッダーのカプセル化パラメータです。
ここで見つけた後、これらの値がどのように生成されるかを調べる必要があります。
ts:

e = (new Date).getTime() + 1 * sessionStorage.getItem("diffDate") || 0
1

tsは、現在のタイムスタンプ+セッションの時差です。この時差は、ソースコードを読み取ることで確認できます。これは、ページが読み込まれる時間です。自分でランダムに生成できます

i = JSON.parse(localStorage.getItem("token"))
s = window.he(i ? "uid" : "dt")
12

localStorageにトークンが存在するかどうかを判断し、存在する場合はwindow.he(uid)を呼び出し、存在しない場合はwindow.he( "dt")を呼び出し、ウィンドウオブジェクトのネイティブメソッドにメソッドがない場合、he()がカスタムになりますこの方法については後で説明します。
符号:

e = (new Date).getTime() + 1 * sessionStorage.getItem("diffDate") || 0
n = t.url.split("https://api.douchacha.com")[1];
o = n + e
c = window.sh(o)
1234

ここから、符号値暗号化方式は主にsh生成方式を見つけることであることがわかります。oパラメータ、それらをシミュレートできます。
dv:

l = window.btoa(window.v() + "," + window.hi("dt"));
t.headers.common["d-v"] = l
12

dvパラメーターは、主に2つのメソッドv()とhi()の宣言を見つけるためのものです。
承認:

i = localStorage.getItem("token")
return i && (t.headers.common["Authorization"] = i),
12

トークンは、ログイン時のアカウント確認情報です

3.続けて、暗号化方式の生成方法を見つけます。

このウェブサイトの主な暗号化場所はapp.jsとs.jsであると前に述べました。メソッド名を検索することで、これらのメソッドの宣言をすばやく見つけることができます


この方法を探しましたが、ここにすべて16進数の暗号化があり、解読するのは非常に面倒です。このjsファイルは問題ありません。400行しかありません。完全にクラックしても問題ありません。それほど面倒ではありません。しかし、数万行、数万行がある場合、あなたは死ぬでしょう。
この問題は、フックまたはブラックボックスで解決できます。暗号化の方法を理解する必要はありません。このjsをダウンロードし、pythonexecjsパッケージを使用してjs関数を直接呼び出します。あなたは問題を解決することができます。
注:execjsパッケージを実行するときは、最初にnodejsをインストールする必要があります。そうしないと、js実行環境の
execjsパッケージがインストールされません

pip install PyExecJs
1

pythonコード:

import execjs
js = execjs.compile(open(r"s_my_press.js").read())
url = 'https://api.douchacha.com/api/tiktok/ranking/user_list_gain'
diffdate = 0
n = str(int(round(time.time()*1000)) + diffdate)
# n = '1599562900780'
print('n:'+str(n))
e = url.split('https://api.douchacha.com')[1]
o = e+str(n)
r = js.call('he','1299226639749750784')
r = encode_b64_url(r)
print('he',r)
s = js.call('sh',o)
url = url+'?ts={}&he={}&sign={}'.format(n,r,s)
hi = encode_b64_url(js.call('hi',n))
print('hi:'+hi)
d_v = base64.b64encode((str(4) + ',' + hi).encode())
print('d_v'+str(d_v))

headers ={
                'Host': 'api.douchacha.com',
                'Connection': 'keep-alive',
                'Content-Length': '101',
                'dcc-href': 'https://www.douchacha.com/uppoint',
                'd-v': d_v,
                'Authorization': "eyJhbGciOiJIUzI1NiJ9.eyJ0eXBlIjoiUEMiLCJleHAiOjE1OTk4MjA1NjQsInVzZXJJZCI6MTI5OTIyNjYzOTc0OTc1MDc4NCwiY3JlYXRlRGF0ZSI6IjIwMjAtMDktMDQgMTg6MzY6MDQifQ.KCrYYx4hEqzv6CTJw2NlvD8pp-iRMw7IBgud_XwHHRE",
                'Content-Type': 'application/json;charset=UTF-8',
                'Accept': 'application/json, text/plain, */*',
                's-id': '371',
                'dcc-r': 'https://www.douchacha.com/uppoint',
                'd-t': str(n),
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
                'j-id': 'sem',
                'Origin': 'https://www.douchacha.com',
                'Sec-Fetch-Site': 'same-site',
                'Sec-Fetch-Mode': 'cors',
                'Sec-Fetch-Dest': 'empty',
                'Referer': 'https://www.douchacha.com/uppoint',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9'
            }
    data = {"page_no":1,"page_size":20,"params_data":{"label_name":"","period":"DAY","period_value":"20200907"}}
    r1 = sess.post(url,json=data, headers=headers, verify=False)
    print(r1.text)
1234567891011121314151617181920212223242526272829303132333435363738394041424344

このようにして、データを正常にキャプチャできます。
もちろん、そこにはいくつかの小さな穴があります。

  • execjsにはブラウザオブジェクトがないため、jsのウィンドウオブジェクトはexecjsで実行するとエラーを報告します。したがって、ウィンドウオブジェクトのメソッドを抽出し、jsのbase64暗号化メソッドであるwindow.btoaなどのpythonで実行する必要があります。再生成するには、pythonのbase64を使用する必要があります
  • jsのデフォルトのエンコード方法はiso-8859-1ですが、pythonではありません。pythonでbase64暗号化を呼び出す場合、エンコード方法はiso-8859-1として指定する必要があります。

この時点で、以前のクラッキング作業は完了しています。このウェブサイトのログインの問題は比較的単純なので、書きません。トークンの取得も簡単です。将来的に更新されますので、注意してください!

この記事は転載されており、著作権は作者に帰属します。侵害がある場合は、編集者に連絡して削除してください。

元のアドレス:https//blog.csdn.net/happiness0617/article/details

完全なプロジェクトソースコードについては、ここをクリックしてください

おすすめ

転載: blog.csdn.net/weixin_43881394/article/details/108996614