我试图理解这个代码片段在做什么。这是我不太清楚的 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
只是想知道冒号在C=$
行内的作用以及 R= 行的含义。
function[[:space:]]*_
在 bash 中也有特定的含义,或者只是它正在查看的直字符串。
源文件来自犁共享
冒号是 ${parameter:offset:length}
表示法的一部分,bash的子字符串函数版本。 ${VAR:$I:2}
会翻译成 perl 作为 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 中是完全相同的,没有周围的$((...))
。美元符号双括号是外壳的"算术扩展"运算符。如果你研究这个公式,你会发现它$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源文件中查找函数定义有关。
在 bash 中,您可以选择参数的子字符串:
x=hello
y=${x:2:2} # y = ll
while 循环正在迭代 2 位数的VAR
块。在算术展开结构$(( ... ))
中,"16#string"是将string
视为以16为底数的符号。
R 线对C
执行一些算术运算,并将结果追加到之前的 R
值。
名思义,它将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 = 4210 = 052 = ' *
'。 "L"来自0x34 + 0x18 = 0x4C = 7610 = 0114 = ' L
'。