JS解析


JSの解析
学習目標:
  • 位置決めjsを理解する方法
  • は、ブレークポイント観察jsの実行プロセスを追加する方法
  • を理解する.
  • js 2 pyを適用してjsを取得する方法
  • 1 jsの位置を決定する
    前の人人網の例ではurlアドレスに一部のパラメータがあることが分かったが,パラメータはどのように生成されるのだろうか.
    間違いなく、パラメータはjsが生成したに違いないが、これらのパラメータの法則をどのように取得するか.以下の学習によって理解する
    1.1観察ボタンのバインドjsイベント
    ボタンをクリックしてEvent Listenerをクリックすると、一部のサイトではバインドされたイベントを見つけることができ、対応して、クリックするだけでjsの位置にジャンプすることができます.
    1.2 search all fileによる検索
    一部のウェブサイトのボタンはjsイベントの傍受にバインドされていない可能性があります.このとき、要求のキーワードを検索することで、livecellなどのjsの場所を見つけることができます.
    美化出力オプションをクリック
    キーワードの検索を続行できます
    2 jsの実行プロセスを観察する
    jsの位置を見つけたら、jsの位置を観察して、jsが具体的にどのように実行されているかを見つけることができます.その後、pythonプログラムを通じてjsの実行をシミュレートしたり、js2pyのように直接jsコードをpythonプログラムに変換して実行したりすることができます.
    jsの実行プロセスを観察する最も簡単な方法は、ブレークポイントを追加することです.
    ブレークポイントの追加方法:左の行番号をクリックすると追加できます.対応する右のBreakPointsには既存のすべてのブレークポイントが表示されます.
    ブレークポイントを追加してログインを続行すると、プログラムがブレークポイント位置で停止するたびに、その行に変数が発生した場合、変数の結果がScoopeに表示されます.
    上図の右上隅には、1、2、3の3つの機能があります.
    - 1:          
    - 2:        
    - 3:          
    

    3 js 2 pyの使用
    jsが目的のデータをどのように生成するかを知ったら、次にプログラムを使用してjs実行後の結果を取得する必要があります.
    3.1 js 2 pyの紹介
    js 2 pyはjsの翻訳ツールであり、純粋なpythonによって実現されたjsの解釈器でもあり、github上のソースコードと例
    3.2 jsの実行構想
    jsの実行方法は大きく2つに分けられます.
  • jsの内容と実行順序を理解した後、pythonによってjsの実行プロセスを完了し、結果
  • を得た.
  • jsの内容と実行順序を知る後、js 2 pyのようなモジュールを用いてjsコードを実行し、結果
  • を得た.
    しかしpythonプログラムを用いてjsの実行を実現する場合、観察するjsの各ステップは非常に面倒であるため、js 2 pyのようなモジュールを用いてjsを実行することを選択することが多く、次にjs 2 pyを用いて人人網ログインパラメータの取得を実現する
    3.3具体的な実現
    ログインjsコードの位置決め
    formSubmit: function() {
            var e, t = {};
            $(".login").addEventListener("click", function() {
                t.phoneNum = $(".phonenum").value,
                t.password = $(".password").value,
                e = loginValidate(t),
                t.c1 = c1 || 0,
                e.flag ? ajaxFunc("get", "http://activity.renren.com/livecell/rKey", "", function(e) {
                    var n = JSON.parse(e).data;
                    if (0 == n.code) {
                        t.password = t.password.split("").reverse().join(""),
                        setMaxDigits(130);
                        var o = new RSAKeyPair(n.e,"",n.n)
                          , r = encryptedString(o, t.password);
                        t.password = r,
                        t.rKey = n.rkey
                    } else
                        toast("      "),
                        t.rKey = "";
                    ajaxFunc("post", "http://activity.renren.com/livecell/ajax/clog", t, function(e) {
                        var e = JSON.parse(e).logInfo;
                        0 == e.code ? location.href = localStorage.getItem("url") || "" : toast(e.msg || "    ")
                    })
                }) : toast(e.msg)
            })
        }
    

    コードから知っています.
  • パスワードを暗号化してrkeyフィールドの値を取得する必要がある
  • にログインします.
  • rkeyフィールドの値要求rkey要求を直接送信すると
  • が得られます.
  • パスワードは、まず反転してRSAを使用して暗号化され、jsコードは複雑であり、pythonでjsを実行することで
  • を実現することを望んでいる.
    実現構想:
  • セッション送信rKeyを使用してログインに必要な情報を取得
  • url: http://activity.renren.com/livecell/rKey
  • メソッド:get
  • 取得情報に基づいてパスワードを暗号化する2.1ユーザ名とパスワードを用意する2.2 js 2 pyを用いてjsを生成する実行環境:context 2.3 jsファイルに使用されたコンテンツを本プロジェクトで2.4 jsファイルのコンテンツにコピーする、contextを使用して実行する2.5は、context環境にデータを追加する2.6 contextを使用して暗号化パスワードを実行するjs文字列2.7は、contextを介して暗号化パスワード情報
  • を取得する.
  • セッションを使用してログイン要求を送信
  • URL: http://activity.renren.com/livecell/ajax/clog
  • 要求方法:POST
  • データ:
      phoneNum: xxxxxxx
      password: (      )
      c1: 0
      rKey: rkey     
    

  • 具体コード
    いくつかのjsファイルをローカルにダウンロードする必要があります.
    BigInt.js
    RSA.js
    Barrett.js
    import requests
    import json
    import js2py
    
    # -     :
    #   -   session  rKey        
    #     - url: http://activity.renren.com/livecell/rKey
    #     -   : get
    #    session  
    session = requests.session()
    headers = {
        "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36",
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type":"application/x-www-form-urlencoded"
    }
    #   session      
    session.headers = headers
    
    response = session.get("http://activity.renren.com/livecell/rKey")
    # print(response.content.decode())
    n = json.loads(response.content)['data']
    
    #   -              
    #     -         
    phoneNum = "131..."
    password = "****"
    #     -   js2py  js     :context
    context = js2py.EvalJs()
    #     -      js          
    #     -   js     ,  context     
    with open("BigInt.js", 'r', encoding='utf8') as f:
        context.execute(f.read())
    
    with open("RSA.js", 'r', encoding='utf8') as f:
        context.execute(f.read())
    with open("Barrett.js", 'r', encoding='utf8') as f:
        context.execute(f.read())
    
    
    # -  context         
    context.t = {'password': password}
    context.n = n
    #     -        js  
    js = '''
           t.password = t.password.split("").reverse().join(""),
           setMaxDigits(130);
           var o = new RSAKeyPair(n.e,"",n.n)
            , r = encryptedString(o, t.password);
          '''
    context.execute(js)
    # -   context         
    # print(context.r)
    password = context.r
    #   -   session      
    #     - URL: http://activity.renren.com/livecell/ajax/clog
    #     -     : POST
    #     -   :
    #       - phoneNum: 15565280933
    #       - password: (      )
    #       - c1: 0
    #       - rKey: rkey     
    data = {
        'phoneNum': '131....',
        'password': password,
        'c1':0,
        'rKey':n['rkey']
    }
    
    # print(session.headers)
    response = session.post("http://activity.renren.com/livecell/ajax/clog", data=data)
    print(response.content.decode())
    
    #        
    response = session.get("http://activity.renren.com/home#profile")
    print(response.content.decode())
    

    小結
  • chromeで要素のバインドイベントを観察することによってjs
  • を決定することができる.
  • chromeにおけるsearch all file検索キーワードによりjsの位置
  • を決定することができる.
  • 観察jsのデータ生成プロセスは、ブレークポイントを追加することによって
  • を観察することができる.
  • js 2 pyの使用
  • jsのコンテンツを準備する必要がある
  • jsを生成する実行環境
  • .
  • 実行環境でjsの文字列を実行し、データを転送し、結果
  • を取得する.