Packing increase memory usage indirectly: windows doesn't need to keep the whole unpacked program in ram as it can fetch the rest any time from disk, but as there is no disk image for packed program you force system to always keep it in memory/page file. The same increase loading time - system can start unpacked program after loading only part of it, but has to load the whole packed one. To enable ASLR you only need to specify /DYNAMICBASE to the linker and it probably will work just fine until you assume somewhere in code that your loading address is 0x4000000 (unlikely). UPX disables ASLR because unless you specify --strip-relocs=0 it will remove relocations that are requited for ASLR to work. Packed version of 2.0 already has ASLR-enabling flag set, but due to missing relocations it actually doesn't work. PS: You can test yourself how packing affects memory usage: make a program with large (~32MB) static const array, reference it in code so optimizing compiler won't throw it away and see how much memory the program consumes in unpacked and packed form.