perlhexiso9660

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


I am trying to install a Live Kali Linux on a USB without the two beeps at booting. I found the fifth post in this thread that says:

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.

I managed to delete the (x07) byte for BIOS with the given Perl script, so I tried the same thing with "insmode play play 60 440 1 0 4 440 1" (I opened grub.cfg in a hex editor, copied the hex of this string, 696E736D6F6420706C61790A706C61792039363020343430203120302034203434302031, and put 20 in the place of every byte).

I ran this script 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.

But the string is still in the iso.

Why does it not get replaced?


Solution

  • You are reading a line at a time, which is defined as a sequence of byte up until the line feed (inclusive). So $_ is never going to have a line feed anywhere but at the end.

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

    That comments out the lines independently. If you want to replace them as a set, you'll need a buffer.

    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