ゲームウェブサイトのJS暗号化制限、Pythonを使用して制限を突破し、逆復号化を実行します~

戻ってきました。長い間更新していませんでしたが、誰も記事を読んでいないようです。
ビデオを見て学ぶことはできますか?

今日のLINEはシェアしてもつまらないし、Pythonを使ってJSの暗号化制限を突破して逆復号して自動ログインを実現したら~

逆ターゲット

  • ターゲット: 7 オンライン ゲームのログイン
  • ホームページ: aHR0cHM6Ly93d3cuMzcuY29tLw==
  • インターフェース: aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA==
  • 逆パラメータ: クエリ文字列パラメータ: パスワード:
    SlVEOThrcjgzNDNjaUYxOTQzNDM0eVM=

逆のプロセス

パケット解析

特定の 7 オンライン ゲームのホームページにアクセスし、アカウントのパスワードを何気なく入力し、「ログイン」をクリックしてパケットをキャプチャし、ログイン インターフェイスを aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA== として見つけ、GET リクエストを実行します。

ここに画像の説明を挿入

クエリ文字列パラメータの主要パラメータを分析します。

callback はコールバック パラメータです。このパラメータの値はリクエストの結果には影響しません。その形式は、jQuery + 20 桁の数値 + _ + 13 桁のタイムスタンプです。Python を使用して簡単に構築できます。

import time
import random

timestamp = str(int(time.time() * 1000))
jsonp = ''
for _ in range(20):
    jsonp += str(random.randint(0, 9))
callback = 'jQuery' + jsonp + '_' + timestamp
print(callback)

login_account はログイン アカウント名です。

パスワードは暗号化されたパスワードです。

_ は 13 ビットのタイムスタンプです。

パラメータの反転

元に戻す必要があるパラメータは 1 つのパスワードだけです。このキーワードをグローバルに直接検索しようとすると、多数の結果が表示され、分析に役立たないことがわかります。ここで少しトリックがあります。等号を追加します。 「password=」で検索すると非常に便利です。検索範囲が大幅に短縮されます。もちろん、「password:」で検索することもできますし、キーワードと記号の間にスペースを入れて検索することもできますし、「varpassword」で検索することもできます. 別のものに変えるだけです。

この場合、password= を検索すると、sq.login2015.js ファイル内にステートメント h.password = td(f) が表示されます。ここでパスワードが暗号化されていると思われます。ここにデバッグ用のブレークポイントを埋め込むことができます。返される値は実際に暗号化されたパスワードであることがわかります。

ここに画像の説明を挿入

td 関数を追跡し続けると、独自に作成した RSA 暗号化が使用されていることがわかります。これは非常にシンプルで明確です。これを直接コピーして、Python で呼び出すことができます。

画像の説明を追加してください

完全なコードは記事の最後にある名刺から直接入手できます。

パラメータJS暗号化キーコード

var ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function __rsa(str) {
    
    
    var out, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
    
    
        c1 = str.charCodeAt(i++) & 0xff;
        if (i == len) {
    
    
            out += ch.charAt(c1 >> 2);
            out += ch.charAt((c1 & 0x3) << 4);
            out += "==";
            break
        }
        c2 = str.charCodeAt(i++);
        if (i == len) {
            out += ch.charAt(c1 >> 2);
            out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
            out += ch.charAt((c2 & 0xF) << 2);
            out += "=";
            break
        }
        c3 = str.charCodeAt(i++);
        out += ch.charAt(c1 >> 2);
        out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
        out += ch.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
        out += ch.charAt(c3 & 0x3F)
    }
    return out
}

function getEncryptedPassword(a) {
    
    
    var maxPos = ch.length - 2
      , w = [];
    for (i = 0; i < 15; i++) {
    
    
        w.push(ch.charAt(Math.floor(Math.random() * maxPos)));
        if (i === 7) {
    
    
            w.push(a.substr(0, 3))
        }
        if (i === 12) {
    
    
            w.push(a.substr(3))
        }
    }
    return __rsa(w.join(""))
}

// 测试样例
// console.log(getEncryptedPassword("34343434"))

Pythonのログインキーコード

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import random

import execjs
import requests


login_url = '脱敏处理,完整代码领取Q裙 592539176'


def get_encrypted_password(password):
    with open('encrypt.js', 'r', encoding='utf-8') as f:
        www_37_js = f.read()
    encrypted_pwd = execjs.compile(www_37_js).call('getEncryptedPassword', password)
    return encrypted_pwd


def login(username, encrypted_password):
    timestamp = str(int(time.time() * 1000))
    jsonp = ''
    for _ in range(20):
        jsonp += str(random.randint(0, 9))
    callback = 'jQuery' + jsonp + '_' + timestamp
    params = {
    
    
        'callback': callback,
        'action': 'login',
        'login_account': username,
        'password': encrypted_password,
        'ajax': 0,
        'remember_me': 1,
        'save_state': 1,
        'ltype': 1,
        'tj_from': 100,
        's': 1,
        'tj_way': 1,
        '_': timestamp
    }
    headers = {
    
    
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36',
        'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"'
    }
    response = requests.post(url=login_url, headers=headers, params=params)
    print(response.text)


def main():
    username = input('请输入登录账号: ')
    password = input('请输入登录密码: ')
    encrypted_password = get_encrypted_password(password)
    login(username, encrypted_password)


if __name__ == '__main__':
    main()

OK、上記は今日共有された記事です

ご興味がございましたら、記事の最後にある名刺をクリックしてコードを取得し、コードを取得したらすぐに試してみてください。

次の記事でお会いしましょう~

Guess you like

Origin blog.csdn.net/yxczsz/article/details/130729293