数日前、Python Xingyao と The Strong King の交換グループで、数人が JS リバース エンジニアリング ビデオと関連コードについて質問していました。それらは私が高度な知識を学んでいるものばかりで、本当に十分に学ぶことができません。たまたま最近、いくつかの JS 学習教材を読んでいて、非常に良い事例を見つけたので、ここで共有し、記録しておきます。
JSコードの検索ですが、記事を書いて説明するのはなかなか大変なので、動画で解説した方が良いと思います。コードは直接配置されます。この JS 暗号化コードを最初から見つけるのは非常に難しく、常にブレークポイントを突破し、暗号化ルールを見つけ、玉ねぎを 1 層ずつ剥いて見つけ出す必要があります。この記事で使用されている JS 暗号化コードは、小さな動画 Web サイトから取得したもので、Web ページで紹介されている暗号化関数は次のとおりです:
暗号化方法はそれほど難しくありません。 decode() 暗号化関数のコア コードは次のとおりです。
define("tool", function(a, b, c) { var d = a("jquery") , e = a("support") , f = a("constants") , g = a("base64") , h = "substring" , i = "split" , j = "replace" , k = "substr"; b.decodeMp4 = { getHex: function(a) { return { str: a[h](4), hex: a[h](0, 4)[i]("").reverse().join("") } }, getDec: function(a) { var b = parseInt(a, 16).toString();# 对应Python中的str(int(a, 16)) return { pre: b[h](0, 2)[i](""), tail: b[h](2)[i]("") } }, substr: function(a, b) { var c = a[h](0, b[0]) , d = a[k](b[0], b[1]); return c + a[h](b[0])[j](d, "") }, getPos: function(a, b) { return b[0] = a.length - b[0] - b[1], b }, decode: function(a) { var b = this.getHex(a) , c = this.getDec(b.hex) , d = this[k](b.str, c.pre); return g.atob(this[k](d, this.getPos(d, c.tail))) } };
decodeMp4 の decode() 関数が呼び出され、decode() 関数が getHex(a)、getDec(b.hex)、g.atob()、getPos( d, c.tail) およびその他の関数を使用し、これらの関数を Python 記述に変換し、対応する暗号化メソッドを構築し、暗号化された結果を取得して、その逆の効果を完了する必要があります。
ここでの変数aはポイントを区切って得られる長い文字列であり、ここでは例として以下の変数を使用します。
a = "c0b1Ly9tdnPflQ3cQpPZpZGVvMTAubWVpdHVkYXRhLmNvbS82MWM0NDNlOGI1MmFmMTYzMi5tcDkBOyQ"
後でみんなが確認しやすいように、後で使う機能を事前に簡単に整理しておきましょう。
以下のように、各関数を順番に分解してみましょう:
var h = "substring",i = "split"; getHex: function(a) { return { str: a[h](4), hex: a[h](0, 4)[i]("").reverse().join("") } },
上記は対応する getHex() 関数の JS コードです。辞書が直接返されることがわかります。辞書のキーはそれぞれ str と hex です。str の対応する値は a[h](4)です。h の定義は部分文字列です。この関数は、文字列が指定された添え字から始まり、文字列の終わりに達することを意味します。ここでの変換は a.substring(4) です。つまり、文字列 a は添え字 4 から始まり、最後で終わります。a[ h](0, 4)[i]("").reverse().join("") これは理解するのが少し複雑です。まず、文字列の値が取得され、位置は 0 から 0 までです。 4. 次に、split 関数である関数 i が呼び出されます。スペース ("") を区切りとして使用し、reverse() 関数を呼び出して逆順にソートし、join("") を呼び出して文字列を接続します。分解すると、はるかに簡単になります。次のステップは、Python コードを構築することです。比較を記述すると、次のようになります:
def getHex(a): return { "str": a[4:],# JS中的substring(4)指的是从4开始取值到字符串末尾 "hex": "".join(list(a[0:4])[::-1])# [::-1]代表的是反向取值 }
見覚えはありますか? これは、上記の JS コードとまったく同じです。
JS コードは次のとおりです:
getDec: function(a) { var b = parseInt(a, 16).toString(); return { pre: b[h](0, 2)[i](""), tail: b[h](2)[i]("") } },
対応関係に従って、対応する Python コードは次のように記述できます。 ##
def getDec(a): b = str(int(a, 16)) print(b) return { "pre": list(b[:2]), "tail": list(b[2:]) }3. substr(a, b) functionJS コードは次のとおりです:
substr: function(a, b) { var c = a[h](0, b[0]) , d = a[k](b[0], b[1]); return c + a[h](b[0])[j](d, "") },対応関係に従って、対応する Python コードは次のように記述できます。 :
def substr(a, b): c = a[0: int(b[0])] print(c) d = a[int(b[0]):int(b[0])+int(b[1])] print(d) return c + a[int(b[0]):].replace(d, '')4. getPos(a, b) 関数 JS コードは次のとおりです:
getPos: function(a, b) { return b[0] = a.length - b[0] - b[1], b },対応関係に従って、対応する Python コードを書くことができます
def getPos(a, b): b[0] = len(a) - int(b[0]) - int(b[1]) print(b[0]) return b5. decode(a, b) 関数 JS コードは次のとおりです:
decode: function(a) { var b = this.getHex(a) , c = this.getDec(b.hex) , d = this[k](b.str, c.pre); return g.atob(this[k](d, this.getPos(d, c.tail))) }対応関係に従って、対応する Python コードを実行できます。
b = getHex(a) # print(b) c = getDec(b['hex']) print(c) # d = k(str(b), c.pre) d = substr(b['str'], c['pre']) # print(d) return base64.b64decode(substr(d, getPos(d, c['tail'])))効果表示Webクローラー経由で直接リクエストします。最終的な暗号化されたアドレスは取得できません。どのようにリクエストしても取得できません。 data-src を取得します。つまり、上記の文字列変数 a は、上記の分析を通じてのみ逆転でき、コードを実行して Web ページ上と同じリクエスト アドレスを取得します。下の図に示すように、逆転は成功します。 このアドレスをブラウザに入力すると再生でき、ダウンロードリクエストを行うと動画をダウンロードできます。 概要皆さんこんにちは。私は Python の上級ユーザーです。この記事は、主に Python Web クローラーにおける JS 逆引き問題に基づいてケースを説明します。 Web ページが JS で読み込まれている場合、Web クローラーを介して直接リクエストすると、最終的な暗号化されたアドレスを取得できません。この逆の問題に対処するために、簡単な逆の実装プロセスの例を作成しました。
以上がJS リバース コードから Python コードへの変換に関するチュートリアルを確認してください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。