2013-02-28 64 views
0

我想「混淆」一個JavaScript代碼(使其不可讀,以避免盜版) 我使用awk來做到這一點。對於長單詞而言,這並行,但不適用於單個單詞。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 

似乎子功能擺脫了字段分隔符。 我也試過子沒有第三個參數,這使字段分隔符,而且還改變「T」的地方不應該:

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

輸出:

b7=documenb7.getElementById(t) 
+0

你可以選擇另一個FS嗎?例如'='?或者當前的FS是必須的? – Kent 2013-02-28 17:43:37

+0

也'子($ x,AWK_OBF_VAR,$ x)'可能不是你想要的。你可能想要'$ x = AWK_OBF_VAR' – Kent 2013-02-28 17:48:37

+0

我必須保持FS原樣(非單詞字符:[^ A-Za-z0-9 _] +) – user2120594 2013-03-01 13:30:46

回答

1

sub沒有擺脫你的字段分隔符。發生了什麼事是:

  1. AWK固有丟棄字段分隔文本時,它解析每一行成田$1 .. $NF。最初將$0保留爲原始文本。
  2. 重新分配的字段(例如$1)中的一個的那一刻,AWK 再生$0是所有字段,通過OFS,輸出場分離器分離的串聯。默認情況下,OFS是一個空格。

所以,當你print $0,你有兩種情況:(1)你沒有修改任何字段,所以你看到原來的完整的行。 (2)你確實修改了一個字段,所以你看到的是一行刪除了任何標點符號。

如果您繼續沿着這條路走下去,您需要做的是保留原始標點符號。這意味着不是使用FS來做標記。你需要做更多的事情,比如迭代地掃描單詞界限,檢測你的觸發標記,並隨時建立一個結果行。或類似的東西。

但要小心!您還需要注意,如果您的複雜程度不夠高,可能會在引用字符串("I want a t-shirt.")中找到您的變量名稱,並以Javascript屬性名稱(blort = foo.t.bar)冒險。

我的real建議只使用幾種現有的Javascript混淆器之一。 Google的Closure https://developers.google.com/closure/是一個包含混淆的工具包,是一個不錯的選擇。

+0

感謝您的回覆danfuzz。奇怪的是,當我使用sub($ x,AWK_OBF_VAR)時,它將輸出中的分隔符保留,但在所有行中更新「$ x」,因此對於$ x ='t'它將更新所有't' 。我會看看Google的解決方案。 – user2120594 2013-03-01 13:37:31