我正在尝试了解此代码段正在执行的操作。这是我无法弄清楚的bash语法。
# Static function
get_ofuscated_link() {
local VAR=$1
local I N C R
I=0
N=${#VAR}
while (( I < N )); do
C=$((16#${VAR:$I:2} + 0x18))
R="$R"$(printf \\$(($C/64*100+$C%64/8*10+$C%8)))
(( I += 2 ))
done
echo "$R"
}
由此命令调用
JS_VAR=$(echo "$PAGE" | parse 'function[[:space:]]*_' '"\([^"]\+\)";' 1) || return
FILE_URL=$(get_ofuscated_link "$JS_VAR" | parse_attr href) || return
只是想知道Colon在C=$
行内的行为以及R =行的含义。
function[[:space:]]*_
在bash中也有特定含义,或者只是它正在查看的直字符串。
源文件来自plowshare
答案 0 :(得分:2)
在bash中,您可以选择参数的子字符串:
x=hello
y=${x:2:2} # y = ll
while循环遍历VAR
的2位数块。在算术扩展构造$(( ... ))
内,“16#string”是将string
视为基数为16的符号。
R行对C
执行一些算术运算,并将结果追加到先前的R
值。
答案 1 :(得分:2)
冒号是${parameter:offset:length}
表示法的一部分,bash的子字符串函数版本。 ${VAR:$I:2}
会将{per}转换为substr($VAR, $I, 2)
。整个C=
分配相当于
$C = hex(substr($VAR, $I, 2) + 0x18);
所以$VAR
是一个十六进制数字的字符串,循环一次取两个,加上幻数0x18,并将其存储到$ C.
R=
行很简单。首先,它的顶层结构是:
R="$R"stuff
只是将一些内容添加到字符串$R
中。现在让我们来看看这些东西。其核心是:
$(($C/64*100+$C%64/8*10+$C%8)))
在perl中完全相同,没有围绕它的$((...))
。美元符号双括号是shell的“算术扩展”运算符。如果您研究公式,您会看到它将$C
转换为三位八进制数字(数字为$C/64
,$C%64/8
和$C%8
)然后转换到具有相同三位数的十进制数。所以这只是一种奇怪的方式,可以在$C
中取数字并将其打印为八进制。
现在我们已经解决了这个问题,附加到$R
的内容是:
$(printf \\000)
其中八进制数字替换000.这相当于perl的chr(oct("000"))
。
所以$R
被构建为一个字符串,输入$VAR
中的每对十六进制数字都有一个字符,表示一串字符代码,这些代码通过从中减去0x18进行混淆,并且此函数重新添加0x18。
[[:space:]]
运算符是正则表达式的一部分。它是一个POSIX,相当于perl的\s
运算符,它匹配各种类型的空格。我们必须要确定您的parse
命令或函数,但看起来正则表达式与在javascript源文件中查找函数定义有关。
答案 2 :(得分:1)
它正在将URL转换为模糊符号,顾名思义(虽然名称中有拼写错误,进一步混淆了所有内容)。
for (i = 0; i < length(url); i += 2)
{
c = hex value of two characters of URL + 0x18
r += character c interpreted as octal
}
因此,给定1234
,输出为*L
。 *
来自0x12 + 0x18 = 0x2A = 42 10 = 052 ='*
'。 'L'来自0x34 + 0x18 = 0x4C = 76 10 = 0114 ='L
'。