Perl 十六进制替换 (s///g) 在 ISO 文件上使用时无效

Perl hex replacement (s///g) has no effect when used on an ISO file

我正在尝试在 USB 上安装 Live Kali Linux,但没有在启动时发出两声嘟嘟声。我发现 the fifth post in this thread 上面写着:

This can also depend on UEFI vs BIOS

For BIOS you can use the following PERL script on the ISO file itself and it will take care of any place ^G exists in the iso:

perl -p -i -e 's;\x6d\x65\x6e\x75\x07;\x6d\x65\x6e\x75\x20;g' your-kali.iso

The beep was added for accessibility to the UEFI boot menu as well so you may still get the beep. To remove that you must edit grub.cfg and comment out or remove the following two lines:

insmode play
play 960 440 1 0 4 440 1

I used live build to make the changes to grub.cfg, generated the iso, and then ran the perl script prior to flashing to the usb.

我设法用给定的 Perl 脚本删除了 BIOS 的 (x07) 字节,所以我用“insmode play play 60 440 1 0 4 440 1 尝试了同样的事情"(我在十六进制编辑器中打开 grub.cfg,复制了这个字符串的十六进制,696E736D6F6420706C61790A706C61792039363020343430203120302034203434302031,并将 20 放在每个字节的位置)。

我运行这个脚本perl -p -i -e 's;\x69\x6e\x73\x6d\x6f\x64\x20\x70\x6c\x61\x79\x0a\x70\x6c\x61\x79\x20\x39\x36\x30\x20\x34\x34\x30\x20\x31\x20\x30\x20\x34\x20\x34\x34\x30\x20\x31;\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20;g' your-kali.iso

但该字符串仍在 iso 中。

为什么没有被替换?

perl -p -e CODE 通常在输入的每一行上运行指定的代码,其中行(在 POSIX-y 系统上)由换行符 (\x0a) 分隔,所以这代码不允许您在搜索模式包含 \x0a.

的地方进行替换

我的方法(这是 Perl,所以有很多方法可以做到这一点)更像是

perl -p -i -e '$_="" if $_ eq "insmod play\n" || 
               $_ eq "play 960 440 1 0 4 440 1\n"' your-kali.iso

当输入行与两个目标模式之一匹配时(即,从输出中删除它们,而不是用空格字符串替换它们),这会将输入行替换为空字符串。

您一次读取一行,这被定义为一个字节序列,直到换行符(包括)。所以 $_ 永远不会在任何地方换行,但在最后。

perl -i -pe'
   s/^i(?=nsmode play$)/#/;
   s/^p(?=lay 960 440 1 0 4 440 1$)/#/;
' your-kali.iso

独立注释行。如果你想将它们作为一个集合来替换,你需要一个缓冲区。

perl -i -pe'
   if (/^insmode play$/) {
      $buf = $_;
      $_ = "";
      next;
   }

   $_ = $buf . $_;
   $buf = "";
   s/^insmode play\nplay 960 440 1 0 4 440 1\n/#nsmode play\n#lay 960 440 1 0 4 440 1\n/;

   END { print $buf }
' your-kali.iso