JS解析
JSの解析
学習目標:位置決めjsを理解する方法 は、ブレークポイント観察jsの実行プロセスを追加する方法 を理解する. js 2 pyを適用してjsを取得する方法 1 jsの位置を決定する
前の人人網の例ではurlアドレスに一部のパラメータがあることが分かったが,パラメータはどのように生成されるのだろうか.
間違いなく、パラメータはjsが生成したに違いないが、これらのパラメータの法則をどのように取得するか.以下の学習によって理解する
1.1観察ボタンのバインドjsイベント
ボタンをクリックして
1.2 search all fileによる検索
一部のウェブサイトのボタンはjsイベントの傍受にバインドされていない可能性があります.このとき、要求のキーワードを検索することで、
美化出力オプションをクリック
キーワードの検索を続行できます
2 jsの実行プロセスを観察する
jsの位置を見つけたら、jsの位置を観察して、jsが具体的にどのように実行されているかを見つけることができます.その後、pythonプログラムを通じてjsの実行をシミュレートしたり、
jsの実行プロセスを観察する最も簡単な方法は、ブレークポイントを追加することです.
ブレークポイントの追加方法:左の行番号をクリックすると追加できます.対応する右のBreakPointsには既存のすべてのブレークポイントが表示されます.
ブレークポイントを追加してログインを続行すると、プログラムがブレークポイント位置で停止するたびに、その行に変数が発生した場合、変数の結果がScoopeに表示されます.
上図の右上隅には、1、2、3の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コードの位置決め
コードから知っています.パスワードを暗号化して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 データ:
具体コード
いくつかのjsファイルをローカルにダウンロードする必要があります.
BigInt.js
RSA.js
Barrett.js
小結 chromeで要素のバインドイベントを観察することによってjs を決定することができる. chromeにおけるsearch all file検索キーワードによりjsの位置 を決定することができる.観察jsのデータ生成プロセスは、ブレークポイントを追加することによって を観察することができる. js 2 pyの使用 jsのコンテンツを準備する必要がある jsを生成する実行環境 .実行環境で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つに分けられます.
しかし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)
})
}
コードから知っています.
実現構想:
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())
小結