0

私はjavascriptコードを「難読化」しようとしています(著作権侵害を避けるために判読不能にします)これを行うためにawkを使用しています。これは長い単語ではうまく機能しますが、単一の文字の単語では機能しません。

入力テキスト :

var t=document.getElementById(u)

期待される出力:

var b7=document.getElementById(b8)

実際の出力:

var b7 document getElementById b8

AWKコード:

${cor_var} is a unix variable which contains "t" in our example
${obf_var} is a unix variable which contains "b7" (the obfuscated variable)

awk -v AWK_COR_VAR="${cor_var}" -v AWK_OBF_VAR="${obf_var}" '

      # We use Non-word characters as field separator
      # Like this we can extract var/func
      BEGIN {FS="[^A-Za-z0-9_]+"}
      {
        if ($0 ~ AWK_COR_VAR) {
          # On a line containing our word, we go through each field till we find our word
          # and then we replace it with sub
          for ( x = 1; x < NF; x++ ) {
            # Output fields with space as delimiter
            if ($x == AWK_COR_VAR) {sub($x, AWK_OBF_VAR, $x)};
          }
          print $0;
        } else {print $0}
      }' $file

サブ関数がフィールドセパレータを取り除いたようです。また、フィールドセパレータを保持する3番目の引数なしでsubを試しましたが、「t」を変更してはいけない場所も変更しました。

if ($x == AWK_COR_VAR) {sub($x, AWK_OBF_VAR)};

出力:

b7=documenb7.getElementById(t)
4

1 に答える 1

1

subフィールドセパレーターを取り除いていません。何が起こっているのですか:

  1. awk は、各行をフィールドに解析するときに、フィールド区切りテキストを本質的に破棄します$1.. $NF. $0最初は元の行テキストのままです。
  2. フィールドの 1 つ (例: $1) を再割り当てすると、awkは、出力フィールド セパレータであるで区切られたすべてのフィールドを連結するように再生成します。 デフォルトではスペースです。$0OFSOFS

そのため、print $0次の 2 つの場合があります。(1) フィールドを変更していないため、元の完全な行が表示されます。(2)フィールドを変更たため、句読点が削除された行が表示されています。

この道を進む場合、元の句読点を維持する必要があります。これは、トークン化を行うために使用しないことを意味します。FS単語の境界を繰り返しスキャンし、トリガー トークンを検出し、結果行を作成するなどの処理を行う必要があります。またはそのようなもの。

しかし、注意してください!また、十分に洗練されていない場合は、引用符で囲まれた文字列内 ( "I want a t-shirt.") や Javascript プロパティ名 ( blort = foo.t.bar) として変数名を見つけるリスクがあることに注意する必要があります。

の本当の推奨事項は、いくつかの既存の Javascript 難読化ツールの 1 つだけを使用することです。難読化を含むツールのパッケージであるGoogle の Closure https://developers.google.com/closure/は、かなり良い選択です。

于 2013-02-28T19:30:37.453 に答える