这个bash片段在做什么? PHP / perl相当于?

时间:2012-07-29 15:53:15

标签: bash

我正在尝试了解此代码段正在执行的操作。这是我无法弄清楚的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

3 个答案:

答案 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'。

相关问题