QL.túra

Kulturális smörgåsbord Esterházytól Wass Albertig, a gumicsizmától az iPad-ig, a Teletabiktól Sexpírig, a makrofágtól a mikrokontrollerig, miazmás...

Címkék

2000 (20) 2001 (6) 2002 (16) 2003 (164) 2004 (61) 2005 (40) 2006 (31) 2007 (28) 2008 (33) 2009 (175) 2010 (188) 2011 (201) 2012 (86) 2013 (40) 2014 (36) 2015 (26) 2016 (10) adáshiba (91) android (1) animáció (93) cygwin (3) film (410) gezarol (13) hájtek (159) hangoskönyv (32) ipad (17) klip (12) könyv (191) linux (29) színház (169) vers (17) windows (37) zene (111) Címkefelhő

+jegyzések

Most ...

... múlok .osan

bmi_tiny.png


... hallgatom
Szabó Magda: Régimódi történet
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSqTmZEqlCRFgojyt52Q2n_qiMTyVlt-zJu-DpbNKVY6OQbBh4u


... olvasom
Alexander Steele (szerk.): Kezdő írók kézikönyve


... (Kik ezek? Kik ezek az embek? Kik ezek?)
profile for TrueY on Stack Exchange, a network of free, community-driven Q&A sites
free counters

[Hájtek] Ultimate Packer for eXecutables (UPX) fordítása Cygwin alá

2011.05.08. 12:00 | TrueY | Szólj hozzá!

Címkék: windows 2011 hájtek cygwin

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!

A bejegyzés trackback címe:

https://qltura.blog.hu/api/trackback/id/tr562589777

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása