簡體   English   中英

使用子程序時,awk保留字段分隔符

[英]awk keep field separator when using sub

我正在嘗試“模糊處理” 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

似乎子功能擺脫了字段分隔符。 我還嘗試了不帶第三個arg的sub,它保留了字段分隔符,但還在不應該更改的地方更改了“ t”:

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

輸出:

b7=documenb7.getElementById(t)

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 )中找到變量名"I want a t-shirt." blort = foo.t.bar )。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM