这个 bash 片段在做什么?PHP/perl 等效



我试图理解这个代码片段在做什么。这是我不太清楚的 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 '。

最新更新