繁体   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