使用sub时awk保持字段分隔符

时间:2013-02-28 17:30:30

标签: unix awk

我正试图“混淆”一个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个arg的sub,它保留了字段分隔符,但也改变了't'它不应该在哪里:

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

输出:

b7=documenb7.getElementById(t)

1 个答案:

答案 0 :(得分:1)

sub没有摆脱你的字段分隔符。发生的事情是:

  1. awk在将每一行解析为字段$1 .. $NF时,会固有地丢弃字段分隔符文本。 $0最初保留为原始行文字。
  2. 当您重新分配其中一个字段(例如$1)时,awk 重新生成 $0成为所有字段的串联,由OFS分隔,输出字段分隔符。默认情况下,OFS是一个空格。
  3. 因此,当您print $0时,您有两种情况:(1)您没有修改任何字段,因此您看到原始的完整行。 (2)你 修改了一个字段,所以你看到一条线被剥去了任何标点符号。

    如果继续沿着这条路走下去,你需要做的就是保留原来的标点符号。这意味着使用FS进行标记化。你需要做更多的事情,比如迭代扫描字边界,检测你的触发令牌,以及随时建立一个结果线。或类似的东西。

    但要注意!您还需要注意,如果您不够复杂,则可能会在引用的字符串("I want a t-shirt.")中找到变量名称,并将其作为Javascript属性名称(blort = foo.t.bar)。

    我的真正的建议只是使用几个现有的Javascript混淆器中的一个。 Google的Closure https://developers.google.com/closure/是一个包含混淆的工具包,是一个不错的选择。