Unix awk在使用sub时保留字段分隔符
我试图“混淆”javascript代码(使其不可读以避免盗版) 我用awk来做这个。这对于长单词很好,但对于单字符单词则不行 输入文本:Unix awk在使用sub时保留字段分隔符,unix,awk,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 e
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
输出:
b7=documenb7.getElementById(t)
sub
没有去掉字段分隔符。正在发生的是:
$1
时,它固有地丢弃字段分隔符文本<代码>$NF<代码>$0最初保留为原始行文本$1
)时,awk将重新生成$0
,作为所有字段的串联,由输出字段分隔符OFS分隔<默认情况下,code>OFS是一个空格FS
进行标记化。您将需要做更多的事情,比如迭代扫描单词边界、检测触发器标记,以及在运行时构建结果行。或者类似的
但要当心!您还需要意识到,如果您不够复杂,您可能会在带引号的字符串中找到变量名(“我想要一件t恤。”
)和Javascript属性名(blort=foo.t.bar
)
我真正的建议是只使用几个现有Javascript模糊器中的一个。谷歌的关闭,这是一个包含模糊处理的工具包,是一个不错的选择。你能选择另一个FS吗?e、 g.
=
?或者当前的FS是必须的?同样sub($x,AWK\u OBF\u VAR,$x)
可能不是您想要的。您可能需要$x=AWK\u OBF\u VAR
我必须保持FS的原样(非单词字符:[^A-Za-z0-9\]+)我也尝试过$x=AWK\u OBF\u VAR,但同样的故事,它没有在输出中保留字段分隔符。谢谢您的回复。奇怪的是,当我使用sub($x,AWK_OBF_VAR)时,它在输出中保留字段分隔符,但在所有行中更新“$x”,因此对于$x='t',它将更新所有的't'。我来看看谷歌的解决方案。
b7=documenb7.getElementById(t)