1

我试图了解这段代码片段在做什么。这是我不太明白的 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= 行的含义。

在 bash 中也确实function[[:space:]]*_具有特定含义,或者只是它正在查看的直字符串。

源文件来自犁头

4

3 回答 3

2

冒号是${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

它只是将一些东西附加到 string $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 源文件中查找函数定义有关。

于 2012-07-29T16:18:33.423 回答
2

在 bash 中,您可以选择参数的子字符串:

x=hello
y=${x:2:2}   # y = ll

while 循环正在迭代VAR. 在算术扩展构造$(( ... ))中,“16#string”是被string视为以 16 为基数的符号。

R 行执行一些算术运算C并将结果附加到 的前一个值R

于 2012-07-29T16:12:58.770 回答
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'。

于 2012-07-29T16:15:45.680 回答