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



我正在尝试在USB上安装Live Kali Linux,而启动时没有两声哔哔声。我在这个线程中找到了第五篇帖子,上面写着:

这也可能取决于UEFI与BIOS

对于 BIOS,您可以在 ISO 文件本身上使用以下 PERL 脚本 它将照顾 iso 中存在的任何地方 ^G:

perl -p -i -e 's;x6dx65x6ex75x07;x6dx65x6ex75x20;g' your-kali.iso

还添加了哔哔声以访问UEFI启动菜单,因此 您可能仍然会听到哔哔声。要删除它,您必须编辑 grub.cfg 和 注释掉或删除以下两行:

insmode 播放
960 440 1 0 4 440 1

我使用实时构建对 grub.cfg 进行更改,生成 iso, 然后在烧录到 USB 之前运行 Perl 脚本。

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

perl -p -i -e 's;x69x6ex73x6dx6fx64x20x70x6cx61x79x0ax70x6cx61x79x20x39x36x30x20x34x34x30x20x31x20x30x20x34x20x34x34x30x20x31;x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20;g' your-kali.iso运行了这个脚本。

但是字符串仍在 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 playnplay 960 440 1 0 4 440 1n/#nsmode playn#lay 960 440 1 0 4 440 1n/;
END { print $buf }
' your-kali.iso

perl -p -e CODE通常在输入的每一行上运行指定的代码,其中行(在 POSIX-y 系统上)由换行符 (x0a) 字符分隔,因此此代码将不允许您在搜索模式包含x0a的情况下进行替换。

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

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

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

最新更新