How to change the icon, version or another resource of Windows executables built with PAR::Packer

November 2013.


You're using PAR::Packer to create a nice Windows executable out of one of your perl script.

However, the --info and --icon switch aren't working. You might also want to embed some other resource into your executable.

Trying the usual methods

exe_update --icon=jambon.ico jambon.exe

exe_update does not work with PAR::Packer executable. It will destroy your file.


ResHacker.exe -modify "jambon.exe", "jambon.exe", "jambon.ico", ICONGROUP, WINEXE, 0
ResHacker.exe -delete "jambon.exe", "jambon.exe", versioninfo,1,
ResHacker.exe -addoverwrite "jambon.exe", "jambon.exe", "jambon\version_info.res", versioninfo,1,

ResHacker will edit the resource of your file correctly. However, the executable will error when launching since its signature has changed. This is not acceptable.

Where the icon and version comes from

When built statically, a pp compiled executable is made of data stored in, which is made from and boot.exe. This boot.exe file is the one that contains the final resources.

The resources used to build this file are located in cpan\build\PAR-Packer-1.015-?????\myldr\winres. Modifying these files and rebuilding boot.exe will allow you to change your final executable resources.

The ugly solution that works

Before packing your perl script, rebuild boot.exe with your custom information.

This can easily be automated using a makefile, like this one:

PERL_DIR = C:\StupidPrograms\strawberryperl\perl
PAR_PACKER_SRC = C:\StupidPrograms\strawberryperl\cpan\build\PAR-Packer-1.015-2TLZDS

copy /Y medias\jambon.ico $(PAR_PACKER_SRC)\myldr\winres\pp.ico
copy /Y medias\jambon.rc $(PAR_PACKER_SRC)\myldr\winres\pp.rc
del $(PAR_PACKER_SRC)\myldr\ppresource.coff
cd /D $(PAR_PACKER_SRC)\myldr\ && perl Makefile.PL
cd /D $(PAR_PACKER_SRC)\myldr\ && dmake boot.exe
cd /D $(PAR_PACKER_SRC)\myldr\ && dmake
attrib -R $(PERL_DIR)\site\lib\PAR\StrippedPARL\
copy /Y $(PAR_PACKER_SRC)\myldr\ $(PERL_DIR)\site\lib\PAR\StrippedPARL\

pp -o jambon.exe -f PodStrip -f Bleach -f Obfuscate --compress=9

Your perl installation might be different than mine, so you'll want to adapt the scripts.

This solution is quite ugly, but it does work.