国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ ウェブフロントエンド jsチュートリアル ここでは、AST、Babel、プラグインを使用して、ラボを無駄にすることなく JavaScript で難読化を作成する方法を説明します。

ここでは、AST、Babel、プラグインを使用して、ラボを無駄にすることなく JavaScript で難読化を作成する方法を説明します。

Jan 10, 2025 pm 12:34 PM

導入

ねえ、あなたのアルゴリズムがどれほどクールでユニークであるかについて考えたことはありますか? ?多くのプログラマーや企業(yè)がそうしているため、自分の仕事を全員と共有することをためらっているのかもしれません。この問題は、コードの一部をサーバーに移動すると (クライアント/サーバー アプリケーションの場合) 多少は改善されますが、このアプローチは常に可能であるとは限りません。場合によっては、機密性の高いコード セクションをそのまま公開しておく必要があります。

この記事では、JavaScript の難読化について説明し、アルゴリズムを非表示にしてコードの學習を困難にする方法を作成します。また、AST とは何かを調(diào)査し、難読化を?qū)g裝するために AST と対話するために使用できるツールを提供する予定です。

どうしたの?

これは愚かな例です。この狀況を想像してみましょう:

  1. ボブは、コンピューター モニターを配布しているサイトに行きます (ここでは -> ?)。ボブのモニターの方が優(yōu)れていますが、無料のものはいつでも素晴らしいものです。
  2. ボブがサイトにアクセスすると、ブラウザ內(nèi)で JavaScript が実行され、ユーザーのデバイスに関するデータが収集され、サーバーに送信されます。これがそれであるとしましょう:
let w = screen.width, h = screen.height;
// Let's say there's a logic with some check. 
console.info(w, h);
  1. 殘念ながら、ボブはプレゼントページにアクセスできず、そのことにかなり動揺しています。彼にはその理由が分かりません。その後、プレゼントのルールで、大きくて優(yōu)れたモニターを使用しているユーザーは許可されていないことを知りました。

  2. 幸いなことに、ボブは高校でコンピューター サイエンスのクラスをいくつか受講していました。彼は思い切って F12 キーを押して開発者コンソールを開き、スクリプトを検討し、主催者が畫面解像度をチェックしていることに気づきました。その後、彼は攜帯電話から參加することを決意し、テストに無事合格しました。

ハッピーエンドの架空の物語 - しかし、主人公が前のコードの代わりにこれを見ていたら、これほど良いものにはならなかったでしょう:

l=~[];l={___:++l,$$$$:(![]+"")[l],__$:++l,$_$_:(![]+"")[l],_$_:++l,$_$$:({}+"")[l],$$_$:(l[l]+"")[l],_$$:++l,$$$_:(!""+"")[l],$__:++l,$_$:++l,$$__:({}+"")[l],$$_:++l,$$$:++l,$___:++l,$__$:++l};l.$_=(l.$_=l+"")[l.$_$]+(l._$=l.$_[l.__$])+(l.$$=(l.$+"")[l.__$])+((!l)+"")[l._$$]+(l.__=l.$_[l.$$_])+(l.$=(!""+"")[l.__$])+(l._=(!""+"")[l._$_])+l.$_[l.$_$]+l.__+l._$+l.$;l.$$=l.$+(!""+"")[l._$$]+l.__+l._+l.$+l.$$;l.$=(l.___)[l.$_][l.$_];l.$(l.$(l.$$+"\""+(![]+"")[l._$_]+l.$$$_+l.__+"\"+l.$__+l.___+"\"+l.__$+l.$$_+l.$$$+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$$_+l.$$$+"\"+l.__$+l.$_$+l.__$+l.$$_$+l.__+"\"+l.__$+l.$_$+l.___+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$_$+l.___+l.$$$_+"\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$__+l.$$$+"\"+l.__$+l.$_$+l.___+l.__+";\"+l.__$+l._$_+l.$$__+l._$+"\"+l.__$+l.$_$+l.$$_+"\"+l.__$+l.$$_+l._$$+l._$+(![]+"")[l._$_]+l.$$$_+".\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$_$+l.$$_+l.$$$$+l._$+"(\"+l.__$+l.$$_+l.$$$+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+");"+"\"")())();

Here
保証します、これは意味不明なものではなく、JavaScript です。そして、同じ動作を?qū)g行します。ここでコンソールでコードを?qū)g行してみることができます。

この場合、私たちのヒーローはプレゼント企畫に參加せずに自分の運命を受け入れただろうし、主催者も計畫を守っただろう。

それで、ここでのポイントは何でしょうか?おめでとうございます。jjencode ツールについて、難読化とは何か、そしてそれがどのような役割を果たすことができるのかを?qū)Wびました。

要約すると、難読化とは、プログラム コードまたはデータを、人間には理解しにくいが、マシンやプログラムでは機能する形式に変換するプロセスです。

秘密を隠している。簡単な方法

理論は十分なので、より実踐的な例に移りましょう???。次に、インターネット上でよく見かける難読化を利用してコードを変換してみましょう。 「ノウハウ」操作を含む、より興味深いコードを見てみましょう。そして、F12 にアクセスするのが面倒でない人全員がそれらのことを知ることができるのは非常に望ましくありません:

let w = screen.width, h = screen.height;
// Let's say there's a logic with some check. 
console.info(w, h);

このコードは、デバイスとブラウザーのデータを収集し、結果をコンソールに出力します (出力はコードのパフォーマンスの指標として使用します)。

l=~[];l={___:++l,$$$$:(![]+"")[l],__$:++l,$_$_:(![]+"")[l],_$_:++l,$_$$:({}+"")[l],$$_$:(l[l]+"")[l],_$$:++l,$$$_:(!""+"")[l],$__:++l,$_$:++l,$$__:({}+"")[l],$$_:++l,$$$:++l,$___:++l,$__$:++l};l.$_=(l.$_=l+"")[l.$_$]+(l._$=l.$_[l.__$])+(l.$$=(l.$+"")[l.__$])+((!l)+"")[l._$$]+(l.__=l.$_[l.$$_])+(l.$=(!""+"")[l.__$])+(l._=(!""+"")[l._$_])+l.$_[l.$_$]+l.__+l._$+l.$;l.$$=l.$+(!""+"")[l._$$]+l.__+l._+l.$+l.$$;l.$=(l.___)[l.$_][l.$_];l.$(l.$(l.$$+"\""+(![]+"")[l._$_]+l.$$$_+l.__+"\"+l.$__+l.___+"\"+l.__$+l.$$_+l.$$$+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$$_+l.$$$+"\"+l.__$+l.$_$+l.__$+l.$$_$+l.__+"\"+l.__$+l.$_$+l.___+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$_$+l.___+l.$$$_+"\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$__+l.$$$+"\"+l.__$+l.$_$+l.___+l.__+";\"+l.__$+l._$_+l.$$__+l._$+"\"+l.__$+l.$_$+l.$$_+"\"+l.__$+l.$$_+l._$$+l._$+(![]+"")[l._$_]+l.$$$_+".\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$_$+l.$$_+l.$$$$+l._$+"(\"+l.__$+l.$$_+l.$$$+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+");"+"\"")())();

次に、上記のコードを、JS 用の一般的な難読化ツール obfuscator.io で変更してみましょう。結果として、次のようなコードが得られます:

function getGpuData(){
  let cnv = document.createElement("canvas");
  let ctx = cnv.getContext("webgl");
  const rendererInfo = ctx.getParameter(ctx.RENDERER);
  const vendorInfo = ctx.getParameter(ctx.VENDOR);

  return [rendererInfo, vendorInfo]
}

function getLanguages(){
  return window.navigator.languages;
}

let data = {};
data.gpu = getGpuData();
data.langs = getLanguages();
console.log(JSON.stringify(data))

出來上がり!さて、このコードを喜んで解析できるのは機械だけです (あなたと私はおそらくその中にはいないでしょう ?)。それにもかかわらず、それでも動作し、同じ結果が得られます。変更點に注意してください:

  1. 改行と余分なスペースはなくなりました。
  2. 変數(shù)名は、_0x587f42 のような役に立たない名前に置き換えられています。
  3. 文字列とオブジェクトのプロパティは、インデックスによって配列から値を返す関數(shù)呼び出しに変換されました。たとえば、document.createElement(“canvas”) は document[_0x12260c(0x197)](_0x12260c(0x191)) に変わりました。これは、計算されたプロパティを使用することで可能になりました。

最後の手法は、靜的コード分析に負荷をかけるという點で、おそらくこの場合最も厄介です。

よし、すべての秘密が隠されているようだ。コードを?qū)g稼働環(huán)境にデプロイしましょうか?

待ってください... コード難読化のためのサービスがある場合、おそらくこの機能を元に戻すことができるサービスもあるでしょうか?もちろん、それも複數(shù)あります!そのうちの 1 つである WebCrack を使用してみましょう。そして、元の読みやすいコードを取得できるかどうかを確認してください。以下は、この難読化解除ツールを使用した結果です:

{"gpu":["ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar","Mozilla"],"langs":["en-US","en"]}

おっと ?。 もちろん、変數(shù)の名前は返されませんでしたが、ありがとうございました。

つまり、この場合、コードを冷靜に研究する唯一の障害は、難読化解除ツールを使用するという研究者の意志の力であることがわかります。もちろん、他のソリューションやカスタマイズを使用することも可能ですが、一般的な難読化の場合は、一般的な難読化解除を期待する必要があります。

私たちは絶望して、戦うことなく秘密を放棄すべきでしょうか?もちろん違います!さらに何ができるか見てみましょう....

Here

難読化者になる方法

難読化裝置 - ファンタジーの世界の魔術師のような感じですね。 ???♂?
間違いなく、コードを作成中にコードを難読化できる人は生まれつきの魔術師です。あなたも、しばらくの間、意図せずにそのような呪文を自分で唱えることができたかもしれません。しかし、「上級プログラマー」の批判のせいでスキルが失われ、プログラムの調(diào)査を困難にする可能性のあるアイデアを持っている場合はどうすればよいでしょうか?この場合、コード構造自體を操作して変更できるツールを利用するのが合理的です。それらを見てみましょう。

ASツール

テキストと同じように単純にコードを操作したり、特定の構造を正規(guī)表現(xiàn)に置き換えたりすることで、コードを変更してみることもできます。しかし、この方法に従うと、コードを難読化するよりも、コードと時間を臺無しにする可能性の方が高いと思います。

より信頼性が高く、制御された変更を行うには、それを抽象構造であるツリー (AST - 抽象構文ツリー) に持ち込んで、そこを通過して、関心のある要素や構成を変更することができます。 .

JS コードを操作するにはさまざまなソリューションがあり、最終的な AST が異なります。この記事では、この目的のために babel を使用します。何もインストールする必要はなく、astexplorer などのリソースですべてを試すことができます。

(babel をいじりたくない場合は、shift-refactor をチェックしてください。**CSS セレクター を使用して AST と対話できるようになります。非常にミニマルで學習に便利なアプローチです。ただし、babel とは異なる特定のバージョンの AST を使用します。このツールの CSS クエリは、shift-query interactive でテストできます。デモ)。

0. AST の使用

それでは、簡単な例に基づいて、ブラウザを離れることなくこれらのツールを簡単に使用する方法を見てみましょう。同じ名前の関數(shù)內(nèi)のテスト変數(shù)の名前を変更する必要があるとします:

let w = screen.width, h = screen.height;
// Let's say there's a logic with some check. 
console.info(w, h);

このコードを astexplorer に貼り付けると (上から JavaScript@babel/parser を選択します)、そこに AST として表示されるはずです。テスト変數(shù)をクリックすると、右側(cè)のウィンドウにこのコード セクションの構文が表示されます:
Here

問題を解決するには、次の babel プラグインを作成します。このプラグインはコードを解析し、その中のすべての名前識別子を検索し、特定の條件が満たされた場合に名前を変更します。これを astexplorer の左下のウィンドウに貼り付けましょう (transform スライダーをオンにし、babelv7 を選択して表示させます):

let w = screen.width, h = screen.height;
// Let's say there's a logic with some check. 
console.info(w, h);

コンソール出力がこのプラグインに含まれているのには理由があります。これにより、ブラウザ コンソールの出力を調(diào)べてプラグインをデバッグできるようになります。この場合、識別子タイプのすべてのノードに関する情報を出力します。この情報には、ノード自體 (node)、親ノード (parent)、および環(huán)境に関するデータが含まれます (スコープ - 現(xiàn)在のコンテキストで作成された変數(shù)とそれらへの參照が含まれます):
Here

したがって、右下のウィンドウでは、ソース コード內(nèi)の変數(shù)が他の識別子に影響を與えることなく正常に変更されたことがわかります。

l=~[];l={___:++l,$$$$:(![]+"")[l],__$:++l,$_$_:(![]+"")[l],_$_:++l,$_$$:({}+"")[l],$$_$:(l[l]+"")[l],_$$:++l,$$$_:(!""+"")[l],$__:++l,$_$:++l,$$__:({}+"")[l],$$_:++l,$$$:++l,$___:++l,$__$:++l};l.$_=(l.$_=l+"")[l.$_$]+(l._$=l.$_[l.__$])+(l.$$=(l.$+"")[l.__$])+((!l)+"")[l._$$]+(l.__=l.$_[l.$$_])+(l.$=(!""+"")[l.__$])+(l._=(!""+"")[l._$_])+l.$_[l.$_$]+l.__+l._$+l.$;l.$$=l.$+(!""+"")[l._$$]+l.__+l._+l.$+l.$$;l.$=(l.___)[l.$_][l.$_];l.$(l.$(l.$$+"\""+(![]+"")[l._$_]+l.$$$_+l.__+"\"+l.$__+l.___+"\"+l.__$+l.$$_+l.$$$+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$$_+l.$$$+"\"+l.__$+l.$_$+l.__$+l.$$_$+l.__+"\"+l.__$+l.$_$+l.___+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$_$+l.___+l.$$$_+"\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$__+l.$$$+"\"+l.__$+l.$_$+l.___+l.__+";\"+l.__$+l._$_+l.$$__+l._$+"\"+l.__$+l.$_$+l.$$_+"\"+l.__$+l.$$_+l._$$+l._$+(![]+"")[l._$_]+l.$$$_+".\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$_$+l.$$_+l.$$$$+l._$+"(\"+l.__$+l.$$_+l.$$$+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+");"+"\"")())();

この例に基づいて、コードを解析して変更する方法がもう少し明確になったと思います。とにかく、完了した作業(yè)を要約しましょう:

  1. astexplorer 経由で babel を使用してコードを AST に変換しました。
  2. AST を調(diào)べると、テスト変數(shù)が識別子タイプでラベル付けされており、その名前は name プロパティを使用して定義できることがわかりました。
  3. 次に、babel プラグインを使用して、すべての識別子をバイパスし、関數(shù)內(nèi)の識別子の名前を test という名前で変更しました。

1. 関數(shù)名と変數(shù)名を非表示にする

コードを変更する方法が明らかになりました。もっと便利なものを試してみましょう。難読化と呼ぶことができます:) 前のセクションで難読化しようとしたより複雑なコードを取り上げます。次に、その中のすべての変數(shù)と関數(shù)の名前をランダムな名前に変更します。したがって、リバース エンジニアリングを行う可能性のある人は、一部のコード要素の目的についての情報が少なくなります。

また、問題をデバッグするために任意の JS コードを自由に使用してください。 よく言われるように、痛みほど優(yōu)れた教師はいない?.

次のプラグインは、作業(yè)を完了するのに役立ちます:

function getGpuData(){
  let cnv = document.createElement("canvas");
  let ctx = cnv.getContext("webgl");
  const rendererInfo = ctx.getParameter(ctx.RENDERER);
  const vendorInfo = ctx.getParameter(ctx.VENDOR);

  return [rendererInfo, vendorInfo]
}

function getLanguages(){
  return window.navigator.languages;
}

let data = {};
data.gpu = getGpuData();
data.langs = getLanguages();
console.log(JSON.stringify(data))

このコードは何をするのでしょうか?前の例とほぼ同じです:

  1. 識別子タイプのすべての AST ノードを通過します;
  2. 今回は、generateRndName 関數(shù)を使用して、條件なしで識別子の名前をランダムに生成します。
  3. 一意の名前を生成すると、プログラムのロジックを壊す可能性のある重複した名前がランダムに取得されないことが保証されます。

プラグインの実行の結果、ランダム変數(shù)の名前と関數(shù)を含む次のコードが得られます。

{"gpu":["ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar","Mozilla"],"langs":["en-US","en"]}

コンソールでコードを?qū)g行して確認できます。操作後も、まだ動作しています。そして、これが優(yōu)れた難読化ツールの主な品質(zhì)です ?.

しかし、難読化の質(zhì)はどうでしょうか?私の場合、その悪はまだそれほど強くありません。名前を置き換えるだけでも、経験豊富なプログラマーであればこのコードの目的を簡単に理解できるでしょう。そして、JS ミニファイアーがこのタスクを処理できるとしたら、何の意味があるでしょうか。リバースにとって、より実用的で面倒なことを行うことは可能でしょうか?もう一つ呪文があります...

Here

2.隠す?すべて!

「すべて」と書いたときは少し自信があったかもしれませんが、これから行うことは、コードのアクションを可能な限り隠すことです。このセクションでは、靜的分析を複雑にし、「クライアント」がコードに侵入するのを潛在的に防ぐために、文字列とさまざまなオブジェクト プロパティを非表示にします!

前の段階で取得した非表示の名前を持つコードを取得し、次のプラグインをそれに適用しましょう:

let w = screen.width, h = screen.height;
// Let's say there's a logic with some check. 
console.info(w, h);

このプラグインの動作についてはコード コメントですでに少し説明しましたが、その動作をステップごとに簡単に説明しましょう。

  1. コード內(nèi)で置き換えられるすべてのプロパティと文字列を格納する配列データを作成します。この配列は、データを返す getData 関數(shù)で使用されます。
  2. 次に、AST を走査してルート ノード プログラムを見つけます。これを使用して、getData 関數(shù) (指定されたインデックスのプロパティと文字列を返す) がコードの先頭に挿入されます。
  3. 次に、MemberExpression タイプのノードをバイパスします。プロパティを getData 関數(shù)の呼び出しに置き換えます。この場合、計算されたプロパティ のおかげで、document.createElement のような構造は document[getData(0)] に変換されます。その過程で、プロパティの名前をデータ配列に入力します。
  4. 最後に、StringLiteral 型のノードをバイパスし、目的のインデックスを持つ getData の呼び出しで文字列も置き換えます。

解析操作は順番に実行されるのではなく、AST 処理中に必要なノードが見つかるためであることに注意してください。

このプラグインを?qū)g行した結果、次のコードが得られます:

l=~[];l={___:++l,$$$$:(![]+"")[l],__$:++l,$_$_:(![]+"")[l],_$_:++l,$_$$:({}+"")[l],$$_$:(l[l]+"")[l],_$$:++l,$$$_:(!""+"")[l],$__:++l,$_$:++l,$$__:({}+"")[l],$$_:++l,$$$:++l,$___:++l,$__$:++l};l.$_=(l.$_=l+"")[l.$_$]+(l._$=l.$_[l.__$])+(l.$$=(l.$+"")[l.__$])+((!l)+"")[l._$$]+(l.__=l.$_[l.$$_])+(l.$=(!""+"")[l.__$])+(l._=(!""+"")[l._$_])+l.$_[l.$_$]+l.__+l._$+l.$;l.$$=l.$+(!""+"")[l._$$]+l.__+l._+l.$+l.$$;l.$=(l.___)[l.$_][l.$_];l.$(l.$(l.$$+"\""+(![]+"")[l._$_]+l.$$$_+l.__+"\"+l.$__+l.___+"\"+l.__$+l.$$_+l.$$$+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$$_+l.$$$+"\"+l.__$+l.$_$+l.__$+l.$$_$+l.__+"\"+l.__$+l.$_$+l.___+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$_$+l.___+l.$$$_+"\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$__+l.$$$+"\"+l.__$+l.$_$+l.___+l.__+";\"+l.__$+l._$_+l.$$__+l._$+"\"+l.__$+l.$_$+l.$$_+"\"+l.__$+l.$$_+l._$$+l._$+(![]+"")[l._$_]+l.$$$_+".\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$_$+l.$$_+l.$$$$+l._$+"(\"+l.__$+l.$$_+l.$$$+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+");"+"\"")())();

結果のコードからわかるように、すべてのプロパティは、指定されたインデックスを持つ getData 関數(shù)呼び出しによって置き換えられています。文字列に対しても同じことを行い、関數(shù)呼び出しを通じて文字列を取得し始めました。プロパティ名と文字列自體は、気づきにくくするために、base64 でエンコードされています...

Here

もうお気づきかと思いますが、このプラグインとコード全般には、現(xiàn)段階では欠陥があります。たとえば、次の點は修正できる可能性があります:

  • プロパティと文字列を返す関數(shù)は、その目的である getData について叫びます。しかし、良いことに、識別子の名前を変更する最初のプラグインを適用することで、この點を修正できるということです。
  • getData 関數(shù)內(nèi)の文字列自體は確実に保護されていませんが、base64 のみであるため、初期値を見つけるのは非常に簡単です。この問題を解決するのはさらに困難です。たとえば、getData 関數(shù)を作り直して、よく知られたエンコーディングの代わりに暗號化を適用することができます。
  • getData 関數(shù)は唯一の関數(shù)であり、関數(shù)自體をプルして実行することで、すべての呼び出しを元の値に置き換えるスクリプトを作成するのは難しくありません。

この単純さと欠點にもかかわらず、これはすでに難読化と呼ばれる可能性があると思います。しかし、繰り返しになりますが、オープンソースの難読化ツールは同様のことを行うため、それらとどう違うのでしょうか?

私たちは元の問題を思い出さなければなりません。これらの難読化は、公的難読化解除者にとって簡単な作業(yè)でした。では、取得したコードを WebCrack で難読化を解除してみましょう。 (うまくいけば、まだ私たちの呪文に対処できないでしょうか?)。実質(zhì)的な重要性は達成されたと言えるでしょう?!副Woされた」コードは、公開された難読化解除ツールを介してワンクリックで元に戻せなくなりました

ボーナス。難読化解除

さあ、新しい呪文を?qū)Wびましょう。パブリックの難読化解除ツールはプラグインを処理できませんが、難読化の実際の概念を研究すると、ソース コードを復元するために使用できるいくつかのパターンに気づくことができます。

それでは、具體的に次のことを活用してみましょう。

  • プロパティと文字列を保存する?yún)g一の呼び出される関數(shù)があります。
  • この関數(shù)の呼び出しはマスクされません。

これらの欠點を考慮して、次のプラグインを?qū)g裝できます:

let w = screen.width, h = screen.height;
// Let's say there's a logic with some check. 
console.info(w, h);

この難読化解除プラグインの機能について説明しましょう:

  1. 難読化されたコードから getData 関數(shù)をコピーしました。必要な引數(shù) (インデックス) を指定して実行することで、必要な文字列を取得できます。
  2. すべての getData 関數(shù)呼び出しを調(diào)べて、その実行結果に置き換えました。
  3. 最後に、AST で getData 関數(shù)を見つけ、不要になったのでコードから削除しました。

結果として、次のコードが得られます:

l=~[];l={___:++l,$$$$:(![]+"")[l],__$:++l,$_$_:(![]+"")[l],_$_:++l,$_$$:({}+"")[l],$$_$:(l[l]+"")[l],_$$:++l,$$$_:(!""+"")[l],$__:++l,$_$:++l,$$__:({}+"")[l],$$_:++l,$$$:++l,$___:++l,$__$:++l};l.$_=(l.$_=l+"")[l.$_$]+(l._$=l.$_[l.__$])+(l.$$=(l.$+"")[l.__$])+((!l)+"")[l._$$]+(l.__=l.$_[l.$$_])+(l.$=(!""+"")[l.__$])+(l._=(!""+"")[l._$_])+l.$_[l.$_$]+l.__+l._$+l.$;l.$$=l.$+(!""+"")[l._$$]+l.__+l._+l.$+l.$$;l.$=(l.___)[l.$_][l.$_];l.$(l.$(l.$$+"\""+(![]+"")[l._$_]+l.$$$_+l.__+"\"+l.$__+l.___+"\"+l.__$+l.$$_+l.$$$+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$$_+l.$$$+"\"+l.__$+l.$_$+l.__$+l.$$_$+l.__+"\"+l.__$+l.$_$+l.___+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+"\"+l.$__+l.___+"=\"+l.$__+l.___+"\"+l.__$+l.$$_+l._$$+l.$$__+"\"+l.__$+l.$$_+l._$_+l.$$$_+l.$$$_+"\"+l.__$+l.$_$+l.$$_+".\"+l.__$+l.$_$+l.___+l.$$$_+"\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$__+l.$$$+"\"+l.__$+l.$_$+l.___+l.__+";\"+l.__$+l._$_+l.$$__+l._$+"\"+l.__$+l.$_$+l.$$_+"\"+l.__$+l.$$_+l._$$+l._$+(![]+"")[l._$_]+l.$$$_+".\"+l.__$+l.$_$+l.__$+"\"+l.__$+l.$_$+l.$$_+l.$$$$+l._$+"(\"+l.__$+l.$$_+l.$$$+",\"+l.$__+l.___+"\"+l.__$+l.$_$+l.___+");"+"\"")())();

Here

したがって、示された欠點を使用して babel の単純なプラグインを作成することで、プロパティと文字列を隠す難読化を取り除くことができました。

この小さな例で、babel の助けを借りてそのような迷惑行為と戦う方法を説明できたと思います。これらのアプローチを使用すると、より複雑な難読化を解決することもできます。主なことは、コード內(nèi)のパターンを見つけて、AST を巧みに操作することです。

結論

私たちは、コードのリバース エンジニアリングを複雑にする技術である難読化と、それを?qū)g裝するツールについて學びました。 JavaScript コードを難読化する公開ソリューションはありますが、この保護を瞬時に削除できる公開ソリューションも同じくらい多くあります。

したがって、パブリックの難読化解除ツールで削除できないコードを保護するには、獨自のソリューションを作成する必要があります。 JS で難読化を?qū)g裝する信頼できる方法の 1 つは、目的のコードの AST と対話して、コードを読みにくい形式に変換するカスタム Babel プラグインを作成することです。

もちろん、この分野には難読化に対する既知の技術やアプローチがありますが、それでもなお、コードの學習をより困難にする可能性がある創(chuàng)造性や新しい「トリック」の余地は殘されています。このような手法は多數(shù)ありますが、コードは常にクライアントの「手の中にある」ため、アルゴリズムの機密性はまったく保証されません。さらに、デバッグの可能性もあり、コードの研究が容易になります。難読化により、意欲の低い研究者を卻下できるため、リバース エンジニアリングのコストが増加します。

高度なアプローチがいくつかあります。たとえば、難読化の 1 つは コードの仮想化、または簡単に言えば、カスタム バイトコードを?qū)g行する仮想マシンを JS で作成することです。このアプローチでは、靜的解析の可能性がほぼ完全に排除され、デバッグが可能な限り困難になります。ただし、これは別の議論の主題です?....

このトピックに関する情報が皆さんのお役に立てば幸いです。これで、最初は難読化されたコードについて自分自身やプログラマを責めることがなくなります。これらのウィザードに感謝します ???♀?!ここでマジックの最新トレンドについて喜んでお話しさせていただきます?

以上がここでは、AST、Babel、プラグインを使用して、ラボを無駄にすることなく JavaScript で難読化を作成する方法を説明します。の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當する法的責任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java vs. JavaScript:混亂を解消します Java vs. JavaScript:混亂を解消します Jun 20, 2025 am 12:27 AM

JavaとJavaScriptは異なるプログラミング言語であり、それぞれ異なるアプリケーションシナリオに適しています。 Javaは大規(guī)模なエンタープライズおよびモバイルアプリケーション開発に使用されますが、JavaScriptは主にWebページ開発に使用されます。

JavaScriptコメント:短い説明 JavaScriptコメント:短い説明 Jun 19, 2025 am 12:40 AM

JavaScriptcommentsEareEssentialential-formaining、およびGuidingCodeexecution.1)single-linecommentseared forquickexplanations.2)多LinecommentsexplaincomplexlogiCorprovidededocumentation.3)clarifyspartsofcode.bestpractic

JSで日付と時間を操作する方法は? JSで日付と時間を操作する方法は? Jul 01, 2025 am 01:27 AM

JavaScriptで日付と時間を処理する場合は、次の點に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお勧めします。 2。時間情報を取得および設定して、メソッドを設定でき、月は0から始まることに注意してください。 3.手動でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお勧めします。これらの重要なポイントを習得すると、一般的な間違いを効果的に回避できます。

なぜの下部にタグを配置する必要があるのですか? なぜの下部にタグを配置する必要があるのですか? Jul 02, 2025 am 01:22 AM

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

JavaScript vs. Java:開発者向けの包括的な比較 JavaScript vs. Java:開発者向けの包括的な比較 Jun 20, 2025 am 12:21 AM

javascriptispreferredforwebdevelopment、whilejavaisbetterforlge-scalebackendsystemsandroidapps.1)javascriptexcelsininintingtivewebexperiences withitsdynAmicnature anddommanipulation.2)javaofferstruntypyping-dobject-reientedpeatures

DOMでのイベントの泡立ちとキャプチャとは何ですか? DOMでのイベントの泡立ちとキャプチャとは何ですか? Jul 02, 2025 am 01:19 AM

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設定することにより実裝されます。 2。イベントバブルはデフォルトの動作であり、UseCaptureはfalseに設定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

JavaScript:効率的なコーディングのためのデータ型の調(diào)査 JavaScript:効率的なコーディングのためのデータ型の調(diào)査 Jun 20, 2025 am 12:46 AM

javascripthassevenfundamentaldatypes:number、string、boolean、undefined、null、object、andsymbol.1)numberseadouble-precisionformat、有用であるため、有用性の高いものであるため、but-for-loating-pointarithmetic.2)ストリングリムムット、使用率が有用であること

JavaScriptアプリケーションのペイロードサイズをどのように削減できますか? JavaScriptアプリケーションのペイロードサイズをどのように削減できますか? Jun 26, 2025 am 12:54 AM

JavaScriptアプリケーションがゆっくりとロードされ、パフォーマンスが低い場合、問題はペイロードが大きすぎることです。ソリューションには、次のものが含まれます。1。コード分割(コードスプリッティング)を使用し、React.lazy()またはビルドツールを介して大きなバンドルを複數(shù)の小さなファイルに分割し、最初のダウンロードを減らすために必要に応じてロードします。 2。未使用のコード(Treeshaking)を削除し、ES6モジュールメカニズムを使用して「デッドコード」をクリアして、導入されたライブラリがこの機能をサポートしていることを確認します。 3.リソースファイルを圧縮してマージし、GZIP/BrotliとTerserがJSを圧縮できるようにし、ファイルを合理的にマージし、靜的リソースを最適化します。 4.頑丈な依存関係を交換し、day.jsやフェッチなどの軽量ライブラリを選択します

See all articles