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

似乎子函数摆脱了字段分隔符。我还尝试了没有第三个参数的 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)时,awk将重新生 $0成为所有字段的串联,由OFS输出字段分隔符分隔。OFS是一个空格,默认情况下。

因此,当 you 时print $0,您有两种情况:(1)您没有修改任何字段,因此您看到的是原始完整行。(2) 您确实修改了一个字段,因此您看到一行被删除了任何标点符号。

如果你继续沿着这条路走下去,你需要做的是保留原来的标点符号。这意味着使用FSto 进行标记化。您需要做一些更像是迭代扫描单词边界、检测触发标记以及在进行过程中构建结果行的事情。或类似的东西。

但要小心!您还需要注意,如果您不够老练,您可能会在带引号的字符串 ( "I want a t-shirt.") 和 Javascript 属性名称 ( blort = foo.t.bar) 中找到变量名称。

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

于 2013-02-28T19:30:37.453 回答