Ha zavar, hogy a leforgatott kód túl sok helyet foglal (pl. kézi készülékre szeretnéd feltenni), akkor érdemes kipróbálni ezt a csomagot. A különböző platformokra (PC, ARM, powerPC, Darwin stb.) lehet exe-ket és dll-eket tömöríteni. Néha 70%-kal is. Tapasztalatom szerint a betöltési sebesség nem változik. Esetleg a memóriából kicsit több helyet foglal betöltéskor, de erre nézvést nem tudtam méréseket végezni.
Cygwin-ről le lehet tölteni az UPX csomagot. Ezzel alapból a -1, -2, ..., -9, --best tömörgetéssel lehet tömöríteni. Az "upx --help" doksijában látszik, hogy van --brute és --ultra-brute is, de ha ezzel kísérletezünk, akkor az alap cucc kajabál:
assertion "0 && "Internal error - LZMA not compiled in"" failed: file "packer_c.cpp", line 43, function: static bool Packer::isValidCompressionMethod(int)
Aborted (core dumped)
Hogy ezek is működjenek, magunknak kell forgatnunk.
UPX src: http://upx.sourceforge.net/, vagy cygwin UPX csomag SRC bejelöl -> /usr/src/upx/upx-3.07-*
Kell hozzá az UCL csomag is.
UCL src: http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz
Először az UCL csomagot kell leforgatni:
UCL compile:
./configure
make
make install (as root)
...
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
Ez simán megvan...
UPX compile:
cd upx-3.07-src
make all
ld meghalt:
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lucl
Ezeket beállítottam /usr/local/lib-ra:
LD_RUN_PATH, LD_LIBRARY_PATH, LIBDIR, LDPATH, LD_PATH
Nem nyert!
Megnéztem az upx-3.07-src/src/Makefile-t. Ez a UPX_UCLDIR alatt keresi a header file-t és a lib-eket. Az include itt van:
ucl-1.03/include/ucl és a src/.libs/libucl.a-t is itt találja. Akkor hajrá:
export UPX_UCLDIR=~/UPX/ucl-1.03
make all
Na, sikerült link-elnie végre! Az src alá upx.out-ot csinál. Ezt át kell nevezni upx.exe-re.
(Vagy a Makefile-ban át kell állítani az exeext exe-re)
Futtatás:
$ upx -9 -o o.exe x.exe
Ez ok! De a --brute ugyanazt csinálja, mint a cygwin csomagos.
* upx --brute -o o.exe x.exe
...
assertion "0 && "Internal error - LZMA not compiled in"" failed: file "packer_c.cpp",
line 43, function: static bool Packer::isValidCompressionMethod(int)
...
Hát még mindig nem a legjobb (ugyanaz, mint az eredeti hibaüzenet)! Viszont kecsegtető, hogy a
"upx -9 -o o.exe x.exe" ugyanakkora exe-t csinál, mint a cygwin csomagban letöltött! :)
"upx --best -o o.exe x.exe" nagyon sokat tököl (2m57.532s és nem sokat nyer)
Az upx-3.07-src/src/conf.h-ban találtam egy ilyen sort:
(185) #if 0 && !defined(WITH_LZMA)
A Makefile-ban meg egy ilyet:
61 # you should set envvar UPX_LZMADIR to point to your unpacked LZMA SDK
LZMA SDK letölt: http://www.7-zip.org/sdk.html. Most a legfrissebb: http://downloads.sourceforge.net/sevenzip/lzma920.tar.bz2
Vigyázat! Ez nem egy root-dir alá pakol :(, mint általában a tar golyók! Csináltam hát egy ~/UPX/lzma920
könyvtárat és oda pakoltam ki. Majd UPX újra fordít:
cd ~UPX/upx-3.07-src
export UPX_LZMADIR=~/UPX/lzma920
make clean all
Na erre dobott egy csomó hibát. Úgy tűnik, hogy windows-os beállítások hibáznak (HANDLE, LPVOID nincs definiálva).
~/UPX/lzma920/C/Types.h elejére tegyük ezt be:
#ifdef __CYGWIN__
#include <w32api/windows.h>
#endif
cd ~/UPX/upx-3.07-src
export UPX_LZMADIR=/home/myhome/UPX/lzma920
export UPX_UCLDIR=/home/myhome/UPX/ucl-1.03
make clean all
Linker megint elhasalt. :(
Hmmm. A lzma920/C/LzFindMt.c-ben megvannak a függvények.
upx-3.07-src/src/Makefile -ben javítom, hogy ne kelljen átnevezgetnem:
exeext ?= exe
...
DEFS += -DWITH_LZMA=$(UPX_LZMA_VERSION)
+++ DEFS += -D_7ZIP_ST ## Single Thread
Újra "make clean all". Na végre... A MultiThread nem megy, de legalább így most jó... Próbálkoztam a MultiThread berakásával is, de végül az alap cygwin header file-ok összetűzésbe kerültek a /usr/inlclude/mingw/* header file-okkal. Nem folytattam a kibogozásukat.
Csináltam pár tesztet a tömörgetés hatékonyság vs. szükséges idő témakörben:
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -1 -o o-1.exe orig.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2010
UPX 3.07 Markus Oberhumer, Laszlo Molnar & John Reiser Sep 08th 2010
File size Ratio Format Name
-------------------- ------ ----------- -----------
7153176 -> 3315736 46.35% arm/pe o-1.exe
Packed 1 file.
real 0m0.984s user 0m0.703s sys 0m0.093s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -2 -o o-2.exe orig.exe
7153176 -> 3255320 45.51% arm/pe o-2.exe
real 0m1.260s user 0m0.921s sys 0m0.077s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -3 -o o-3.exe orig.exe
7153176 -> 3229208 45.14% arm/pe o-3.exe
real 0m1.178s user 0m0.968s sys 0m0.093s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -4 -o o-4.exe orig.exe
7153176 -> 3007000 42.04% arm/pe o-4.exe
real 0m1.300s user 0m1.062s sys 0m0.077s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -5 -o o-5.exe orig.exe
7153176 -> 2871320 40.14% arm/pe o-5.exe
real 0m1.548s user 0m1.296s sys 0m0.077s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -6 -o o-6.exe orig.exe
7153176 -> 2848280 39.82% arm/pe o-6.exe
real 0m1.963s user 0m1.671s sys 0m0.030s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -7 -o o-7.exe orig.exe
7153176 -> 2771480 38.74% arm/pe o-7.exe
real 0m3.382s user 0m3.140s sys 0m0.061s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -8 -o o-8.exe orig.exe
7153176 -> 2766360 38.67% arm/pe o-8.exe
real 0m5.315s user 0m5.108s sys 0m0.062s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v -9 -o o-9.exe orig.exe
7153176 -> 2722840 38.06% arm/pe o-9.exe
real 0m11.599s user 0m11.343s sys 0m0.093s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v --best -o o--best.exe orig.exe
7153176 -> 2623512 36.68% arm/pe o--best.exe
real 2m57.229s user 2m55.484s sys 0m0.233s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v --brute -o o--brute.exe orig.exe
7153176 -> 1879576 26.28% arm/pe o--brute.exe
real 24m11.036s user 24m2.140s sys 0m1.109s
$ time ~/UPX/upx-3.07-src/src/upx.exe -v --ultra-brute -o o--ultra-brute.exe orig.exe
7153176 -> 1879576 26.28% arm/pe o--ultra-brute.exe
real 24m43.578s user 24m32.890s sys 0m1.109s
Mindegy melyiket indítom a kütyün (400 MHz ARM, Flashről indítva), mindegyik 10 mp alatt indul. A --ultra-brute 11 mp alatt indult. Gondolom ha gyorsabb a proci, akkor már számíthat, hogy a flashról való behúzás lassú. 400 MHz-es ARM-nél nem láttam különbséget. Pedig az lzma-ról azt mondják, hogy a kicsomagolás nagyon gyors (akár 20* gyorsabb). Én ezt nem tapasztaltam.
Legyünk tömörek minden nap!
+jegyzések