我正试图“混淆”一个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)
答案 0 :(得分:1)
sub
没有摆脱你的字段分隔符。发生的事情是:
$1
.. $NF
时,会固有地丢弃字段分隔符文本。 $0
最初保留为原始行文字。$1
)时,awk 重新生成 $0
成为所有字段的串联,由OFS
分隔,输出字段分隔符。默认情况下,OFS
是一个空格。因此,当您print $0
时,您有两种情况:(1)您没有修改任何字段,因此您看到原始的完整行。 (2)你 修改了一个字段,所以你看到一条线被剥去了任何标点符号。
如果继续沿着这条路走下去,你需要做的就是保留原来的标点符号。这意味着不使用FS
进行标记化。你需要做更多的事情,比如迭代扫描字边界,检测你的触发令牌,以及随时建立一个结果线。或类似的东西。
但要注意!您还需要注意,如果您不够复杂,则可能会在引用的字符串("I want a t-shirt."
)中找到变量名称,并将其作为Javascript属性名称(blort = foo.t.bar
)。
我的真正的建议只是使用几个现有的Javascript混淆器中的一个。 Google的Closure https://developers.google.com/closure/是一个包含混淆的工具包,是一个不错的选择。