Compare commits
261 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9b4c11954d | |||
| a1b724f30a | |||
| 7c3b2fb9cc | |||
| acef68d67e | |||
| 7e393d5f1e | |||
| 955c31b165 | |||
| e307cd48ad | |||
| 25f8b9e451 | |||
| e8ba14a2c1 | |||
| 9670d3341c | |||
| cec9778fd5 | |||
| 7451db4a68 | |||
| e31777ec53 | |||
| 7aa0b3dc7a | |||
| e7b2d5dc01 | |||
| 47d728667d | |||
| e1f8989d54 | |||
| 1d8cb47830 | |||
| faaa7c37a9 | |||
| 0aff9d8df4 | |||
| 30c3f8c1ac | |||
| bcd2469e01 | |||
| 983c6ae73d | |||
| 6d8e1fe776 | |||
| 99b4921309 | |||
| 3c231c3c9e | |||
| 175c0a6236 | |||
| 0031ceb06c | |||
| e3cc5a63df | |||
| 3cb61402c2 | |||
| 5336c51199 | |||
| 52aa658aaa | |||
| d08a51d7e4 | |||
| d97a557ac3 | |||
| 8a68d9cded | |||
| b031f7e902 | |||
| 963ffecb96 | |||
| 8f8aaca818 | |||
| 801f92b7e7 | |||
| 44db45700e | |||
| 25902005f6 | |||
| ffec71e0d8 | |||
| 99a208110b | |||
| e56799c993 | |||
| 957eb300f8 | |||
| 626025d539 | |||
| 9e8a0a020f | |||
| 40f592eade | |||
| 5e899f0be4 | |||
| f2748284b1 | |||
| a15ce00934 | |||
| 9e3e80261b | |||
| c72c685434 | |||
| 0177a8d277 | |||
| b6a9b0a4c9 | |||
| f4f8bd8d42 | |||
| 6e4aeffc0c | |||
| dba256d384 | |||
| 910008e9e7 | |||
| 8cb9545c41 | |||
| 59c16da6fb | |||
| 630df5bbd2 | |||
| f550111400 | |||
| 77377195aa | |||
| 7e2e72bd40 | |||
| aa7a13bd02 | |||
| 5895058a17 | |||
| ffb60d5149 | |||
| 1e2cb279b0 | |||
| e7f766f5ba | |||
| 8de5aa9409 | |||
| bf28a4df49 | |||
| fe1a0ab371 | |||
| 01daccfaf7 | |||
| 94e861e298 | |||
| d36af2ed5c | |||
| 7104b33214 | |||
| 32998e5377 | |||
| af0c9ef092 | |||
| 3bc3b3d10e | |||
| f03f42ca4d | |||
| 79783abeb1 | |||
| 895b0bd602 | |||
| 2ee5ee92f8 | |||
| 3e619423b1 | |||
| b524e18bdf | |||
| 6aa4579db8 | |||
| 17fb86c0f1 | |||
| 62ecfe4873 | |||
| 04e55e6b9a | |||
| f432aa1090 | |||
| 7add104313 | |||
| 36de249066 | |||
| b7a54dcffd | |||
| 6bb28deab2 | |||
| 7f88d15c86 | |||
| 94c5014e23 | |||
| c5a8256500 | |||
| 5f39884bf7 | |||
| d96825a242 | |||
| 443a938091 | |||
| 6bc3197721 | |||
| 269cc91fd5 | |||
| c1ddea479d | |||
| 5f3a95962c | |||
| ee1a8e6a32 | |||
| eeae73296e | |||
| 4ca8357af4 | |||
| 8a5b8c87fb | |||
| 6ab04d7bbc | |||
| a5a1380636 | |||
| eeab1aef64 | |||
| 4e1c342e55 | |||
| d8ed259bce | |||
| 9f6cb5de4c | |||
| ba634118d7 | |||
| 63da091d36 | |||
| ad0dc88a33 | |||
| 147acf4b57 | |||
| 5085f3a15e | |||
| 22a95ad8ea | |||
| df4bd6a60c | |||
| 813e7b05e4 | |||
| ab8b486b4a | |||
| 590f666ec9 | |||
| 9adaee915b | |||
| bce0f06fe9 | |||
| 856ecb84a0 | |||
| 90ddc06c98 | |||
| 405abc4e95 | |||
| 549c59ecf5 | |||
| 0a485eafcb | |||
| e0c11956a6 | |||
| da6a9bf3eb | |||
| dacd11e1cc | |||
| fc854b4c77 | |||
| 4dcc1f0374 | |||
| fc57390242 | |||
| bd15ef0a0c | |||
| 967ecafc33 | |||
| 29576da985 | |||
| 200a2556ef | |||
| ae0ab5025e | |||
| aa74276b25 | |||
| b03112a5dd | |||
| a3f49df62d | |||
| aa2af3f6dd | |||
| 20dcbc593c | |||
| 472ba8c1fd | |||
| d8345a44a4 | |||
| a187cb6c9c | |||
| b89c0b35d1 | |||
| 7ffcc0a5e7 | |||
| bde43fbdfb | |||
| 3728b2208f | |||
| dc52a756ee | |||
| 98dc886841 | |||
| d0cf104e43 | |||
| d7ed2412f6 | |||
| 7d38f0e234 | |||
| 3e8d072d24 | |||
| 84ac771893 | |||
| 3a9e0b5be6 | |||
| 9694ff433f | |||
| 2e82e78b98 | |||
| aaef4bee27 | |||
| 4ca8569488 | |||
| 8377ada3e0 | |||
| 8a034d59ed | |||
| 8e492d8798 | |||
| 7974ef80d7 | |||
| 3664d86430 | |||
| 9adef80d6b | |||
| be57adaee7 | |||
| d117e442a4 | |||
| 8820bc0796 | |||
| 57a64de023 | |||
| 5ed689ceb0 | |||
| 25f1765f36 | |||
| 063bd58802 | |||
| 901c6b34fa | |||
| 5b2d6488a2 | |||
| f6f35415d1 | |||
| 6c6069e963 | |||
| 6219d82560 | |||
| 1dcd7a16ab | |||
| b60caeb9dd | |||
| 4c4768aaf3 | |||
| 2f4ac0a663 | |||
| 23a446f852 | |||
| ec48334a1a | |||
| f4c061d412 | |||
| 31a076d7b3 | |||
| 6bd43d986c | |||
| dd32a2f15a | |||
| c88c20820f | |||
| 86de510731 | |||
| 0b31fbf827 | |||
| 34ad1450eb | |||
| e6ba71390d | |||
| f0c8dbe0ec | |||
| bf046a8ccb | |||
| b05ba7683e | |||
| aedf8dad15 | |||
| 74ebb7c722 | |||
| 1307f66494 | |||
| 448a24cb36 | |||
| 7266f23450 | |||
| c0ad31acfc | |||
| 25d3a0de27 | |||
| 1e38bbfbc1 | |||
| 1c62e95812 | |||
| d453cc27a3 | |||
| 2c3e841d8a | |||
| 50668c462f | |||
| 8d1192e832 | |||
| 4a8e2e9ed4 | |||
| 12fc45220a | |||
| 6bce68fbe7 | |||
| d54f947c98 | |||
| 6c8bb3a22e | |||
| ed29ce5183 | |||
| a51d269b7c | |||
| 8283e4e6d6 | |||
| 23ce91eb55 | |||
| 545ac7fcfa | |||
| 3926ccccad | |||
| f431307ef2 | |||
| ca368e0f9b | |||
| 8afeb56c11 | |||
| 2a6f90c5f3 | |||
| 271031128e | |||
| b991f954d0 | |||
| f12bb3f80d | |||
| 6dc978e8d8 | |||
| 9f05a873bc | |||
| 703d498772 | |||
| ed3b9543bb | |||
| fc7efba7d8 | |||
| b3178fe8f4 | |||
| e36798a993 | |||
| a143605465 | |||
| d3ad35b21e | |||
| 68134941bf | |||
| 54d0fef559 | |||
| 7f9c47176a | |||
| 9060ac7897 | |||
| d9073e4a17 | |||
| de1c1d7cc2 | |||
| 6ff1bd5917 | |||
| a6b04f426e | |||
| fa49dbe2cb | |||
| 682eb04a52 | |||
| 77064fb09e | |||
| be8d93563a | |||
| d4a6a5216d | |||
| 1cb1427050 | |||
| e4f4eace1c | |||
| 30a98b7e8c | |||
| d36c8d95ad | |||
| 506bd0abcf |
@@ -45,7 +45,7 @@ stub/**.*-stamp
|
|||||||
stub/tmp*/*
|
stub/tmp*/*
|
||||||
stub/**/tmp*/*
|
stub/**/tmp*/*
|
||||||
|
|
||||||
stub/tools/armpe/armpe_tester
|
stub/tools/armpe/armpe_tester{,.exe,.out}
|
||||||
|
|
||||||
stub/tools/sstrip/amd64-linux-sstrip
|
stub/tools/sstrip/amd64-linux-sstrip
|
||||||
stub/tools/sstrip/i386-linux-sstrip
|
stub/tools/sstrip/i386-linux-sstrip
|
||||||
|
|||||||
@@ -1,16 +1,21 @@
|
|||||||
140415ffbcef86a42b4d672249927364430d3d38 RELEASE_111
|
140415ffbcef86a42b4d672249927364430d3d38 RELEASE_111
|
||||||
|
155618b5b7930f97bd84b82befa7a4fd6672efb3 RELEASE_304
|
||||||
1931f4f28074970ec53b4cd21c7fc181b4da8e5e RELEASE_301
|
1931f4f28074970ec53b4cd21c7fc181b4da8e5e RELEASE_301
|
||||||
223ac5b23f9731ceac9ff8d65167df4900776e36 RELEASE_190
|
223ac5b23f9731ceac9ff8d65167df4900776e36 RELEASE_190
|
||||||
2c753c5bf38e7322715e2a5c6c5381111bd7a61a RELEASE_194
|
2c753c5bf38e7322715e2a5c6c5381111bd7a61a RELEASE_194
|
||||||
2ee65b77f9117651e2e5517b2edede23698d73ca RELEASE_196
|
2ee65b77f9117651e2e5517b2edede23698d73ca RELEASE_196
|
||||||
396983c065fc743cb5b9703e266ca87eeff8a6ee RELEASE_291
|
396983c065fc743cb5b9703e266ca87eeff8a6ee RELEASE_291
|
||||||
|
46f3a6cca02603000fadc16637b02e30caddd909 RELEASE_302
|
||||||
70402aeee6e0e4fc2889658ed8cee44461c0b0a8 RELEASE_200
|
70402aeee6e0e4fc2889658ed8cee44461c0b0a8 RELEASE_200
|
||||||
|
7c6747c82b167368344a238b1a3a87c2a4fa6a18 RELEASE_306
|
||||||
|
95c558f81a0b8d5bb2bede4c8208bb84ae7d1e58 RELEASE_303
|
||||||
a1c61174f54aac714f59ac20fcba839d71e64c5c RELEASE_292
|
a1c61174f54aac714f59ac20fcba839d71e64c5c RELEASE_292
|
||||||
a916a2fe22de45167d25abcb40008315f415221c RELEASE_201
|
a916a2fe22de45167d25abcb40008315f415221c RELEASE_201
|
||||||
a935d577fc7dd9c2c87761c9c702805da6ce1e51 RELEASE_193
|
a935d577fc7dd9c2c87761c9c702805da6ce1e51 RELEASE_193
|
||||||
b0353253b0b3d062eb5adb50d4b665a96620da45 RELEASE_195
|
b0353253b0b3d062eb5adb50d4b665a96620da45 RELEASE_195
|
||||||
b82ef51896199484afe5b0553af7d1e59b7ce428 BRANCHPOINT_FOR_upx2.hg
|
b82ef51896199484afe5b0553af7d1e59b7ce428 BRANCHPOINT_FOR_upx2.hg
|
||||||
c2e0cd4d621b047f254f2def42132a03683ff52c RELEASE_192
|
c2e0cd4d621b047f254f2def42132a03683ff52c RELEASE_192
|
||||||
|
c9a983b7da9d4a2311f74366478348412cac2986 RELEASE_305
|
||||||
d276aa09033c24d0981bc3f4fee5628aecc988ad RELEASE_290
|
d276aa09033c24d0981bc3f4fee5628aecc988ad RELEASE_290
|
||||||
eb1ce56dce7dd1835964362470610925963b9043 RELEASE_110
|
eb1ce56dce7dd1835964362470610925963b9043 RELEASE_110
|
||||||
ed96891ef795bceec6b7ff3ca1ca7764431bfb39 RELEASE_191
|
ed96891ef795bceec6b7ff3ca1ca7764431bfb39 RELEASE_191
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2010 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ dos/exe
|
|||||||
watcom/le
|
watcom/le
|
||||||
---------
|
---------
|
||||||
* 16-bit selector alias fixups
|
* 16-bit selector alias fixups
|
||||||
* 16-bit offset relocation for objects larger than 4 kB
|
* 16-bit offset relocation for objects larger than 4 KiB
|
||||||
* 16:16 fixups
|
* 16:16 fixups
|
||||||
|
|
||||||
If you need any of the above (they're very rare), send us an URL of a
|
If you need any of the above (they're very rare), send us an URL of a
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#
|
#
|
||||||
# UPX toplevel Makefile - needs GNU make 3.81 or better
|
# UPX toplevel Makefile - needs GNU make 3.81 or better
|
||||||
#
|
#
|
||||||
|
# Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
MAKEFLAGS += -rR
|
MAKEFLAGS += -rR
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
@@ -36,13 +38,5 @@ endif
|
|||||||
$(MAKE) -C doc $@
|
$(MAKE) -C doc $@
|
||||||
|
|
||||||
|
|
||||||
ifneq ($(wildcard .hg/.),)
|
|
||||||
# automatically generate ChangeLog from local Mercurial repo
|
|
||||||
ChangeLog:
|
|
||||||
hg log --style=changelog > $@
|
|
||||||
.PHONY: ChangeLog
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: default all mostlyclean clean distclean maintainer-clean
|
.PHONY: default all mostlyclean clean distclean maintainer-clean
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,39 @@
|
|||||||
User visible changes for UPX
|
User visible changes for UPX
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
|
Changes in 3.07 (08 Sep 2010):
|
||||||
|
* win32/pe: fixed relocation handling for files with *no* TLS callbacks
|
||||||
|
[severe bug introduced in 3.06]
|
||||||
|
|
||||||
|
Changes in 3.06 (04 Sep 2010):
|
||||||
|
* win32/pe: TLS callback support contributed by Stefan Widmann. Thanks!
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.05 (27 Apr 2010):
|
||||||
|
* i386-linux and amd64-linux support shared libraries (DT_INIT must
|
||||||
|
exist, all info needed by runtime loader must be first in .text, etc.)
|
||||||
|
* Linux /proc/self/exe now is preserved by default, by leaving behind
|
||||||
|
one page. New compress-time option --unmap-all-pages is available.
|
||||||
|
* Withdraw support for shared libraries on Darwin (Apple Mac OS X)
|
||||||
|
because upx does not understand enough about .dylib.
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.04 (27 Sep 2009):
|
||||||
|
* new format Mach/AMD64 supports 64-bit programs on Apple Macintosh.
|
||||||
|
* new formats Dylib/i386 and Dylib/ppc32 support shared libraries
|
||||||
|
[such as browser plugins] on Darwin (Apple Macintosh). An existing
|
||||||
|
-init function (LC_ROUTINES command) is required.
|
||||||
|
* new format vmlinuz/armel for Debian NSLU2 (etc.) linux kernel
|
||||||
|
* bvmlinuz boot protocol 2.08 for 386 Linux kernel
|
||||||
|
* Extended ABI version 4 for armel-eabi ARM Linux ELF
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.03 (27 Apr 2008):
|
||||||
|
* implement cache flushing for PowerPC (esp. model 440)
|
||||||
|
* fix cache flushing on MIPS (>3 MiB compressed, or with holes)
|
||||||
|
* fix MIPS big-endian
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
Changes in 3.02 (16 Dec 2007):
|
Changes in 3.02 (16 Dec 2007):
|
||||||
* fix unmapping on arm-linux.elf
|
* fix unmapping on arm-linux.elf
|
||||||
* fix error checking in mmap for i386-linux.elf [triggered by -fPIE]
|
* fix error checking in mmap for i386-linux.elf [triggered by -fPIE]
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2010 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2010 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
@@ -108,9 +108,9 @@ THE FUTURE
|
|||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
|
|
||||||
This program may be used freely, and you are welcome to
|
This program may be used freely, and you are welcome to
|
||||||
redistribute it under certain conditions.
|
redistribute it under certain conditions.
|
||||||
@@ -128,8 +128,8 @@ Share and enjoy,
|
|||||||
Markus & Laszlo
|
Markus & Laszlo
|
||||||
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2010 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-5
@@ -69,7 +69,7 @@ Tools needed to build/modify the UPX sources
|
|||||||
- A C++ compiler supporting inner classes, templates, exceptions
|
- A C++ compiler supporting inner classes, templates, exceptions
|
||||||
and RTTI.
|
and RTTI.
|
||||||
|
|
||||||
- GNU make 3.80 or better (GNU make 3.81 recommened).
|
- GNU make 3.81 or better
|
||||||
|
|
||||||
|
|
||||||
To compile the packer sources
|
To compile the packer sources
|
||||||
@@ -94,14 +94,11 @@ To compile the packer sources
|
|||||||
If you want to modify the stub sources you'll also need
|
If you want to modify the stub sources you'll also need
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
|
||||||
- GNU make 3.81 or better
|
|
||||||
http://savannah.gnu.org/projects/make/
|
|
||||||
|
|
||||||
- Perl & Python
|
- Perl & Python
|
||||||
|
|
||||||
- A number of cross-assemblers and cross-compilers - precompiled
|
- A number of cross-assemblers and cross-compilers - precompiled
|
||||||
binaries for i386-linux hosts are available from
|
binaries for i386-linux hosts are available from
|
||||||
http://sourceforge.net/project/showfiles.php?group_id=2331
|
http://sourceforge.net/projects/upx/files/upx-tools/20060823/
|
||||||
|
|
||||||
|
|
||||||
Misc. notes
|
Misc. notes
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2010 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
@@ -53,6 +53,8 @@ Ralph Roth <RalphRoth@gmx.net>
|
|||||||
for reporting several bugs
|
for reporting several bugs
|
||||||
Salvador Eduardo Tropea
|
Salvador Eduardo Tropea
|
||||||
for beta testing
|
for beta testing
|
||||||
|
Stefan Widmann
|
||||||
|
for the win32/pe TLS callback support
|
||||||
The WINE project (http://www.winehq.com/)
|
The WINE project (http://www.winehq.com/)
|
||||||
for lots of useful information found in their PE loader sources
|
for lots of useful information found in their PE loader sources
|
||||||
Natascha
|
Natascha
|
||||||
|
|||||||
+24
-13
@@ -1,5 +1,5 @@
|
|||||||
Decompressing ELF Directly to Memory on Linux/x86
|
Decompressing ELF Directly to Memory on Linux/x86
|
||||||
Copyright (C) 2000-2007 John F. Reiser jreiser@BitWagon.com
|
Copyright (C) 2000-2010 John F. Reiser jreiser@BitWagon.com
|
||||||
|
|
||||||
References:
|
References:
|
||||||
<elf.h> definitions for the ELF file format
|
<elf.h> definitions for the ELF file format
|
||||||
@@ -46,8 +46,8 @@ may not be used to take the address of a function.
|
|||||||
|
|
||||||
The address 0x00400000 was chosen to be out of the way of the usual
|
The address 0x00400000 was chosen to be out of the way of the usual
|
||||||
load address 0x08048000, and to minimize fragmentation in kernel
|
load address 0x08048000, and to minimize fragmentation in kernel
|
||||||
page tables; one page of page tables covers 4MB. The address
|
page tables; one page of page tables covers 4 MiB. The address
|
||||||
0x00401000 was chosen as 1 page up from a 64KB boundary, to
|
0x00401000 was chosen as 1 page up from a 64 KiB boundary, to
|
||||||
make the startup code and its constants smaller.
|
make the startup code and its constants smaller.
|
||||||
|
|
||||||
Decompression of the executable begins by decompressing the Elf32_Ehdr
|
Decompression of the executable begins by decompressing the Elf32_Ehdr
|
||||||
@@ -64,16 +64,27 @@ assuming that its automatic stack variables are initialized to zero),
|
|||||||
and remove (all but 4 bytes of) the decompression program (and
|
and remove (all but 4 bytes of) the decompression program (and
|
||||||
compressed executable) from the address space.
|
compressed executable) from the address space.
|
||||||
|
|
||||||
Because the UPX runtime stub removes all traces of the compressed file
|
As of upx-3.05, by default on Linux, upon decompression then one page
|
||||||
from the address space, then the Linux kernel erases the symlink
|
of the compressed executable remains mapped into the address space
|
||||||
/proc/self/exe. Linux stores the pathname argument that was specified
|
of the process. If all of the pages of the compressed executable are
|
||||||
to execve() immediately after the '\0' which terminates the character
|
unmapped, then the Linux kernel erases the symlink /proc/self/exe,
|
||||||
string of the last environment variable [as of execve()]. This is true
|
and this can cause trouble for the runtime shared library loader
|
||||||
for at least all Linux 2.6, 2.4, and 2.2 kernels. The pathname is not
|
expanding $ORIGIN in -rpath, or for application code that relies on
|
||||||
"bound" to the file as strongly as /proc/self/exe (the file may be changed
|
/proc/self/exe. Use the compress-time command-line option
|
||||||
without affecting the pathname), but the pathname does provide some
|
--unmap-all-pages to achieve that effect at run time. Upx-3.04
|
||||||
information. The pathname may be relative to the working directory,
|
and previous versions did this by default with no option. However,
|
||||||
so look before any chdir().
|
too much other software erroneously assumes that /proc/self/exe
|
||||||
|
always exists.
|
||||||
|
|
||||||
|
Linux stores the pathname argument that was specified to execve()
|
||||||
|
immediately after the '\0' which terminates the character string of the
|
||||||
|
last environment variable [as of execve()]. This is true for at least
|
||||||
|
all Linux 2.6, 2.4, and 2.2 kernels. Linux kernel 2.6.29 and later
|
||||||
|
records a pointer to that character string in Elf32_auxv[AT_EXECFN].
|
||||||
|
The pathname is not "bound" to the file as strongly as /proc/self/exe
|
||||||
|
(the file may be changed without affecting the pathname), but the
|
||||||
|
pathname does provide some information. The pathname may be relative
|
||||||
|
to the working directory, so look before any chdir().
|
||||||
|
|
||||||
The Elf formats for Linux add an environment variable named " " [three
|
The Elf formats for Linux add an environment variable named " " [three
|
||||||
spaces] which saves the results of readlink("/proc/self/exe",,) before
|
spaces] which saves the results of readlink("/proc/self/exe",,) before
|
||||||
|
|||||||
+2
-2
@@ -108,14 +108,14 @@ then skip another one - the unfiltering process needs some information
|
|||||||
to be able to reverse the filtering.
|
to be able to reverse the filtering.
|
||||||
|
|
||||||
UPX uses the following idea, which works nicely. First we assume that
|
UPX uses the following idea, which works nicely. First we assume that
|
||||||
the size of the area that should be filtered is less than 16MB. Then
|
the size of the area that should be filtered is less than 16 MiB. Then
|
||||||
UPX scans over this area and keeps a record of the bytes that are
|
UPX scans over this area and keeps a record of the bytes that are
|
||||||
following the 0xE8 bytes. If we are lucky, there will be bytes that
|
following the 0xE8 bytes. If we are lucky, there will be bytes that
|
||||||
were not found following 0xE8. These bytes are our candidates to be
|
were not found following 0xE8. These bytes are our candidates to be
|
||||||
used as markers.
|
used as markers.
|
||||||
|
|
||||||
Do you still remember that we assumed that the size of scanned area is
|
Do you still remember that we assumed that the size of scanned area is
|
||||||
less than 16MB? Well, this means that when we process a real call, the
|
less than 16 MiB? Well, this means that when we process a real call, the
|
||||||
resulting offset will be less than 0x00FFFFFF too. So the MSB is always
|
resulting offset will be less than 0x00FFFFFF too. So the MSB is always
|
||||||
0x00. Which is a nice place to store our marker. Of course we should
|
0x00. Which is a nice place to store our marker. Of course we should
|
||||||
reverse the byte order in the resulting offset - so this marker will
|
reverse the byte order in the resulting offset - so this marker will
|
||||||
|
|||||||
+14
-14
@@ -13,7 +13,7 @@ B<upx> S<[ I<command> ]> S<[ I<options> ]> I<filename>...
|
|||||||
=head1 ABSTRACT
|
=head1 ABSTRACT
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2007 Markus Oberhumer, Laszlo Molnar & John Reiser
|
Copyright (c) 1996-2010 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
http://upx.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
@@ -51,8 +51,8 @@ B<UPX> is a versatile executable packer with the following features:
|
|||||||
- excellent compression ratio: compresses better than zip/gzip,
|
- excellent compression ratio: compresses better than zip/gzip,
|
||||||
use UPX to decrease the size of your distribution !
|
use UPX to decrease the size of your distribution !
|
||||||
|
|
||||||
- very fast decompression: about 10 MB/sec on an ancient Pentium 133,
|
- very fast decompression: about 10 MiB/sec on an ancient Pentium 133,
|
||||||
about 200 MB/sec on an Athlon XP 2000+.
|
about 200 MiB/sec on an Athlon XP 2000+.
|
||||||
|
|
||||||
- no memory overhead for your compressed executables for most of the
|
- no memory overhead for your compressed executables for most of the
|
||||||
supported formats
|
supported formats
|
||||||
@@ -153,7 +153,7 @@ as compared to the first decompressed version.]
|
|||||||
|
|
||||||
B<UPX> offers ten different compression levels from B<-1> to B<-9>,
|
B<UPX> offers ten different compression levels from B<-1> to B<-9>,
|
||||||
and B<--best>. The default compression level is B<-8> for files
|
and B<--best>. The default compression level is B<-8> for files
|
||||||
smaller than 512 kB, and B<-7> otherwise.
|
smaller than 512 KiB, and B<-7> otherwise.
|
||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
@@ -349,7 +349,7 @@ Extra options available for this executable format:
|
|||||||
First of all, it is recommended to use B<UPX> *instead* of B<strip>. strip has
|
First of all, it is recommended to use B<UPX> *instead* of B<strip>. strip has
|
||||||
the very bad habit of replacing your stub with its own (outdated) version.
|
the very bad habit of replacing your stub with its own (outdated) version.
|
||||||
Additionally B<UPX> corrects a bug/feature in strip v2.8.x: it
|
Additionally B<UPX> corrects a bug/feature in strip v2.8.x: it
|
||||||
will fix the 4 KByte alignment of the stub.
|
will fix the 4 KiB alignment of the stub.
|
||||||
|
|
||||||
B<UPX> includes the full functionality of stubify. This means it will
|
B<UPX> includes the full functionality of stubify. This means it will
|
||||||
automatically stubify your COFF files. Use the option B<--coff> to
|
automatically stubify your COFF files. Use the option B<--coff> to
|
||||||
@@ -660,8 +660,8 @@ Specific drawbacks:
|
|||||||
|
|
||||||
- Because of temporary decompression to disk the decompression speed
|
- Because of temporary decompression to disk the decompression speed
|
||||||
is not as fast as with the other executable formats. Still, I can see
|
is not as fast as with the other executable formats. Still, I can see
|
||||||
no noticeable delay when starting programs like my ~3 MB emacs (which
|
no noticeable delay when starting programs like my ~3 MiB emacs (which
|
||||||
is less than 1 MB when compressed :-).
|
is less than 1 MiB when compressed :-).
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
|
|
||||||
@@ -681,7 +681,7 @@ nostalgic feelings of one of the authors.
|
|||||||
Packed programs will be byte-identical to the original after uncompression,
|
Packed programs will be byte-identical to the original after uncompression,
|
||||||
until further notice.
|
until further notice.
|
||||||
|
|
||||||
Maximum uncompressed size: ~1.89 / ~7.60 Mbytes.
|
Maximum uncompressed size: ~1.89 / ~7.60 MiB.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
@@ -708,7 +708,7 @@ Extra options available for this executable format:
|
|||||||
|
|
||||||
--8-bit Uses 8 bit size compression [default: 32 bit]
|
--8-bit Uses 8 bit size compression [default: 32 bit]
|
||||||
|
|
||||||
--8mb-ram PSone has 8 MB ram available [default: 2 MB]
|
--8mib-ram PSone has 8 MiB ram available [default: 2 MiB]
|
||||||
|
|
||||||
--boot-only This format is for main exes and CD-Mastering only !
|
--boot-only This format is for main exes and CD-Mastering only !
|
||||||
It may slightly improve the compression ratio,
|
It may slightly improve the compression ratio,
|
||||||
@@ -838,7 +838,7 @@ must end with ".scr" (as screensavers are handled slightly different
|
|||||||
than normal exe files).
|
than normal exe files).
|
||||||
|
|
||||||
UPX compressed PE files have some minor memory overhead (usually in the
|
UPX compressed PE files have some minor memory overhead (usually in the
|
||||||
10 - 30 kbytes range) which can be seen by specifying the "-i" command
|
10 - 30 KiB range) which can be seen by specifying the "-i" command
|
||||||
line switch during compression.
|
line switch during compression.
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
@@ -933,13 +933,13 @@ Please report all bugs immediately to the authors.
|
|||||||
|
|
||||||
=head1 COPYRIGHT
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
|
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
|
|
||||||
Copyright (C) 2002-2007 Jens Medoch
|
Copyright (C) 2002-2010 Jens Medoch
|
||||||
|
|
||||||
This program may be used freely, and you are welcome to
|
This program may be used freely, and you are welcome to
|
||||||
redistribute it under certain conditions.
|
redistribute it under certain conditions.
|
||||||
|
|||||||
+7
-4
@@ -1,6 +1,8 @@
|
|||||||
#
|
#
|
||||||
# UPX Makefile - needs GNU make 3.81 or better
|
# UPX Makefile - needs GNU make 3.81 or better
|
||||||
#
|
#
|
||||||
|
# Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
MAKEFLAGS += -rR
|
MAKEFLAGS += -rR
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
@@ -36,8 +38,9 @@ CXXFLAGS += -O0 -g
|
|||||||
else
|
else
|
||||||
CXXFLAGS += -O2
|
CXXFLAGS += -O2
|
||||||
endif
|
endif
|
||||||
CXXFLAGS += -Wall -W -Wcast-align -Wcast-qual -Wpointer-arith -Wwrite-strings -Werror
|
CXXFLAGS_WERROR = -Werror
|
||||||
##CXXFLAGS += -Wshadow
|
CXXFLAGS += -Wall -W -Wcast-align -Wcast-qual -Wpointer-arith -Wshadow -Wwrite-strings
|
||||||
|
CXXFLAGS += $(CXXFLAGS_WERROR)
|
||||||
endif
|
endif
|
||||||
CPPFLAGS += $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
|
CPPFLAGS += $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
|
||||||
CXXLD ?= $(CXX)
|
CXXLD ?= $(CXX)
|
||||||
@@ -46,7 +49,7 @@ exeext ?= .out
|
|||||||
libext ?= .a
|
libext ?= .a
|
||||||
objext ?= .o
|
objext ?= .o
|
||||||
|
|
||||||
upx_SOURCES := $(wildcard $(srcdir)/*.cpp)
|
upx_SOURCES := $(sort $(wildcard $(srcdir)/*.cpp))
|
||||||
upx_OBJECTS := $(notdir $(upx_SOURCES:.cpp=$(objext)))
|
upx_OBJECTS := $(notdir $(upx_SOURCES:.cpp=$(objext)))
|
||||||
|
|
||||||
# we need UCL and zlib - you can set envvar UPX_UCLDIR
|
# we need UCL and zlib - you can set envvar UPX_UCLDIR
|
||||||
@@ -74,7 +77,7 @@ upx$(exeext): $(upx_OBJECTS) $(upx_DEPENDENCIES)
|
|||||||
%.o : %.cpp | .depend
|
%.o : %.cpp | .depend
|
||||||
$(strip $(CXX) $(call e,CPPFLAGS) $(call e,CXXFLAGS) -o $@ -c $<)
|
$(strip $(CXX) $(call e,CPPFLAGS) $(call e,CXXFLAGS) -o $@ -c $<)
|
||||||
|
|
||||||
.depend: $(wildcard $(srcdir)/*.cpp $(srcdir)/*.h) $(MAKEFILE_LIST)
|
.depend: $(sort $(wildcard $(srcdir)/*.cpp $(srcdir)/*.h)) $(MAKEFILE_LIST)
|
||||||
@rm -f $@
|
@rm -f $@
|
||||||
ifeq ($(USE_GNUC),1)
|
ifeq ($(USE_GNUC),1)
|
||||||
@echo "Updating $@"
|
@echo "Updating $@"
|
||||||
|
|||||||
+27
-45
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_BELE_H
|
#ifndef __UPX_BELE_H
|
||||||
#define __UPX_BELE_H
|
#define __UPX_BELE_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -282,12 +282,12 @@ inline unsigned acc_swap32p(const acc_uint32e_t *p)
|
|||||||
|
|
||||||
inline void acc_swab16s(acc_uint16e_t *p)
|
inline void acc_swab16s(acc_uint16e_t *p)
|
||||||
{
|
{
|
||||||
*p = acc_swab16(*p);
|
*p = (acc_uint16e_t) acc_swab16(*p);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void acc_swab32s(acc_uint32e_t *p)
|
inline void acc_swab32s(acc_uint32e_t *p)
|
||||||
{
|
{
|
||||||
*p = acc_swab32(*p);
|
*p = (acc_uint32e_t) acc_swab32(*p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -313,8 +313,7 @@ inline void acc_ua_swab32s(void *p)
|
|||||||
// to have gcc bug 17519 fixed - see http://gcc.gnu.org/PR17519 ]
|
// to have gcc bug 17519 fixed - see http://gcc.gnu.org/PR17519 ]
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
struct BE16
|
__packed_struct(BE16)
|
||||||
{
|
|
||||||
unsigned char d[2];
|
unsigned char d[2];
|
||||||
|
|
||||||
//inline BE16() { }
|
//inline BE16() { }
|
||||||
@@ -332,12 +331,10 @@ struct BE16
|
|||||||
BE16& operator >>= (unsigned v) { set_be16(d, get_be16(d) >> v); return *this; }
|
BE16& operator >>= (unsigned v) { set_be16(d, get_be16(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_be16(d); }
|
operator unsigned () const { return get_be16(d); }
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
struct BE32
|
__packed_struct(BE32)
|
||||||
{
|
|
||||||
unsigned char d[4];
|
unsigned char d[4];
|
||||||
|
|
||||||
//inline BE32() { }
|
//inline BE32() { }
|
||||||
@@ -355,12 +352,10 @@ struct BE32
|
|||||||
BE32& operator >>= (unsigned v) { set_be32(d, get_be32(d) >> v); return *this; }
|
BE32& operator >>= (unsigned v) { set_be32(d, get_be32(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_be32(d); }
|
operator unsigned () const { return get_be32(d); }
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
struct BE64
|
__packed_struct(BE64)
|
||||||
{
|
|
||||||
unsigned char d[8];
|
unsigned char d[8];
|
||||||
|
|
||||||
//inline BE64() { }
|
//inline BE64() { }
|
||||||
@@ -378,12 +373,10 @@ struct BE64
|
|||||||
BE64& operator >>= (unsigned v) { set_be64(d, get_be64(d) >> v); return *this; }
|
BE64& operator >>= (unsigned v) { set_be64(d, get_be64(d) >> v); return *this; }
|
||||||
|
|
||||||
operator acc_uint64l_t () const { return get_be64(d); }
|
operator acc_uint64l_t () const { return get_be64(d); }
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
struct LE16
|
__packed_struct(LE16)
|
||||||
{
|
|
||||||
unsigned char d[2];
|
unsigned char d[2];
|
||||||
|
|
||||||
//inline LE16() { }
|
//inline LE16() { }
|
||||||
@@ -401,12 +394,10 @@ struct LE16
|
|||||||
LE16& operator >>= (unsigned v) { set_le16(d, get_le16(d) >> v); return *this; }
|
LE16& operator >>= (unsigned v) { set_le16(d, get_le16(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_le16(d); }
|
operator unsigned () const { return get_le16(d); }
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
struct LE32
|
__packed_struct(LE32)
|
||||||
{
|
|
||||||
unsigned char d[4];
|
unsigned char d[4];
|
||||||
|
|
||||||
//inline LE32() { }
|
//inline LE32() { }
|
||||||
@@ -424,12 +415,10 @@ struct LE32
|
|||||||
LE32& operator >>= (unsigned v) { set_le32(d, get_le32(d) >> v); return *this; }
|
LE32& operator >>= (unsigned v) { set_le32(d, get_le32(d) >> v); return *this; }
|
||||||
|
|
||||||
operator unsigned () const { return get_le32(d); }
|
operator unsigned () const { return get_le32(d); }
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
struct LE64
|
__packed_struct(LE64)
|
||||||
{
|
|
||||||
unsigned char d[8];
|
unsigned char d[8];
|
||||||
|
|
||||||
//inline LE64() { }
|
//inline LE64() { }
|
||||||
@@ -447,8 +436,7 @@ struct LE64
|
|||||||
LE64& operator >>= (unsigned v) { set_le64(d, get_le64(d) >> v); return *this; }
|
LE64& operator >>= (unsigned v) { set_le64(d, get_le64(d) >> v); return *this; }
|
||||||
|
|
||||||
operator acc_uint64l_t () const { return get_le64(d); }
|
operator acc_uint64l_t () const { return get_le64(d); }
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -555,7 +543,7 @@ int __acc_cdecl_qsort le64_compare_signed(const void *, const void *);
|
|||||||
|
|
||||||
|
|
||||||
// just for testing...
|
// just for testing...
|
||||||
#if !defined(ACC_CFG_NO_UNALIGNED)
|
#if !(ACC_CFG_NO_UNALIGNED)
|
||||||
#if 0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386) && (ACC_CC_GNUC >= 0x030200)
|
#if 0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386) && (ACC_CC_GNUC >= 0x030200)
|
||||||
typedef acc_uint16e_t LE16_unaligned __attribute__((__aligned__(1)));
|
typedef acc_uint16e_t LE16_unaligned __attribute__((__aligned__(1)));
|
||||||
typedef acc_uint32e_t LE32_unaligned __attribute__((__aligned__(1)));
|
typedef acc_uint32e_t LE32_unaligned __attribute__((__aligned__(1)));
|
||||||
@@ -591,7 +579,7 @@ int __acc_cdecl_qsort le64_compare_signed(const void *, const void *);
|
|||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// Provide namespaces and classes to abtract endianness policies.
|
// Provide namespaces and classes to abstract endianness policies.
|
||||||
//
|
//
|
||||||
// CTP - Compile-Time Polymorphism (templates)
|
// CTP - Compile-Time Polymorphism (templates)
|
||||||
// RTP - Run-Time Polymorphism (virtual functions)
|
// RTP - Run-Time Polymorphism (virtual functions)
|
||||||
@@ -599,13 +587,13 @@ int __acc_cdecl_qsort le64_compare_signed(const void *, const void *);
|
|||||||
|
|
||||||
// forward declarations
|
// forward declarations
|
||||||
namespace N_BELE_CTP {
|
namespace N_BELE_CTP {
|
||||||
class BEPolicy; class LEPolicy;
|
struct BEPolicy; struct LEPolicy;
|
||||||
extern const BEPolicy be_policy;
|
extern const BEPolicy be_policy;
|
||||||
extern const LEPolicy le_policy;
|
extern const LEPolicy le_policy;
|
||||||
}
|
}
|
||||||
namespace N_BELE_RTP {
|
namespace N_BELE_RTP {
|
||||||
class AbstractPolicy;
|
struct AbstractPolicy;
|
||||||
class BEPolicy; class LEPolicy;
|
struct BEPolicy; struct LEPolicy;
|
||||||
extern const BEPolicy be_policy;
|
extern const BEPolicy be_policy;
|
||||||
extern const LEPolicy le_policy;
|
extern const LEPolicy le_policy;
|
||||||
}
|
}
|
||||||
@@ -623,16 +611,10 @@ namespace N_BELE_RTP {
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace N_BELE_CTP {
|
namespace N_BELE_CTP {
|
||||||
|
inline const N_BELE_RTP::AbstractPolicy* getRTP(const BEPolicy*)
|
||||||
template <class T>
|
{ return &N_BELE_RTP::be_policy; }
|
||||||
inline const N_BELE_RTP::AbstractPolicy* getRTP();
|
inline const N_BELE_RTP::AbstractPolicy* getRTP(const LEPolicy*)
|
||||||
template <>
|
{ return &N_BELE_RTP::le_policy; }
|
||||||
inline const N_BELE_RTP::AbstractPolicy* getRTP<BEPolicy>()
|
|
||||||
{ return &N_BELE_RTP::be_policy; }
|
|
||||||
template <>
|
|
||||||
inline const N_BELE_RTP::AbstractPolicy* getRTP<LEPolicy>()
|
|
||||||
{ return &N_BELE_RTP::le_policy; }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
// CTP - Compile-Time Polymorphism (templates)
|
// CTP - Compile-Time Polymorphism (templates)
|
||||||
# define V static inline
|
# define V static inline
|
||||||
# define S static int __acc_cdecl_qsort
|
# define S static int __acc_cdecl_qsort
|
||||||
# define C
|
# define C /*empty*/
|
||||||
#elif defined(BELE_RTP)
|
#elif defined(BELE_RTP)
|
||||||
// RTP - Run-Time Polymorphism (virtual functions)
|
// RTP - Run-Time Polymorphism (virtual functions)
|
||||||
# define V virtual
|
# define V virtual
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_BPTR_H
|
#ifndef __UPX_BPTR_H
|
||||||
#define __UPX_BPTR_H
|
#define __UPX_BPTR_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
|
||||||
#if defined(USE_CONSOLE)
|
#if (USE_CONSOLE)
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
|
|||||||
+7
-7
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
FILE *con_term = NULL;
|
FILE *con_term = NULL;
|
||||||
|
|
||||||
#if defined(USE_CONSOLE)
|
#if (USE_CONSOLE)
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
@@ -84,14 +84,14 @@ static int do_init(FILE *f)
|
|||||||
if (!acc_isatty(STDIN_FILENO) || !acc_isatty(STDOUT_FILENO) || !acc_isatty(STDERR_FILENO))
|
if (!acc_isatty(STDIN_FILENO) || !acc_isatty(STDOUT_FILENO) || !acc_isatty(STDERR_FILENO))
|
||||||
return con_mode;
|
return con_mode;
|
||||||
|
|
||||||
#if defined(USE_ANSI)
|
#if (USE_ANSI)
|
||||||
try_init(&console_ansi_mono,f);
|
try_init(&console_ansi_mono,f);
|
||||||
try_init(&console_ansi_color,f);
|
try_init(&console_ansi_color,f);
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_SCREEN)
|
#if (USE_SCREEN)
|
||||||
try_init(&console_screen,f);
|
try_init(&console_screen,f);
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_AALIB)
|
#if (USE_AALIB)
|
||||||
try_init(&console_aalib,f);
|
try_init(&console_aalib,f);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
|
||||||
#if defined(USE_CONSOLE)
|
#if (USE_CONSOLE)
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
|
|||||||
+8
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
|
||||||
#if defined(USE_SCREEN)
|
#if (USE_SCREEN)
|
||||||
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
|
||||||
@@ -130,15 +130,15 @@ static int init(FILE *f, int o, int now)
|
|||||||
if (!screen)
|
if (!screen)
|
||||||
screen = do_construct(screen_djgpp2_construct(),fd);
|
screen = do_construct(screen_djgpp2_construct(),fd);
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_SCREEN_WIN32)
|
#if (USE_SCREEN_WIN32)
|
||||||
if (!screen)
|
if (!screen)
|
||||||
screen = do_construct(screen_win32_construct(),fd);
|
screen = do_construct(screen_win32_construct(),fd);
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_SCREEN_VCSA)
|
#if (USE_SCREEN_VCSA)
|
||||||
if (!screen)
|
if (!screen)
|
||||||
screen = do_construct(screen_vcsa_construct(),fd);
|
screen = do_construct(screen_vcsa_construct(),fd);
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_SCREEN_CURSES)
|
#if (USE_SCREEN_CURSES)
|
||||||
if (!screen && o == CON_SCREEN)
|
if (!screen && o == CON_SCREEN)
|
||||||
screen = do_construct(screen_curses_construct(),fd);
|
screen = do_construct(screen_curses_construct(),fd);
|
||||||
#endif
|
#endif
|
||||||
@@ -298,7 +298,7 @@ static void print0(FILE *f, const char *ss)
|
|||||||
static bool intro(FILE *f)
|
static bool intro(FILE *f)
|
||||||
{
|
{
|
||||||
UNUSED(f);
|
UNUSED(f);
|
||||||
#if defined(USE_FRAMES)
|
#if (USE_FRAMES)
|
||||||
if (screen->intro)
|
if (screen->intro)
|
||||||
return screen->intro(screen,screen_show_frames);
|
return screen->intro(screen,screen_show_frames);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+15
-15
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ unsigned upx_adler32(const void *buf, unsigned len, unsigned adler)
|
|||||||
assert(buf != NULL);
|
assert(buf != NULL);
|
||||||
#if 0
|
#if 0
|
||||||
return adler32(adler, (const Bytef *) buf, len); // zlib
|
return adler32(adler, (const Bytef *) buf, len); // zlib
|
||||||
#elif defined(WITH_UCL)
|
#elif (WITH_UCL)
|
||||||
return ucl_adler32(adler, (const ucl_bytep) buf, len);
|
return ucl_adler32(adler, (const ucl_bytep) buf, len);
|
||||||
#else
|
#else
|
||||||
# error
|
# error
|
||||||
@@ -59,7 +59,7 @@ unsigned upx_crc32(const void *buf, unsigned len, unsigned crc)
|
|||||||
assert(buf != NULL);
|
assert(buf != NULL);
|
||||||
#if 0
|
#if 0
|
||||||
return crc32(crc, (const Bytef *) buf, len); // zlib
|
return crc32(crc, (const Bytef *) buf, len); // zlib
|
||||||
#elif defined(WITH_UCL)
|
#elif (WITH_UCL)
|
||||||
return ucl_crc32(crc, (const ucl_bytep) buf, len);
|
return ucl_crc32(crc, (const ucl_bytep) buf, len);
|
||||||
#else
|
#else
|
||||||
# error
|
# error
|
||||||
@@ -108,17 +108,17 @@ int upx_compress ( const upx_bytep src, unsigned src_len,
|
|||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
}
|
}
|
||||||
#if defined(WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
else if (M_IS_LZMA(method))
|
else if (M_IS_LZMA(method))
|
||||||
r = upx_lzma_compress(src, src_len, dst, dst_len,
|
r = upx_lzma_compress(src, src_len, dst, dst_len,
|
||||||
cb, method, level, cconf, cresult);
|
cb, method, level, cconf, cresult);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_NRV)
|
#if (WITH_NRV)
|
||||||
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
r = upx_nrv_compress(src, src_len, dst, dst_len,
|
r = upx_nrv_compress(src, src_len, dst, dst_len,
|
||||||
cb, method, level, cconf, cresult);
|
cb, method, level, cconf, cresult);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if (WITH_UCL)
|
||||||
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
r = upx_ucl_compress(src, src_len, dst, dst_len,
|
r = upx_ucl_compress(src, src_len, dst, dst_len,
|
||||||
cb, method, level, cconf, cresult);
|
cb, method, level, cconf, cresult);
|
||||||
@@ -154,19 +154,19 @@ int upx_decompress ( const upx_bytep src, unsigned src_len,
|
|||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
}
|
}
|
||||||
#if defined(WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
else if (M_IS_LZMA(method))
|
else if (M_IS_LZMA(method))
|
||||||
r = upx_lzma_decompress(src, src_len, dst, dst_len, method, cresult);
|
r = upx_lzma_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_NRV)
|
#if (WITH_NRV)
|
||||||
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
r = upx_nrv_decompress(src, src_len, dst, dst_len, method, cresult);
|
r = upx_nrv_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if (WITH_UCL)
|
||||||
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
r = upx_ucl_decompress(src, src_len, dst, dst_len, method, cresult);
|
r = upx_ucl_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_ZLIB)
|
#if (WITH_ZLIB)
|
||||||
else if (M_IS_DEFLATE(method))
|
else if (M_IS_DEFLATE(method))
|
||||||
r = upx_zlib_decompress(src, src_len, dst, dst_len, method, cresult);
|
r = upx_zlib_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
@@ -201,15 +201,15 @@ int upx_test_overlap ( const upx_bytep buf,
|
|||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
}
|
}
|
||||||
#if defined(WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
else if (M_IS_LZMA(method))
|
else if (M_IS_LZMA(method))
|
||||||
r = upx_lzma_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
r = upx_lzma_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_NRV)
|
#if (WITH_NRV)
|
||||||
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
r = upx_nrv_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
r = upx_nrv_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if (WITH_UCL)
|
||||||
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
else if (M_IS_NRV2B(method) || M_IS_NRV2D(method) || M_IS_NRV2E(method))
|
||||||
r = upx_ucl_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
r = upx_ucl_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+9
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,19 +22,19 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_COMPRESS_H
|
#ifndef __UPX_COMPRESS_H
|
||||||
#define __UPX_COMPRESS_H
|
#define __UPX_COMPRESS_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#if defined(WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
const char *upx_lzma_version_string(void);
|
const char *upx_lzma_version_string(void);
|
||||||
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned* dst_len,
|
||||||
@@ -55,7 +55,7 @@ int upx_lzma_test_overlap ( const upx_bytep buf,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(WITH_NRV)
|
#if (WITH_NRV)
|
||||||
const char *upx_nrv_version_string(void);
|
const char *upx_nrv_version_string(void);
|
||||||
int upx_nrv_compress ( const upx_bytep src, unsigned src_len,
|
int upx_nrv_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned* dst_len,
|
||||||
@@ -76,7 +76,7 @@ int upx_nrv_test_overlap ( const upx_bytep buf,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(WITH_UCL)
|
#if (WITH_UCL)
|
||||||
const char *upx_ucl_version_string(void);
|
const char *upx_ucl_version_string(void);
|
||||||
int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned* dst_len,
|
||||||
@@ -96,7 +96,8 @@ int upx_ucl_test_overlap ( const upx_bytep buf,
|
|||||||
const upx_compress_result_t *cresult );
|
const upx_compress_result_t *cresult );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WITH_ZLIB)
|
|
||||||
|
#if (WITH_ZLIB)
|
||||||
const char *upx_zlib_version_string(void);
|
const char *upx_zlib_version_string(void);
|
||||||
int upx_zlib_compress ( const upx_bytep src, unsigned src_len,
|
int upx_zlib_compress ( const upx_bytep src, unsigned src_len,
|
||||||
upx_bytep dst, unsigned* dst_len,
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
|||||||
+367
-131
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -47,10 +47,13 @@ void lzma_compress_config_t::reset()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if !defined(WITH_LZMA)
|
#if !(WITH_LZMA)
|
||||||
extern int compress_lzma_dummy;
|
extern int compress_lzma_dummy;
|
||||||
int compress_lzma_dummy = 0;
|
int compress_lzma_dummy = 0;
|
||||||
#else
|
#else
|
||||||
|
#define opt compress_lzma_opt
|
||||||
|
|
||||||
|
#undef USE_LZMA_PROPERTIES
|
||||||
|
|
||||||
|
|
||||||
// INFO: the LZMA SDK is covered by a permissive license which allows
|
// INFO: the LZMA SDK is covered by a permissive license which allows
|
||||||
@@ -90,11 +93,244 @@ int compress_lzma_dummy = 0;
|
|||||||
// while you keep LZMA SDK code unmodified.
|
// while you keep LZMA SDK code unmodified.
|
||||||
|
|
||||||
|
|
||||||
|
#if (WITH_LZMA >= 0x461)
|
||||||
|
#include "C/7zVersion.h"
|
||||||
|
#if (WITH_LZMA != (0x100 * MY_VER_MAJOR) + (0x10 * (MY_VER_MINOR / 10)) + (MY_VER_MINOR % 10))
|
||||||
|
# error "WITH_LZMA version mismatch"
|
||||||
|
#endif
|
||||||
|
#include "C/Types.h"
|
||||||
|
static void *cb_alloc(void *, size_t size) {
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
static void cb_free(void *, void *ptr) {
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// cruft because of pseudo-COM layer
|
// compress defaults
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#undef USE_LZMA_PROPERTIES
|
static int prepare(lzma_compress_result_t *res,
|
||||||
|
unsigned src_len, int method, int level,
|
||||||
|
const lzma_compress_config_t *lcconf)
|
||||||
|
{
|
||||||
|
// setup defaults
|
||||||
|
res->pos_bits = 2; // 0 .. 4
|
||||||
|
res->lit_pos_bits = 0; // 0 .. 4
|
||||||
|
res->lit_context_bits = 3; // 0 .. 8
|
||||||
|
res->dict_size = 4 * 1024 * 1024; // 1 .. 2**30
|
||||||
|
res->fast_mode = 2;
|
||||||
|
res->num_fast_bytes = 64; // 5 .. 273
|
||||||
|
res->match_finder_cycles = 0;
|
||||||
|
#if 1
|
||||||
|
res->pos_bits = lzma_compress_config_t::pos_bits_t::default_value_c;
|
||||||
|
res->lit_pos_bits = lzma_compress_config_t::lit_pos_bits_t::default_value_c;
|
||||||
|
res->lit_context_bits = lzma_compress_config_t::lit_context_bits_t::default_value_c;
|
||||||
|
res->dict_size = lzma_compress_config_t::dict_size_t::default_value_c;
|
||||||
|
res->num_fast_bytes = lzma_compress_config_t::num_fast_bytes_t::default_value_c;
|
||||||
|
#endif
|
||||||
|
// method overrides
|
||||||
|
if (method >= 0x100) {
|
||||||
|
res->pos_bits = (method >> 16) & 15;
|
||||||
|
res->lit_pos_bits = (method >> 12) & 15;
|
||||||
|
res->lit_context_bits = (method >> 8) & 15;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
// DEBUG - set sizes so that we use a maxmimum amount of stack.
|
||||||
|
// These settings cause res->num_probs == 3147574, i.e. we will
|
||||||
|
// need about 6 MiB of stack during runtime decompression.
|
||||||
|
res->lit_pos_bits = 4;
|
||||||
|
res->lit_context_bits = 8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// FIXME: tune these settings according to level
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
res->dict_size = 256 * 1024;
|
||||||
|
res->fast_mode = 0;
|
||||||
|
res->num_fast_bytes = 8;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
res->dict_size = 256 * 1024;
|
||||||
|
res->fast_mode = 0;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
res->dict_size = 8 * 1024 * 1024;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
res->dict_size = src_len;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cconf overrides
|
||||||
|
if (lcconf)
|
||||||
|
{
|
||||||
|
oassign(res->pos_bits, lcconf->pos_bits);
|
||||||
|
oassign(res->lit_pos_bits, lcconf->lit_pos_bits);
|
||||||
|
oassign(res->lit_context_bits, lcconf->lit_context_bits);
|
||||||
|
oassign(res->dict_size, lcconf->dict_size);
|
||||||
|
oassign(res->num_fast_bytes, lcconf->num_fast_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// limit dictionary size
|
||||||
|
if (res->dict_size > src_len)
|
||||||
|
res->dict_size = src_len;
|
||||||
|
|
||||||
|
// limit num_probs
|
||||||
|
if (lcconf && lcconf->max_num_probs)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
unsigned n = 1846 + (768 << (res->lit_context_bits + res->lit_pos_bits));
|
||||||
|
if (n <= lcconf->max_num_probs)
|
||||||
|
break;
|
||||||
|
if (res->lit_pos_bits > res->lit_context_bits)
|
||||||
|
{
|
||||||
|
if (res->lit_pos_bits == 0)
|
||||||
|
goto error;
|
||||||
|
res->lit_pos_bits -= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (res->lit_context_bits == 0)
|
||||||
|
goto error;
|
||||||
|
res->lit_context_bits -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res->num_probs = 1846 + (768 << (res->lit_context_bits + res->lit_pos_bits));
|
||||||
|
//printf("\nlzma_compress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// compress
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if (WITH_LZMA >= 0x461)
|
||||||
|
#define kLiteralNextStates kLiteralNextStates_enc
|
||||||
|
#include "C/LzmaEnc.h"
|
||||||
|
#include "C/LzmaEnc.c"
|
||||||
|
#include "C/LzFind.c"
|
||||||
|
#undef kLiteralNextStates
|
||||||
|
#undef kNumFullDistances
|
||||||
|
|
||||||
|
|
||||||
|
struct upx_ICompressProgress {
|
||||||
|
SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
|
||||||
|
upx_callback_p cb;
|
||||||
|
};
|
||||||
|
|
||||||
|
static SRes cb_progress(void *p, UInt64 inSize, UInt64 outSize) {
|
||||||
|
upx_callback_p cb = ((upx_ICompressProgress *) p)->cb;
|
||||||
|
if (cb && cb->nprogress)
|
||||||
|
cb->nprogress(cb, (unsigned) inSize, (unsigned) outSize);
|
||||||
|
return SZ_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
upx_callback_p cb,
|
||||||
|
int method, int level,
|
||||||
|
const upx_compress_config_t *cconf_parm,
|
||||||
|
upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
assert(M_IS_LZMA(method));
|
||||||
|
assert(level > 0); assert(cresult != NULL);
|
||||||
|
COMPILE_TIME_ASSERT(LZMA_PROPS_SIZE == 5)
|
||||||
|
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
int rh;
|
||||||
|
|
||||||
|
unsigned dst_avail = *dst_len;
|
||||||
|
*dst_len = 0;
|
||||||
|
|
||||||
|
ISzAlloc cba; cba.Alloc = cb_alloc; cba.Free = cb_free;
|
||||||
|
upx_ICompressProgress progress;
|
||||||
|
progress.Progress = cb_progress; progress.cb = cb;
|
||||||
|
|
||||||
|
const lzma_compress_config_t *lcconf = cconf_parm ? &cconf_parm->conf_lzma : NULL;
|
||||||
|
lzma_compress_result_t *res = &cresult->result_lzma;
|
||||||
|
if (prepare(res, src_len, method, level, lcconf) != 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
CLzmaEncProps props; memset(&props, 0, sizeof(props));
|
||||||
|
props.level = level;
|
||||||
|
LzmaEncProps_Init(&props);
|
||||||
|
props.pb = res->pos_bits;
|
||||||
|
props.lp = res->lit_pos_bits;
|
||||||
|
props.lc = res->lit_context_bits;
|
||||||
|
props.dictSize = res->dict_size;
|
||||||
|
props.algo = res->fast_mode ? 1 : 0;
|
||||||
|
props.fb = res->num_fast_bytes;
|
||||||
|
props.mc = res->match_finder_cycles;
|
||||||
|
|
||||||
|
unsigned char props_buf[LZMA_PROPS_SIZE];
|
||||||
|
SizeT props_buf_size; props_buf_size = LZMA_PROPS_SIZE;
|
||||||
|
|
||||||
|
#if (USE_LZMA_PROPERTIES)
|
||||||
|
if (dst_avail < 1)
|
||||||
|
goto error;
|
||||||
|
dst[0] = 0; // filled below
|
||||||
|
dst += 1; *dst_len += 1; dst_avail -= 1;
|
||||||
|
#else
|
||||||
|
if (dst_avail < 2)
|
||||||
|
goto error;
|
||||||
|
// extra stuff in first byte: 5 high bits convenience for stub decompressor
|
||||||
|
unsigned tt; tt = res->lit_context_bits + res->lit_pos_bits;
|
||||||
|
dst[0] = ((tt << 3) | res->pos_bits);
|
||||||
|
dst[1] = ((res->lit_pos_bits << 4) | (res->lit_context_bits));
|
||||||
|
dst += 2; *dst_len += 2; dst_avail -= 2;
|
||||||
|
#endif
|
||||||
|
SizeT x_len; x_len = dst_avail;
|
||||||
|
rh = LzmaEncode(dst, &x_len, src, src_len,
|
||||||
|
&props, props_buf, &props_buf_size, 0,
|
||||||
|
(ICompressProgress *) (void *) &progress, &cba, &cba);
|
||||||
|
assert(x_len <= dst_avail);
|
||||||
|
*dst_len += x_len;
|
||||||
|
if (rh == SZ_OK) {
|
||||||
|
#if (USE_LZMA_PROPERTIES)
|
||||||
|
dst[-1] = props_buf[0];
|
||||||
|
#endif
|
||||||
|
r = UPX_E_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
//printf("\nlzma_compress: %d: %u %u %u %u %u, %u - > %u\n", r, res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs, src_len, *dst_len);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (WITH_LZMA >= 0x461) */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// compress - cruft because of pseudo-COM layer
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if (WITH_LZMA < 0x461)
|
||||||
|
|
||||||
#undef MSDOS
|
#undef MSDOS
|
||||||
#undef OS2
|
#undef OS2
|
||||||
@@ -241,128 +477,25 @@ int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
|||||||
NCoderPropID::kMatchFinder // 7 mf
|
NCoderPropID::kMatchFinder // 7 mf
|
||||||
};
|
};
|
||||||
PROPVARIANT pr[8];
|
PROPVARIANT pr[8];
|
||||||
pr[0].vt = pr[1].vt = pr[2].vt = pr[3].vt = VT_UI4;
|
|
||||||
pr[4].vt = pr[5].vt = pr[6].vt = VT_UI4;
|
|
||||||
unsigned nprops = 7;
|
|
||||||
|
|
||||||
// setup defaults
|
|
||||||
pr[0].uintVal = 2; // 0 .. 4
|
|
||||||
pr[1].uintVal = 0; // 0 .. 4
|
|
||||||
pr[2].uintVal = 3; // 0 .. 8
|
|
||||||
pr[3].uintVal = 4 * 1024 * 1024; // 1 .. 2**30
|
|
||||||
pr[4].uintVal = 2;
|
|
||||||
pr[5].uintVal = 64; // 5 .. 273
|
|
||||||
pr[6].uintVal = 0;
|
|
||||||
#ifdef COMPRESS_MF_BT4
|
#ifdef COMPRESS_MF_BT4
|
||||||
|
const unsigned nprops = 8;
|
||||||
static wchar_t matchfinder[] = L"BT4";
|
static wchar_t matchfinder[] = L"BT4";
|
||||||
assert(NCompress::NLZMA::FindMatchFinder(matchfinder) >= 0);
|
assert(NCompress::NLZMA::FindMatchFinder(matchfinder) >= 0);
|
||||||
pr[nprops].vt = VT_BSTR;
|
pr[7].vt = VT_BSTR; pr[7].bstrVal = matchfinder;
|
||||||
pr[nprops].bstrVal = matchfinder;
|
#else
|
||||||
nprops++;
|
const unsigned nprops = 7;
|
||||||
#endif
|
#endif
|
||||||
#if 1
|
pr[0].vt = pr[1].vt = pr[2].vt = pr[3].vt = VT_UI4;
|
||||||
pr[0].uintVal = lzma_compress_config_t::pos_bits_t::default_value_c;
|
pr[4].vt = pr[5].vt = pr[6].vt = VT_UI4;
|
||||||
pr[1].uintVal = lzma_compress_config_t::lit_pos_bits_t::default_value_c;
|
if (prepare(res, src_len, method, level, lcconf) != 0)
|
||||||
pr[2].uintVal = lzma_compress_config_t::lit_context_bits_t::default_value_c;
|
|
||||||
pr[3].uintVal = lzma_compress_config_t::dict_size_t::default_value_c;
|
|
||||||
pr[5].uintVal = lzma_compress_config_t::num_fast_bytes_t::default_value_c;
|
|
||||||
#endif
|
|
||||||
// method overrides
|
|
||||||
if (method >= 0x100) {
|
|
||||||
pr[0].uintVal = (method >> 16) & 15;
|
|
||||||
pr[1].uintVal = (method >> 12) & 15;
|
|
||||||
pr[2].uintVal = (method >> 8) & 15;
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
// DEBUG - set sizes so that we use a maxmimum amount of stack.
|
|
||||||
// These settings cause res->num_probs == 3147574, i.e. we will
|
|
||||||
// need about 6 MB of stack during runtime decompression.
|
|
||||||
pr[1].uintVal = 4;
|
|
||||||
pr[2].uintVal = 8;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// FIXME: tune these settings according to level
|
|
||||||
switch (level)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
pr[3].uintVal = 256 * 1024;
|
|
||||||
pr[4].uintVal = 0;
|
|
||||||
pr[5].uintVal = 8;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
pr[3].uintVal = 256 * 1024;
|
|
||||||
pr[4].uintVal = 0;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
pr[3].uintVal = 8 * 1024 * 1024;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
pr[3].uintVal = src_len;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
pr[0].uintVal = res->pos_bits;
|
||||||
|
pr[1].uintVal = res->lit_pos_bits;
|
||||||
// cconf overrides
|
pr[2].uintVal = res->lit_context_bits;
|
||||||
if (lcconf)
|
pr[3].uintVal = res->dict_size;
|
||||||
{
|
pr[4].uintVal = res->fast_mode;
|
||||||
oassign(pr[0].uintVal, lcconf->pos_bits);
|
pr[5].uintVal = res->num_fast_bytes;
|
||||||
oassign(pr[1].uintVal, lcconf->lit_pos_bits);
|
pr[6].uintVal = res->match_finder_cycles;
|
||||||
oassign(pr[2].uintVal, lcconf->lit_context_bits);
|
|
||||||
oassign(pr[3].uintVal, lcconf->dict_size);
|
|
||||||
oassign(pr[5].uintVal, lcconf->num_fast_bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
// limit dictionary size
|
|
||||||
if (pr[3].uintVal > src_len)
|
|
||||||
pr[3].uintVal = src_len;
|
|
||||||
|
|
||||||
// limit num_probs
|
|
||||||
if (lcconf && lcconf->max_num_probs)
|
|
||||||
{
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
unsigned n = 1846 + (768 << (pr[2].uintVal + pr[1].uintVal));
|
|
||||||
if (n <= lcconf->max_num_probs)
|
|
||||||
break;
|
|
||||||
if (pr[1].uintVal > pr[2].uintVal)
|
|
||||||
{
|
|
||||||
if (pr[1].uintVal == 0)
|
|
||||||
goto error;
|
|
||||||
pr[1].uintVal -= 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pr[2].uintVal == 0)
|
|
||||||
goto error;
|
|
||||||
pr[2].uintVal -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res->pos_bits = pr[0].uintVal;
|
|
||||||
res->lit_pos_bits = pr[1].uintVal;
|
|
||||||
res->lit_context_bits = pr[2].uintVal;
|
|
||||||
res->dict_size = pr[3].uintVal;
|
|
||||||
res->fast_mode = pr[4].uintVal;
|
|
||||||
res->num_fast_bytes = pr[5].uintVal;
|
|
||||||
res->match_finder_cycles = pr[6].uintVal;
|
|
||||||
//res->num_probs = LzmaGetNumProbs(&s.Properties));
|
|
||||||
//res->num_probs = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp)))
|
|
||||||
res->num_probs = 1846 + (768 << (res->lit_context_bits + res->lit_pos_bits));
|
|
||||||
//printf("\nlzma_compress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs);
|
|
||||||
|
|
||||||
#ifndef _NO_EXCEPTIONS
|
#ifndef _NO_EXCEPTIONS
|
||||||
try {
|
try {
|
||||||
@@ -380,7 +513,7 @@ int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
assert(os.b_pos == 5);
|
assert(os.b_pos == 5);
|
||||||
#if defined(USE_LZMA_PROPERTIES)
|
#if (USE_LZMA_PROPERTIES)
|
||||||
os.b_pos = 1;
|
os.b_pos = 1;
|
||||||
#else
|
#else
|
||||||
os.b_pos = 0;
|
os.b_pos = 0;
|
||||||
@@ -413,17 +546,116 @@ int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
|||||||
}
|
}
|
||||||
|
|
||||||
error:
|
error:
|
||||||
*dst_len = os.b_pos;
|
*dst_len = (unsigned) os.b_pos;
|
||||||
//printf("\nlzma_compress: %d: %u %u %u %u %u, %u - > %u\n", r, res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs, src_len, *dst_len);
|
//printf("\nlzma_compress: %d: %u %u %u %u %u, %u - > %u\n", r, res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs, src_len, *dst_len);
|
||||||
//printf("%u %u %u\n", is.__m_RefCount, os.__m_RefCount, progress.__m_RefCount);
|
//printf("%u %u %u\n", is.__m_RefCount, os.__m_RefCount, progress.__m_RefCount);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* (WITH_LZMA < 0x461) */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// decompress
|
// decompress
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if (WITH_LZMA >= 0x461)
|
||||||
|
|
||||||
|
#undef _LZMA_PROB32
|
||||||
|
#include "C/LzmaDec.h"
|
||||||
|
#include "C/LzmaDec.c"
|
||||||
|
|
||||||
|
|
||||||
|
int upx_lzma_decompress ( const upx_bytep src, unsigned src_len,
|
||||||
|
upx_bytep dst, unsigned* dst_len,
|
||||||
|
int method,
|
||||||
|
const upx_compress_result_t *cresult )
|
||||||
|
{
|
||||||
|
#define Properties prop
|
||||||
|
assert(M_IS_LZMA(method));
|
||||||
|
// see res->num_probs above
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(CLzmaProb) == 2)
|
||||||
|
COMPILE_TIME_ASSERT(LZMA_PROPS_SIZE == 5)
|
||||||
|
COMPILE_TIME_ASSERT(LZMA_BASE_SIZE == 1846)
|
||||||
|
COMPILE_TIME_ASSERT(LZMA_LIT_SIZE == 768)
|
||||||
|
|
||||||
|
ISzAlloc cba; cba.Alloc = cb_alloc; cba.Free = cb_free;
|
||||||
|
CLzmaDec s; memset(&s, 0, sizeof(s));
|
||||||
|
SizeT srcLen = 0;
|
||||||
|
int r = UPX_E_ERROR;
|
||||||
|
SRes rh;
|
||||||
|
ELzmaStatus status;
|
||||||
|
|
||||||
|
#if (USE_LZMA_PROPERTIES)
|
||||||
|
rh = LzmaProps_Decode(&s.Properties, src, src_len);
|
||||||
|
if (rh != 0)
|
||||||
|
goto error;
|
||||||
|
src += 1; src_len -= 1;
|
||||||
|
#else
|
||||||
|
if (src_len < 3)
|
||||||
|
goto error;
|
||||||
|
s.Properties.pb = src[0] & 7;
|
||||||
|
s.Properties.lp = (src[1] >> 4);
|
||||||
|
s.Properties.lc = src[1] & 15;
|
||||||
|
if (s.Properties.pb >= 5) goto error;
|
||||||
|
if (s.Properties.lp >= 5) goto error;
|
||||||
|
if (s.Properties.lc >= 9) goto error;
|
||||||
|
// extra
|
||||||
|
if ((src[0] >> 3) != (int)(s.Properties.lc + s.Properties.lp)) goto error;
|
||||||
|
src += 2; src_len -= 2;
|
||||||
|
#endif
|
||||||
|
s.Properties.dicSize = 0;
|
||||||
|
|
||||||
|
if (cresult)
|
||||||
|
{
|
||||||
|
assert(cresult->method == method);
|
||||||
|
assert(cresult->result_lzma.pos_bits == (unsigned) s.Properties.pb);
|
||||||
|
assert(cresult->result_lzma.lit_pos_bits == (unsigned) s.Properties.lp);
|
||||||
|
assert(cresult->result_lzma.lit_context_bits == (unsigned) s.Properties.lc);
|
||||||
|
assert(cresult->result_lzma.num_probs == (unsigned) LzmaProps_GetNumProbs(&s.Properties));
|
||||||
|
const lzma_compress_result_t *res = &cresult->result_lzma;
|
||||||
|
UNUSED(res);
|
||||||
|
//printf("\nlzma_decompress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs);
|
||||||
|
}
|
||||||
|
|
||||||
|
rh = LzmaDec_AllocateProbs2(&s, &s.Properties, &cba);
|
||||||
|
if (rh != SZ_OK)
|
||||||
|
{
|
||||||
|
r = UPX_E_OUT_OF_MEMORY;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
s.dic = dst; s.dicPos = 0; s.dicBufSize = *dst_len;
|
||||||
|
LzmaDec_Init(&s);
|
||||||
|
srcLen = src_len;
|
||||||
|
rh = LzmaDec_DecodeToDic(&s, *dst_len, src, &srcLen, LZMA_FINISH_ANY, &status);
|
||||||
|
assert(srcLen <= src_len);
|
||||||
|
assert(s.dicPos <= *dst_len);
|
||||||
|
if (rh == SZ_OK && status == LZMA_STATUS_NEEDS_MORE_INPUT)
|
||||||
|
rh = SZ_ERROR_INPUT_EOF;
|
||||||
|
if (rh == SZ_OK && status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)
|
||||||
|
{
|
||||||
|
r = UPX_E_OK;
|
||||||
|
if (srcLen != src_len)
|
||||||
|
r = UPX_E_INPUT_NOT_CONSUMED;
|
||||||
|
}
|
||||||
|
error:
|
||||||
|
*dst_len = s.dicPos;
|
||||||
|
LzmaDec_FreeProbs(&s, &cba);
|
||||||
|
return r;
|
||||||
|
#undef Properties
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* (WITH_LZMA >= 0x461) */
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// decompress
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if (WITH_LZMA < 0x461)
|
||||||
|
|
||||||
#undef _LZMA_IN_CB
|
#undef _LZMA_IN_CB
|
||||||
#undef _LZMA_OUT_READ
|
#undef _LZMA_OUT_READ
|
||||||
#undef _LZMA_PROB32
|
#undef _LZMA_PROB32
|
||||||
@@ -452,7 +684,7 @@ int upx_lzma_decompress ( const upx_bytep src, unsigned src_len,
|
|||||||
int r = UPX_E_ERROR;
|
int r = UPX_E_ERROR;
|
||||||
int rh;
|
int rh;
|
||||||
|
|
||||||
#if defined(USE_LZMA_PROPERTIES)
|
#if (USE_LZMA_PROPERTIES)
|
||||||
if (src_len < 2)
|
if (src_len < 2)
|
||||||
goto error;
|
goto error;
|
||||||
rh = LzmaDecodeProperties(&s.Properties, src, src_len);
|
rh = LzmaDecodeProperties(&s.Properties, src, src_len);
|
||||||
@@ -503,11 +735,11 @@ int upx_lzma_decompress ( const upx_bytep src, unsigned src_len,
|
|||||||
error:
|
error:
|
||||||
*dst_len = dst_out;
|
*dst_len = dst_out;
|
||||||
free(s.Probs);
|
free(s.Probs);
|
||||||
|
|
||||||
UNUSED(cresult);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* (WITH_LZMA < 0x461) */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// test_overlap - see <ucl/ucl.h> for semantics
|
// test_overlap - see <ucl/ucl.h> for semantics
|
||||||
@@ -545,12 +777,16 @@ int upx_lzma_test_overlap ( const upx_bytep buf,
|
|||||||
|
|
||||||
const char *upx_lzma_version_string(void)
|
const char *upx_lzma_version_string(void)
|
||||||
{
|
{
|
||||||
#if (WITH_LZMA == 0x449)
|
#if (WITH_LZMA >= 0x461)
|
||||||
|
return MY_VERSION;
|
||||||
|
#elif (WITH_LZMA + 0 == 0x457)
|
||||||
|
return "4.57";
|
||||||
|
#elif (WITH_LZMA + 0 == 0x449)
|
||||||
return "4.49";
|
return "4.49";
|
||||||
#elif (WITH_LZMA == 0x443)
|
#elif (WITH_LZMA + 0 == 0x443)
|
||||||
return "4.43";
|
return "4.43";
|
||||||
#else
|
#else
|
||||||
# error "unknown version"
|
# error "unknown WITH_LZMA version"
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,29 +22,29 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "compress.h"
|
#include "compress.h"
|
||||||
#if !defined(WITH_UCL)
|
#if !(WITH_UCL)
|
||||||
extern int compress_ucl_dummy;
|
extern int compress_ucl_dummy;
|
||||||
int compress_ucl_dummy = 0;
|
int compress_ucl_dummy = 0;
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#if 1 && !defined(UCL_USE_ASM) && (ACC_ARCH_I386)
|
#if 1 && !(UCL_USE_ASM) && (ACC_ARCH_I386)
|
||||||
# if (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_MSC || ACC_CC_WATCOMC)
|
# if (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_MSC || ACC_CC_WATCOMC)
|
||||||
# define UCL_USE_ASM
|
# define UCL_USE_ASM 1
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#if defined(UCL_NO_ASM)
|
#if (UCL_NO_ASM)
|
||||||
# undef UCL_USE_ASM
|
# undef UCL_USE_ASM
|
||||||
#endif
|
#endif
|
||||||
#if defined(ACC_CFG_NO_UNALIGNED)
|
#if (ACC_CFG_NO_UNALIGNED)
|
||||||
# undef UCL_USE_ASM
|
# undef UCL_USE_ASM
|
||||||
#endif
|
#endif
|
||||||
#if 1 && defined(UCL_USE_ASM)
|
#if 1 && (UCL_USE_ASM)
|
||||||
# include <ucl/ucl_asm.h>
|
# include <ucl/ucl_asm.h>
|
||||||
# define ucl_nrv2b_decompress_safe_8 ucl_nrv2b_decompress_asm_safe_8
|
# define ucl_nrv2b_decompress_safe_8 ucl_nrv2b_decompress_asm_safe_8
|
||||||
# define ucl_nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_asm_safe_le16
|
# define ucl_nrv2b_decompress_safe_le16 ucl_nrv2b_decompress_asm_safe_le16
|
||||||
@@ -85,7 +85,7 @@ static int convert_errno_from_ucl(int r)
|
|||||||
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
static void wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, ucl_voidp user)
|
static void __UCL_CDECL wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, ucl_voidp user)
|
||||||
{
|
{
|
||||||
if (state != -1 && state != 3) return;
|
if (state != -1 && state != 3) return;
|
||||||
upx_callback_p cb = (upx_callback_p) user;
|
upx_callback_p cb = (upx_callback_p) user;
|
||||||
@@ -120,7 +120,7 @@ int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
|||||||
|
|
||||||
ucl_compress_config_t cconf; cconf.reset();
|
ucl_compress_config_t cconf; cconf.reset();
|
||||||
if (cconf_parm)
|
if (cconf_parm)
|
||||||
cconf = cconf_parm->conf_ucl; // struct copy
|
memcpy(&cconf, &cconf_parm->conf_ucl, sizeof(cconf)); // cconf = cconf_parm->conf_ucl; // struct copy
|
||||||
|
|
||||||
ucl_uint *res = cresult->result_ucl.result;
|
ucl_uint *res = cresult->result_ucl.result;
|
||||||
// assume no info available - fill in worst case results
|
// assume no info available - fill in worst case results
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ void zlib_compress_config_t::reset()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if !defined(WITH_ZLIB)
|
#if !(WITH_ZLIB)
|
||||||
extern int compress_zlib_dummy;
|
extern int compress_zlib_dummy;
|
||||||
int compress_zlib_dummy = 0;
|
int compress_zlib_dummy = 0;
|
||||||
#else
|
#else
|
||||||
|
|||||||
+65
-32
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_CONF_H
|
#ifndef __UPX_CONF_H
|
||||||
#define __UPX_CONF_H
|
#define __UPX_CONF_H 1
|
||||||
|
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
@@ -36,6 +36,21 @@
|
|||||||
// ACC
|
// ACC
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if (defined(_WIN32) || defined(_WIN64)) && defined(_MSC_VER)
|
||||||
|
#ifndef _CRT_NONSTDC_NO_DEPRECATE
|
||||||
|
#define _CRT_NONSTDC_NO_DEPRECATE 1
|
||||||
|
#endif
|
||||||
|
#ifndef _CRT_NONSTDC_NO_WARNINGS
|
||||||
|
#define _CRT_NONSTDC_NO_WARNINGS 1
|
||||||
|
#endif
|
||||||
|
#ifndef _CRT_SECURE_NO_DEPRECATE
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||||
|
#endif
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "miniacc.h"
|
#include "miniacc.h"
|
||||||
#if ((ACC_OS_WIN32 || ACC_OS_WIN64) && ACC_CC_MWERKS) && defined(__MSL__)
|
#if ((ACC_OS_WIN32 || ACC_OS_WIN64) && ACC_CC_MWERKS) && defined(__MSL__)
|
||||||
# undef HAVE_UTIME_H /* this pulls in <windows.h> */
|
# undef HAVE_UTIME_H /* this pulls in <windows.h> */
|
||||||
@@ -78,10 +93,13 @@
|
|||||||
# if (ACC_OS_WIN32 || ACC_OS_WIN64)
|
# if (ACC_OS_WIN32 || ACC_OS_WIN64)
|
||||||
# elif defined(__linux__)
|
# elif defined(__linux__)
|
||||||
# pragma warning(error: 424) // #424: extra ";" ignored
|
# pragma warning(error: 424) // #424: extra ";" ignored
|
||||||
|
//# pragma warning(disable: 128) // #128: loop is not reachable from preceding code
|
||||||
|
//# pragma warning(disable: 181) // #181: argument is incompatible with corresponding format string conversion
|
||||||
# pragma warning(disable: 193) // #193: zero used for undefined preprocessing identifier
|
# pragma warning(disable: 193) // #193: zero used for undefined preprocessing identifier
|
||||||
# pragma warning(disable: 810) // #810: conversion from "A" to "B" may lose significant bits
|
# pragma warning(disable: 810) // #810: conversion from "A" to "B" may lose significant bits
|
||||||
# pragma warning(disable: 981) // #981: operands are evaluated in unspecified order
|
# pragma warning(disable: 981) // #981: operands are evaluated in unspecified order
|
||||||
# pragma warning(disable: 1418) // #1418: external definition with no prior declaration
|
# pragma warning(disable: 1418) // #1418: external function definition with no prior declaration
|
||||||
|
//# pragma warning(disable: 1419) // #1419: external declaration in primary source file
|
||||||
# else
|
# else
|
||||||
# error "untested platform"
|
# error "untested platform"
|
||||||
# endif
|
# endif
|
||||||
@@ -90,6 +108,7 @@
|
|||||||
# error "need Visual C++ 5.0 or newer"
|
# error "need Visual C++ 5.0 or newer"
|
||||||
# endif
|
# endif
|
||||||
# pragma warning(error: 4096) // W2: '__cdecl' must be used with '...'
|
# pragma warning(error: 4096) // W2: '__cdecl' must be used with '...'
|
||||||
|
# pragma warning(error: 4138) // Wx: '*/' found outside of comment
|
||||||
# pragma warning(disable: 4097) // W3: typedef-name 'A' used as synonym for class-name 'B'
|
# pragma warning(disable: 4097) // W3: typedef-name 'A' used as synonym for class-name 'B'
|
||||||
# pragma warning(disable: 4511) // W3: 'class': copy constructor could not be generated
|
# pragma warning(disable: 4511) // W3: 'class': copy constructor could not be generated
|
||||||
# pragma warning(disable: 4512) // W4: 'class': assignment operator could not be generated
|
# pragma warning(disable: 4512) // W4: 'class': assignment operator could not be generated
|
||||||
@@ -107,10 +126,13 @@
|
|||||||
#elif (ACC_CC_SUNPROC)
|
#elif (ACC_CC_SUNPROC)
|
||||||
//# pragma error_messages(off,"badargtype2w") // FIXME
|
//# pragma error_messages(off,"badargtype2w") // FIXME
|
||||||
#elif (ACC_CC_WATCOMC)
|
#elif (ACC_CC_WATCOMC)
|
||||||
# if (__WATCOMC__ < 1100)
|
# if (__WATCOMC__ < 1280)
|
||||||
# error "need Watcom C++ 11.0c or newer"
|
# error "need Open Watcom C++ 1.8 or newer" // because earlier versions do not support nested classes
|
||||||
# endif
|
# endif
|
||||||
# if defined(__cplusplus)
|
# if defined(__cplusplus)
|
||||||
|
# pragma warning 367 9 // w3: conditional expression in if statement is always true
|
||||||
|
# pragma warning 368 9 // w3: conditional expression in if statement is always false
|
||||||
|
# pragma warning 389 9 // w3: integral value may be truncated
|
||||||
# pragma warning 656 9 // w5: define this function inside its class definition (may improve code quality)
|
# pragma warning 656 9 // w5: define this function inside its class definition (may improve code quality)
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
@@ -137,15 +159,18 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// just in case
|
// just in case
|
||||||
|
#undef _
|
||||||
|
#undef __
|
||||||
|
#undef ___
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#undef dos
|
#undef dos
|
||||||
#undef linux
|
#undef linux
|
||||||
#undef small
|
#undef small
|
||||||
#undef tos
|
#undef tos
|
||||||
#if defined(ACC_CC_DMC)
|
#if (ACC_CC_DMC)
|
||||||
# undef tell
|
# undef tell
|
||||||
#endif
|
#endif
|
||||||
#if !defined(ACC_CC_PGI)
|
#if !(ACC_CC_PGI)
|
||||||
# undef unix
|
# undef unix
|
||||||
#endif
|
#endif
|
||||||
#if defined(__DJGPP__)
|
#if defined(__DJGPP__)
|
||||||
@@ -160,15 +185,18 @@
|
|||||||
#if 0 && !defined(WITH_LZMA)
|
#if 0 && !defined(WITH_LZMA)
|
||||||
# define WITH_LZMA 1
|
# define WITH_LZMA 1
|
||||||
#endif
|
#endif
|
||||||
|
#if 1 && (ACC_CC_WATCOMC)
|
||||||
|
# undef WITH_LZMA
|
||||||
|
#endif
|
||||||
#if defined(UPX_OFFICIAL_BUILD)
|
#if defined(UPX_OFFICIAL_BUILD)
|
||||||
# if !defined(WITH_LZMA) || !defined(WITH_NRV) || !defined(WITH_UCL)
|
# if !(WITH_LZMA) || !(WITH_NRV) || !(WITH_UCL)
|
||||||
# error
|
# error
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_NRV)
|
#if (WITH_NRV)
|
||||||
# include <nrv/nrvconf.h>
|
# include <nrv/nrvconf.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if (WITH_UCL)
|
||||||
# define ucl_compress_config_t REAL_ucl_compress_config_t
|
# define ucl_compress_config_t REAL_ucl_compress_config_t
|
||||||
# include <ucl/uclconf.h>
|
# include <ucl/uclconf.h>
|
||||||
# include <ucl/ucl.h>
|
# include <ucl/ucl.h>
|
||||||
@@ -178,11 +206,6 @@
|
|||||||
# undef ucl_compress_config_t
|
# undef ucl_compress_config_t
|
||||||
# undef ucl_compress_config_p
|
# undef ucl_compress_config_p
|
||||||
#endif
|
#endif
|
||||||
#if !defined(__UPX_CHECKER)
|
|
||||||
# if defined(__UCL_CHECKER) || defined(__NRV_CHECKER)
|
|
||||||
# define __UPX_CHECKER
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if !defined(UINT_MAX) || (UINT_MAX < 0xffffffffL)
|
#if !defined(UINT_MAX) || (UINT_MAX < 0xffffffffL)
|
||||||
# error "UINT_MAX"
|
# error "UINT_MAX"
|
||||||
#endif
|
#endif
|
||||||
@@ -196,7 +219,7 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
// malloc debuggers
|
// malloc debuggers
|
||||||
#if defined(WITH_VALGRIND)
|
#if (WITH_VALGRIND)
|
||||||
# include <valgrind/memcheck.h>
|
# include <valgrind/memcheck.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -235,11 +258,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if !defined(HAVE_STRCASECMP) && defined(HAVE_STRICMP)
|
#if !(HAVE_STRCASECMP) && (HAVE_STRICMP)
|
||||||
# define strcasecmp stricmp
|
# define strcasecmp stricmp
|
||||||
#endif
|
#endif
|
||||||
#if !defined(HAVE_STRNCASECMP) && defined(HAVE_STRNICMP)
|
#if !(HAVE_STRNCASECMP) && (HAVE_STRNICMP)
|
||||||
# define strncasecmp strnicmp
|
# define strncasecmp strnicmp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -301,16 +324,18 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#undef __attribute_packed
|
#if (ACC_CC_INTELC && (__INTEL_COMPILER < 800))
|
||||||
#if (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_PATHSCALE)
|
#elif (0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386))
|
||||||
# if (ACC_ARCH_I386) && (ACC_CC_INTELC && (__INTEL_COMPILER < 800))
|
#elif (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_PATHSCALE)
|
||||||
# elif (0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386))
|
# define __packed_struct(s) struct s {
|
||||||
# else
|
# define __packed_struct_end() } __attribute__((__packed__,__aligned__(1)));
|
||||||
# define __attribute_packed __attribute__((__packed__,__aligned__(1)))
|
#elif (ACC_CC_WATCOMC)
|
||||||
# endif
|
# define __packed_struct(s) _Packed struct s {
|
||||||
|
# define __packed_struct_end() };
|
||||||
#endif
|
#endif
|
||||||
#if !defined(__attribute_packed)
|
#if !defined(__packed_struct)
|
||||||
# define __attribute_packed
|
# define __packed_struct(s) struct s {
|
||||||
|
# define __packed_struct_end() };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -323,8 +348,9 @@
|
|||||||
|
|
||||||
#define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \
|
#define __COMPILE_TIME_ASSERT_ALIGNOF_SIZEOF(a,b) { \
|
||||||
typedef a acc_tmp_a_t; typedef b acc_tmp_b_t; \
|
typedef a acc_tmp_a_t; typedef b acc_tmp_b_t; \
|
||||||
struct acc_tmp_t { acc_tmp_b_t x; acc_tmp_a_t y; acc_tmp_b_t z; } __attribute_packed; \
|
__packed_struct(acc_tmp_t) acc_tmp_b_t x; acc_tmp_a_t y; acc_tmp_b_t z; __packed_struct_end() \
|
||||||
COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 2*sizeof(b)+sizeof(a)) \
|
COMPILE_TIME_ASSERT(sizeof(struct acc_tmp_t) == 2*sizeof(b)+sizeof(a)) \
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(((acc_tmp_t*)0)->x)+sizeof(((acc_tmp_t*)0)->y)+sizeof(((acc_tmp_t*)0)->z) == 2*sizeof(b)+sizeof(a)) \
|
||||||
}
|
}
|
||||||
#if defined(__acc_alignof)
|
#if defined(__acc_alignof)
|
||||||
# define __COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
|
# define __COMPILE_TIME_ASSERT_ALIGNOF(a,b) \
|
||||||
@@ -459,6 +485,12 @@ private:
|
|||||||
#define UPX_F_VMLINUX_ARMEL 28
|
#define UPX_F_VMLINUX_ARMEL 28
|
||||||
#define UPX_F_MACH_i386 29
|
#define UPX_F_MACH_i386 29
|
||||||
#define UPX_F_LINUX_ELF32_MIPSEL 30
|
#define UPX_F_LINUX_ELF32_MIPSEL 30
|
||||||
|
#define UPX_F_VMLINUZ_ARMEL 31
|
||||||
|
#define UPX_F_MACH_ARMEL 32
|
||||||
|
|
||||||
|
#define UPX_F_DYLIB_i386 33
|
||||||
|
#define UPX_F_MACH_AMD64 34
|
||||||
|
#define UPX_F_DYLIB_AMD64 35
|
||||||
|
|
||||||
#define UPX_F_PLAIN_TEXT 127
|
#define UPX_F_PLAIN_TEXT 127
|
||||||
|
|
||||||
@@ -471,6 +503,7 @@ private:
|
|||||||
#define UPX_F_VMLINUX_ARMEB 135
|
#define UPX_F_VMLINUX_ARMEB 135
|
||||||
#define UPX_F_VMLINUX_PPC32 136
|
#define UPX_F_VMLINUX_PPC32 136
|
||||||
#define UPX_F_LINUX_ELF32_MIPSEB 137
|
#define UPX_F_LINUX_ELF32_MIPSEB 137
|
||||||
|
#define UPX_F_DYLIB_PPC32 138
|
||||||
|
|
||||||
|
|
||||||
// compression methods
|
// compression methods
|
||||||
|
|||||||
+22
-22
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -39,41 +39,41 @@
|
|||||||
#undef USE_SCREEN_WIN32
|
#undef USE_SCREEN_WIN32
|
||||||
#undef USE_FRAMES
|
#undef USE_FRAMES
|
||||||
|
|
||||||
#if defined(WITH_GUI) && !defined(NO_CONSOLE)
|
#if 1 && (WITH_GUI) && !defined(NO_CONSOLE)
|
||||||
# define NO_CONSOLE
|
# define NO_CONSOLE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1 && defined(__linux__)
|
#if 1 && defined(__linux__)
|
||||||
# define USE_SCREEN
|
# define USE_SCREEN 1
|
||||||
# define USE_SCREEN_VCSA
|
# define USE_SCREEN_VCSA 1
|
||||||
# if !defined(HAVE_LINUX_KD_H)
|
# if !(HAVE_LINUX_KD_H)
|
||||||
# undef USE_SCREEN
|
# undef USE_SCREEN
|
||||||
# undef USE_SCREEN_VCSA
|
# undef USE_SCREEN_VCSA
|
||||||
# endif
|
# endif
|
||||||
# if !defined(HAVE_LINUX_KDEV_T_H) || !defined(HAVE_LINUX_MAJOR_H)
|
# if !(HAVE_LINUX_KDEV_T_H) || !(HAVE_LINUX_MAJOR_H)
|
||||||
# undef USE_SCREEN
|
# undef USE_SCREEN
|
||||||
# undef USE_SCREEN_VCSA
|
# undef USE_SCREEN_VCSA
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1 && defined(__DJGPP__)
|
#if 1 && defined(__DJGPP__)
|
||||||
# define USE_SCREEN
|
# define USE_SCREEN 1
|
||||||
#elif 1 && (ACC_OS_CYGWIN || ACC_OS_WIN32 || ACC_OS_WIN64)
|
#elif 1 && (ACC_OS_CYGWIN || ACC_OS_WIN32 || ACC_OS_WIN64)
|
||||||
# define USE_SCREEN
|
# define USE_SCREEN 1
|
||||||
# define USE_SCREEN_WIN32
|
# define USE_SCREEN_WIN32 1
|
||||||
#elif 1 && (ACC_OS_EMX && defined(__RSXNT__))
|
#elif 1 && (ACC_OS_EMX && defined(__RSXNT__))
|
||||||
# define USE_SCREEN
|
# define USE_SCREEN 1
|
||||||
# define USE_SCREEN_WIN32
|
# define USE_SCREEN_WIN32 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if 0 || defined(NO_ANSI)
|
#if 0 || (NO_ANSI)
|
||||||
# undef USE_ANSI
|
# undef USE_ANSI
|
||||||
#endif
|
#endif
|
||||||
#if 0 || defined(NO_SCREEN)
|
#if 0 || (NO_SCREEN)
|
||||||
# undef USE_SCREEN
|
# undef USE_SCREEN
|
||||||
#endif
|
#endif
|
||||||
#if 0 || defined(NO_FRAMES) || !defined(USE_SCREEN)
|
#if 0 || (NO_FRAMES) || !(USE_SCREEN)
|
||||||
# undef USE_FRAMES
|
# undef USE_FRAMES
|
||||||
#endif
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
@@ -81,11 +81,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if 0 || defined(USE_ANSI) || defined(USE_SCREEN)
|
#if 0 || (USE_ANSI) || (USE_SCREEN)
|
||||||
# define USE_CONSOLE
|
# define USE_CONSOLE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0 || defined(NO_CONSOLE) || !defined(USE_CONSOLE)
|
#if 0 || (NO_CONSOLE) || !(USE_CONSOLE)
|
||||||
# undef USE_CONSOLE
|
# undef USE_CONSOLE
|
||||||
# undef USE_ANSI
|
# undef USE_ANSI
|
||||||
# undef USE_SCREEN
|
# undef USE_SCREEN
|
||||||
@@ -110,7 +110,7 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#if defined(USE_CONSOLE)
|
#if (USE_CONSOLE)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -165,7 +165,7 @@ void __acc_cdecl_va con_fprintf(FILE *f, const char *format, ...);
|
|||||||
|
|
||||||
extern FILE *con_term;
|
extern FILE *con_term;
|
||||||
|
|
||||||
#if defined(USE_CONSOLE)
|
#if (USE_CONSOLE)
|
||||||
|
|
||||||
extern int con_mode;
|
extern int con_mode;
|
||||||
extern console_t *con;
|
extern console_t *con;
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_EXCEPT_H
|
#ifndef __UPX_EXCEPT_H
|
||||||
#define __UPX_EXCEPT_H
|
#define __UPX_EXCEPT_H 1
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
@@ -204,7 +204,7 @@ public:
|
|||||||
// (noreturn) is probably not the correct semantics for throwing exceptions
|
// (noreturn) is probably not the correct semantics for throwing exceptions
|
||||||
#define NORET __attribute__((__noreturn__))
|
#define NORET __attribute__((__noreturn__))
|
||||||
#else
|
#else
|
||||||
#define NORET
|
#define NORET /*empty*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void throwCantPack(const char *msg) NORET;
|
void throwCantPack(const char *msg) NORET;
|
||||||
|
|||||||
+16
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
void File::chmod(const char *name, int mode)
|
void File::chmod(const char *name, int mode)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_CHMOD)
|
#if (HAVE_CHMOD)
|
||||||
if (::chmod(name,mode) != 0)
|
if (::chmod(name,mode) != 0)
|
||||||
throwIOException(name,errno);
|
throwIOException(name,errno);
|
||||||
#else
|
#else
|
||||||
@@ -366,6 +366,7 @@ off_t OutputFile::st_size() const
|
|||||||
return bytes_written; // too big if seek()+write() instead of rewrite()
|
return bytes_written; // too big if seek()+write() instead of rewrite()
|
||||||
}
|
}
|
||||||
struct stat my_st;
|
struct stat my_st;
|
||||||
|
my_st.st_size = 0;
|
||||||
if (::fstat(_fd, &my_st) != 0)
|
if (::fstat(_fd, &my_st) != 0)
|
||||||
throwIOException(_name, errno);
|
throwIOException(_name, errno);
|
||||||
return my_st.st_size;
|
return my_st.st_size;
|
||||||
@@ -395,6 +396,17 @@ void OutputFile::rewrite(const void *buf, int len)
|
|||||||
void OutputFile::seek(off_t off, int whence)
|
void OutputFile::seek(off_t off, int whence)
|
||||||
{
|
{
|
||||||
assert(!opt->to_stdout);
|
assert(!opt->to_stdout);
|
||||||
|
switch (whence) {
|
||||||
|
case SEEK_SET: {
|
||||||
|
if (bytes_written < off) {
|
||||||
|
bytes_written = off;
|
||||||
|
}
|
||||||
|
_length = bytes_written; // cheap, lazy update; needed?
|
||||||
|
} break;
|
||||||
|
case SEEK_END: {
|
||||||
|
_length = bytes_written; // necessary
|
||||||
|
} break;
|
||||||
|
}
|
||||||
super::seek(off,whence);
|
super::seek(off,whence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_FILE_H
|
#ifndef __UPX_FILE_H
|
||||||
#define __UPX_FILE_H
|
#define __UPX_FILE_H 1
|
||||||
|
|
||||||
class MemBuffer;
|
class MemBuffer;
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_FILTER_H
|
#ifndef __UPX_FILTER_H
|
||||||
#define __UPX_FILTER_H
|
#define __UPX_FILTER_H 1
|
||||||
|
|
||||||
class Filter;
|
class Filter;
|
||||||
class FilterImp;
|
class FilterImp;
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ static int F(Filter *f)
|
|||||||
unsigned calls = 0, noncalls = 0, noncalls2 = 0;
|
unsigned calls = 0, noncalls = 0, noncalls2 = 0;
|
||||||
unsigned lastnoncall = size, lastcall = 0;
|
unsigned lastnoncall = size, lastcall = 0;
|
||||||
|
|
||||||
// find a 16MB large empty address space
|
// find a 16 MiB large empty address space
|
||||||
{
|
{
|
||||||
unsigned char buf[256];
|
unsigned char buf[256];
|
||||||
memset(buf,0,256);
|
memset(buf,0,256);
|
||||||
|
|||||||
+5
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -51,7 +51,7 @@ static int F(Filter *f)
|
|||||||
unsigned calls = 0, noncalls = 0, noncalls2 = 0;
|
unsigned calls = 0, noncalls = 0, noncalls2 = 0;
|
||||||
unsigned lastnoncall = size, lastcall = 0;
|
unsigned lastnoncall = size, lastcall = 0;
|
||||||
|
|
||||||
// find a 16MB large empty address space
|
// find a 16 MiB large empty address space
|
||||||
{
|
{
|
||||||
unsigned char buf[256];
|
unsigned char buf[256];
|
||||||
memset(buf,0,256);
|
memset(buf,0,256);
|
||||||
|
|||||||
+6
-6
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -123,8 +123,8 @@ static int F(Filter *f)
|
|||||||
N_MRU : 0;
|
N_MRU : 0;
|
||||||
#endif //}
|
#endif //}
|
||||||
|
|
||||||
// FIXME: We must fit into 8MB because we steal one bit.
|
// FIXME: We must fit into 8 MiB because we steal one bit.
|
||||||
// find a 16MB large empty address space
|
// find a 16 MiB large empty address space
|
||||||
{
|
{
|
||||||
int which;
|
int which;
|
||||||
unsigned char buf[256];
|
unsigned char buf[256];
|
||||||
|
|||||||
+5
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -52,7 +52,7 @@ static int F(Filter *f)
|
|||||||
unsigned calls = 0, noncalls = 0, noncalls2 = 0;
|
unsigned calls = 0, noncalls = 0, noncalls2 = 0;
|
||||||
unsigned lastnoncall = size, lastcall = 0;
|
unsigned lastnoncall = size, lastcall = 0;
|
||||||
|
|
||||||
// find a 16MB large empty address space
|
// find a 16 MiB large empty address space
|
||||||
{
|
{
|
||||||
unsigned char buf[256];
|
unsigned char buf[256];
|
||||||
memset(buf,0,256);
|
memset(buf,0,256);
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+14
-10
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2004-2007 John F. Reiser
|
Copyright (C) 2004-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -47,7 +47,7 @@ static int F(Filter *f)
|
|||||||
// scan
|
// scan
|
||||||
const upx_byte *b = f->buf;
|
const upx_byte *b = f->buf;
|
||||||
#endif
|
#endif
|
||||||
const unsigned size = umin(f->buf_len, -(~0u<<(32 - (6+ W_CTO))));
|
const unsigned size = umin(f->buf_len, 0u - (~0u<<(32 - (6+ W_CTO))));
|
||||||
const unsigned size4 = size -4;
|
const unsigned size4 = size -4;
|
||||||
|
|
||||||
unsigned ic;
|
unsigned ic;
|
||||||
@@ -72,9 +72,11 @@ static int F(Filter *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (getcto(f, buf) < 0) {
|
if (getcto(f, buf) < 0) {
|
||||||
if (0!=W_CTO) // FIXME: what is this ???
|
#if (W_CTO != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
#else
|
||||||
f->cto = 0;
|
f->cto = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const unsigned char cto8 = f->cto;
|
const unsigned char cto8 = f->cto;
|
||||||
@@ -95,8 +97,9 @@ static int F(Filter *f)
|
|||||||
lastcall = ic;
|
lastcall = ic;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert(0==W_CTO // FIXME: what is this ???
|
#if (W_CTO != 0)
|
||||||
|| (~(~0u<<W_CTO) & (word>>(24+2 - W_CTO))) != cto8); // this should not happen
|
assert((~(~0u<<W_CTO) & (word>>(24+2 - W_CTO))) != cto8); // this should not happen
|
||||||
|
#endif
|
||||||
lastnoncall = ic;
|
lastnoncall = ic;
|
||||||
noncalls++;
|
noncalls++;
|
||||||
}
|
}
|
||||||
@@ -105,6 +108,7 @@ static int F(Filter *f)
|
|||||||
f->calls = calls;
|
f->calls = calls;
|
||||||
f->noncalls = noncalls;
|
f->noncalls = noncalls;
|
||||||
f->lastcall = lastcall;
|
f->lastcall = lastcall;
|
||||||
|
ACC_UNUSED(lastnoncall);
|
||||||
|
|
||||||
#if 0 || defined(TESTING)
|
#if 0 || defined(TESTING)
|
||||||
printf("\ncalls=%d noncalls=%d text_size=%x calltrickoffset=%x\n",
|
printf("\ncalls=%d noncalls=%d text_size=%x calltrickoffset=%x\n",
|
||||||
@@ -122,7 +126,7 @@ static int F(Filter *f)
|
|||||||
static int U(Filter *f)
|
static int U(Filter *f)
|
||||||
{
|
{
|
||||||
upx_byte *b = f->buf;
|
upx_byte *b = f->buf;
|
||||||
const unsigned size4 = umin(f->buf_len - 4, -(~0u<<(32 - (6+ W_CTO))));
|
const unsigned size4 = umin(f->buf_len - 4, 0u - (~0u<<(32 - (6+ W_CTO))));
|
||||||
const unsigned addvalue = f->addvalue;
|
const unsigned addvalue = f->addvalue;
|
||||||
|
|
||||||
unsigned ic;
|
unsigned ic;
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+26
-53
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -51,8 +51,9 @@ void show_head(void)
|
|||||||
fg = con_fg(f,FG_GREEN);
|
fg = con_fg(f,FG_GREEN);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" Ultimate Packer for eXecutables\n"
|
" Ultimate Packer for eXecutables\n"
|
||||||
" Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007\n"
|
" Copyright (C) 1996 - %s\n"
|
||||||
"UPX %-10s Markus Oberhumer, Laszlo Molnar & John Reiser %14s\n\n",
|
"UPX %-10s Markus Oberhumer, Laszlo Molnar & John Reiser %14s\n\n",
|
||||||
|
UPX_VERSION_YEAR,
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32)
|
#if (ACC_OS_DOS16 || ACC_OS_DOS32)
|
||||||
V("d"),
|
V("d"),
|
||||||
#elif (ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
#elif (ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
||||||
@@ -113,6 +114,7 @@ struct PackerNames
|
|||||||
{
|
{
|
||||||
PackerNames *self = (PackerNames *) user;
|
PackerNames *self = (PackerNames *) user;
|
||||||
self->add(p);
|
self->add(p);
|
||||||
|
delete p; p = NULL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
static int __acc_cdecl_qsort cmp_fname(const void *a, const void *b) {
|
static int __acc_cdecl_qsort cmp_fname(const void *a, const void *b) {
|
||||||
@@ -140,15 +142,16 @@ static void show_all_packers(FILE *f, int verbose)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
size_t fl = strlen(fn);
|
||||||
if (pos == 0) {
|
if (pos == 0) {
|
||||||
con_fprintf(f, " %s", fn);
|
con_fprintf(f, " %s", fn);
|
||||||
pos = 2 + strlen(fn);
|
pos = 2 + fl;
|
||||||
} else if (pos + 1 + strlen(fn) > 80) {
|
} else if (pos + 1 + fl > 80) {
|
||||||
con_fprintf(f, "\n %s", fn);
|
con_fprintf(f, "\n %s", fn);
|
||||||
pos = 2 + strlen(fn);
|
pos = 2 + fl;
|
||||||
} else {
|
} else {
|
||||||
con_fprintf(f, " %s", fn);
|
con_fprintf(f, " %s", fn);
|
||||||
pos += 1 + strlen(fn);
|
pos += 1 + fl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,26 +227,16 @@ void show_help(int verbose)
|
|||||||
" --overlay=skip don't compress a file with an overlay\n"
|
" --overlay=skip don't compress a file with an overlay\n"
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for atari/tos:\n");
|
|
||||||
fg = con_fg(f,fg);
|
|
||||||
con_fprintf(f,
|
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
"\n");
|
|
||||||
fg = con_fg(f,FG_YELLOW);
|
|
||||||
con_fprintf(f,"Options for djgpp2/coff:\n");
|
con_fprintf(f,"Options for djgpp2/coff:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --coff produce COFF output [default: EXE]\n"
|
" --coff produce COFF output [default: EXE]\n"
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
" --all-filters try all available preprocessing filters\n"
|
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for dos/com:\n");
|
con_fprintf(f,"Options for dos/com:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --8086 make compressed com work on any 8086\n"
|
" --8086 make compressed com work on any 8086\n"
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
" --all-filters try all available preprocessing filters\n"
|
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for dos/exe:\n");
|
con_fprintf(f,"Options for dos/exe:\n");
|
||||||
@@ -251,15 +244,12 @@ void show_help(int verbose)
|
|||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --8086 make compressed exe work on any 8086\n"
|
" --8086 make compressed exe work on any 8086\n"
|
||||||
" --no-reloc put no relocations in to the exe header\n"
|
" --no-reloc put no relocations in to the exe header\n"
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for dos/sys:\n");
|
con_fprintf(f,"Options for dos/sys:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --8086 make compressed sys work on any 8086\n"
|
" --8086 make compressed sys work on any 8086\n"
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
" --all-filters try all available preprocessing filters\n"
|
|
||||||
"\n");
|
"\n");
|
||||||
#if 0
|
#if 0
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
@@ -274,27 +264,12 @@ void show_help(int verbose)
|
|||||||
con_fprintf(f,"Options for ps1/exe:\n");
|
con_fprintf(f,"Options for ps1/exe:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
" --8-bit uses 8 bit size compression [default: 32 bit]\n"
|
" --8-bit uses 8 bit size compression [default: 32 bit]\n"
|
||||||
" --8mb-ram 8 megabyte memory limit [default: 2 mb]\n"
|
" --8mib-ram 8 megabyte memory limit [default: 2 MiB]\n"
|
||||||
" --boot-only disables client/host transfer compatibility\n"
|
" --boot-only disables client/host transfer compatibility\n"
|
||||||
" --no-align don't align to 2048 bytes [enables: --console-run]\n"
|
" --no-align don't align to 2048 bytes [enables: --console-run]\n"
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for tmt/adam:\n");
|
|
||||||
fg = con_fg(f,fg);
|
|
||||||
con_fprintf(f,
|
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
" --all-filters try all available preprocessing filters\n"
|
|
||||||
"\n");
|
|
||||||
fg = con_fg(f,FG_YELLOW);
|
|
||||||
con_fprintf(f,"Options for vmlinuz/386\n");
|
|
||||||
fg = con_fg(f,fg);
|
|
||||||
con_fprintf(f,
|
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
" --all-filters try all available preprocessing filters\n"
|
|
||||||
"\n");
|
|
||||||
fg = con_fg(f,FG_YELLOW);
|
|
||||||
con_fprintf(f,"Options for watcom/le:\n");
|
con_fprintf(f,"Options for watcom/le:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
@@ -314,8 +289,6 @@ void show_help(int verbose)
|
|||||||
" --keep-resource=list do not compress resources specified by list\n"
|
" --keep-resource=list do not compress resources specified by list\n"
|
||||||
" --strip-relocs=0 do not strip relocations\n"
|
" --strip-relocs=0 do not strip relocations\n"
|
||||||
" --strip-relocs=1 strip relocations [default]\n"
|
" --strip-relocs=1 strip relocations [default]\n"
|
||||||
" --all-methods try all available compression methods\n"
|
|
||||||
" --all-filters try all available preprocessing filters\n"
|
|
||||||
"\n");
|
"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,13 +310,13 @@ void show_help(int verbose)
|
|||||||
// "\nUPX comes with ABSOLUTELY NO WARRANTY; for details type 'upx -L'.\n"
|
// "\nUPX comes with ABSOLUTELY NO WARRANTY; for details type 'upx -L'.\n"
|
||||||
"");
|
"");
|
||||||
|
|
||||||
#if defined(DEBUG) || defined(TESTING)
|
#if (DEBUG) || (TESTING)
|
||||||
fg = con_fg(f,FG_RED);
|
fg = con_fg(f,FG_RED);
|
||||||
con_fprintf(f,"\nWARNING: this version is compiled with"
|
con_fprintf(f,"\nWARNING: this version is compiled with"
|
||||||
#if defined(DEBUG)
|
#if (DEBUG)
|
||||||
" -DDEBUG"
|
" -DDEBUG"
|
||||||
#endif
|
#endif
|
||||||
#if defined(TESTING)
|
#if (TESTING)
|
||||||
" -DTESTING"
|
" -DTESTING"
|
||||||
#endif
|
#endif
|
||||||
"\n");
|
"\n");
|
||||||
@@ -387,7 +360,7 @@ void show_license(void)
|
|||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
"\n"
|
"\n"
|
||||||
" Markus F.X.J. Oberhumer Laszlo Molnar\n"
|
" Markus F.X.J. Oberhumer Laszlo Molnar\n"
|
||||||
" <mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>\n"
|
" <markus@oberhumer.com> <ml1050@users.sourceforge.net>\n"
|
||||||
);
|
);
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
|
|
||||||
@@ -407,34 +380,34 @@ void show_version(int x)
|
|||||||
UNUSED(v);
|
UNUSED(v);
|
||||||
|
|
||||||
fprintf(fp, "upx %s\n", UPX_VERSION_STRING);
|
fprintf(fp, "upx %s\n", UPX_VERSION_STRING);
|
||||||
#if defined(WITH_NRV)
|
#if (WITH_NRV)
|
||||||
v = upx_nrv_version_string();
|
v = upx_nrv_version_string();
|
||||||
if (v != NULL && v[0])
|
if (v != NULL && v[0])
|
||||||
fprintf(fp, "NRV data compression library %s\n", v);
|
fprintf(fp, "NRV data compression library %s\n", v);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_UCL)
|
#if (WITH_UCL)
|
||||||
v = upx_ucl_version_string();
|
v = upx_ucl_version_string();
|
||||||
if (v != NULL && v[0])
|
if (v != NULL && v[0])
|
||||||
fprintf(fp, "UCL data compression library %s\n", v);
|
fprintf(fp, "UCL data compression library %s\n", v);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_ZLIB)
|
#if (WITH_ZLIB)
|
||||||
v = upx_zlib_version_string();
|
v = upx_zlib_version_string();
|
||||||
if (v != NULL && v[0])
|
if (v != NULL && v[0])
|
||||||
fprintf(fp, "zlib data compression library %s\n", v);
|
fprintf(fp, "zlib data compression library %s\n", v);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
v = upx_lzma_version_string();
|
v = upx_lzma_version_string();
|
||||||
if (v != NULL && v[0])
|
if (v != NULL && v[0])
|
||||||
fprintf(fp, "LZMA SDK version %s\n", v);
|
fprintf(fp, "LZMA SDK version %s\n", v);
|
||||||
#endif
|
#endif
|
||||||
fprintf(fp, "Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer\n");
|
fprintf(fp, "Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer\n");
|
||||||
fprintf(fp, "Copyright (C) 1996-2007 Laszlo Molnar\n");
|
fprintf(fp, "Copyright (C) 1996-2010 Laszlo Molnar\n");
|
||||||
fprintf(fp, "Copyright (C) 2000-2007 John F. Reiser\n");
|
fprintf(fp, "Copyright (C) 2000-2010 John F. Reiser\n");
|
||||||
fprintf(fp, "Copyright (C) 2002-2007 Jens Medoch\n");
|
fprintf(fp, "Copyright (C) 2002-2010 Jens Medoch\n");
|
||||||
#if defined(WITH_ZLIB)
|
#if (WITH_ZLIB)
|
||||||
fprintf(fp, "Copyright (C) 1995" "-2005 Jean-loup Gailly and Mark Adler\n");
|
fprintf(fp, "Copyright (C) 1995" "-2005 Jean-loup Gailly and Mark Adler\n");
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_LZMA)
|
#if (WITH_LZMA)
|
||||||
fprintf(fp, "Copyright (C) 1999" "-2006 Igor Pavlov\n");
|
fprintf(fp, "Copyright (C) 1999" "-2006 Igor Pavlov\n");
|
||||||
#endif
|
#endif
|
||||||
fprintf(fp, "UPX comes with ABSOLUTELY NO WARRANTY; for details type '%s -L'.\n", progname);
|
fprintf(fp, "UPX comes with ABSOLUTELY NO WARRANTY; for details type '%s -L'.\n", progname);
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+11
-16
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_LEFILE_H
|
#ifndef __UPX_LEFILE_H
|
||||||
#define __UPX_LEFILE_H
|
#define __UPX_LEFILE_H 1
|
||||||
|
|
||||||
class InputFile;
|
class InputFile;
|
||||||
class OutputFile;
|
class OutputFile;
|
||||||
@@ -49,8 +49,8 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
enum { FIXUP_EXTRA = 3 };
|
enum { FIXUP_EXTRA = 3 };
|
||||||
|
|
||||||
struct le_header_t
|
__packed_struct(le_header_t)
|
||||||
{ // 0x00
|
// 0x00
|
||||||
char _[2]; // signature: 'LE' || 'LX'
|
char _[2]; // signature: 'LE' || 'LX'
|
||||||
char byte_order; // 0 little endian
|
char byte_order; // 0 little endian
|
||||||
char word_order; // 0 little endian
|
char word_order; // 0 little endian
|
||||||
@@ -117,28 +117,23 @@ protected:
|
|||||||
LE16 device_id;
|
LE16 device_id;
|
||||||
LE16 ddk_version;
|
LE16 ddk_version;
|
||||||
#endif
|
#endif
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct le_object_table_entry_t
|
__packed_struct(le_object_table_entry_t)
|
||||||
{
|
|
||||||
LE32 virtual_size;
|
LE32 virtual_size;
|
||||||
LE32 base_address;
|
LE32 base_address;
|
||||||
LE32 flags;
|
LE32 flags;
|
||||||
LE32 pagemap_index;
|
LE32 pagemap_index;
|
||||||
LE32 npages;
|
LE32 npages;
|
||||||
LE32 reserved;
|
LE32 reserved;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct le_pagemap_entry_t
|
__packed_struct(le_pagemap_entry_t)
|
||||||
{
|
|
||||||
unsigned char h;
|
unsigned char h;
|
||||||
unsigned char m;
|
unsigned char m;
|
||||||
unsigned char l;
|
unsigned char l;
|
||||||
unsigned char type; // 0x00-legal;0x40-iterated;0x80-invalid;0xC0-zeroed
|
unsigned char type; // 0x00-legal;0x40-iterated;0x80-invalid;0xC0-zeroed
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
virtual void readObjectTable();
|
virtual void readObjectTable();
|
||||||
virtual void writeObjectTable();
|
virtual void writeObjectTable();
|
||||||
|
|||||||
+20
-13
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -240,7 +240,8 @@ void ElfLinker::preprocessSymbols(char *start, char *end)
|
|||||||
#if 0
|
#if 0
|
||||||
else if (sscanf(start, "%x%*8c %1023s %*x %1023s",
|
else if (sscanf(start, "%x%*8c %1023s %*x %1023s",
|
||||||
#else
|
#else
|
||||||
// work around broken scanf implementations
|
// work around broken scanf() implementations
|
||||||
|
// http://bugs.winehq.org/show_bug.cgi?id=10401 (fixed in Wine 0.9.58)
|
||||||
else if (sscanf(start, "%x%*c%*c%*c%*c%*c%*c%*c%*c %1023s %*x %1023s",
|
else if (sscanf(start, "%x%*c%*c%*c%*c%*c%*c%*c%*c %1023s %*x %1023s",
|
||||||
#endif
|
#endif
|
||||||
&offset, section, symbol) == 3)
|
&offset, section, symbol) == 3)
|
||||||
@@ -468,7 +469,7 @@ int ElfLinker::getSection(const char *sname, int *slen) const
|
|||||||
const Section *section = findSection(sname);
|
const Section *section = findSection(sname);
|
||||||
if (slen)
|
if (slen)
|
||||||
*slen = section->size;
|
*slen = section->size;
|
||||||
return section->output - output;
|
return (int) (section->output - output);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ElfLinker::getSectionSize(const char *sname) const
|
int ElfLinker::getSectionSize(const char *sname) const
|
||||||
@@ -678,7 +679,10 @@ void ElfLinkerArmBE::relocate1(const Relocation *rel, upx_byte *location,
|
|||||||
{
|
{
|
||||||
set_be32(location, get_be32(location) + value);
|
set_be32(location, get_be32(location) + value);
|
||||||
}
|
}
|
||||||
else if (strcmp(type, "R_ARM_THM_CALL") == 0)
|
else if (strcmp(type, "R_ARM_THM_CALL") == 0
|
||||||
|
|| strcmp(type, "R_ARM_THM_XPC22") == 0
|
||||||
|
|| strcmp(type, "R_ARM_THM_PC22") == 0
|
||||||
|
)
|
||||||
{
|
{
|
||||||
value -= rel->section->offset + rel->offset;
|
value -= rel->section->offset + rel->offset;
|
||||||
value += ((get_be16(location) & 0x7ff) << 12);
|
value += ((get_be16(location) & 0x7ff) << 12);
|
||||||
@@ -710,7 +714,10 @@ void ElfLinkerArmLE::relocate1(const Relocation *rel, upx_byte *location,
|
|||||||
{
|
{
|
||||||
set_le32(location, get_le32(location) + value);
|
set_le32(location, get_le32(location) + value);
|
||||||
}
|
}
|
||||||
else if (strcmp(type, "R_ARM_THM_CALL") == 0)
|
else if (strcmp(type, "R_ARM_THM_CALL") == 0
|
||||||
|
|| strcmp(type, "R_ARM_THM_XPC22") == 0
|
||||||
|
|| strcmp(type, "R_ARM_THM_PC22") == 0
|
||||||
|
)
|
||||||
{
|
{
|
||||||
value -= rel->section->offset + rel->offset;
|
value -= rel->section->offset + rel->offset;
|
||||||
value += ((get_le16(location) & 0x7ff) << 12);
|
value += ((get_le16(location) & 0x7ff) << 12);
|
||||||
@@ -774,18 +781,18 @@ void ElfLinkerMipsBE::relocate1(const Relocation *rel, upx_byte *location,
|
|||||||
#define MIPS_PC26(a) (((a) & 0x0fffffff) >> 2)
|
#define MIPS_PC26(a) (((a) & 0x0fffffff) >> 2)
|
||||||
|
|
||||||
if (strcmp(type, "R_MIPS_HI16") == 0)
|
if (strcmp(type, "R_MIPS_HI16") == 0)
|
||||||
set_le16(location, get_le16(location) + MIPS_HI(value));
|
set_be16(2+location, get_be16(2+location) + MIPS_HI(value));
|
||||||
else if (strcmp(type, "R_MIPS_LO16") == 0)
|
else if (strcmp(type, "R_MIPS_LO16") == 0)
|
||||||
set_le16(location, get_le16(location) + MIPS_LO(value));
|
set_be16(2+location, get_be16(2+location) + MIPS_LO(value));
|
||||||
else if (strcmp(type, "R_MIPS_PC16") == 0)
|
else if (strcmp(type, "R_MIPS_PC16") == 0)
|
||||||
{
|
{
|
||||||
value -= rel->section->offset + rel->offset;
|
value -= rel->section->offset + rel->offset;
|
||||||
set_le16(location, get_le16(location) + MIPS_PC16(value));
|
set_be16(2+location, get_be16(2+location) + MIPS_PC16(value));
|
||||||
}
|
}
|
||||||
else if (strcmp(type, "R_MIPS_26") == 0)
|
else if (strcmp(type, "R_MIPS_26") == 0)
|
||||||
set_le32(location, get_le32(location) + MIPS_PC26(value));
|
set_be32(location, get_be32(location) + MIPS_PC26(value));
|
||||||
else if (strcmp(type, "R_MIPS_32") == 0)
|
else if (strcmp(type, "R_MIPS_32") == 0)
|
||||||
set_le32(location, get_le32(location) + value);
|
set_be32(location, get_be32(location) + value);
|
||||||
else
|
else
|
||||||
super::relocate1(rel, location, value, type);
|
super::relocate1(rel, location, value, type);
|
||||||
|
|
||||||
|
|||||||
+14
-6
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_LINKER_H
|
#ifndef __UPX_LINKER_H
|
||||||
#define __UPX_LINKER_H
|
#define __UPX_LINKER_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -38,7 +38,7 @@ class ElfLinker : private noncopyable
|
|||||||
{
|
{
|
||||||
friend class Packer;
|
friend class Packer;
|
||||||
public:
|
public:
|
||||||
const N_BELE_RTP::AbstractPolicy *bele;
|
const N_BELE_RTP::AbstractPolicy *bele; // target endianness
|
||||||
protected:
|
protected:
|
||||||
struct Section;
|
struct Section;
|
||||||
struct Symbol;
|
struct Symbol;
|
||||||
@@ -107,6 +107,14 @@ protected:
|
|||||||
virtual void relocate();
|
virtual void relocate();
|
||||||
virtual void relocate1(const Relocation *, upx_byte *location,
|
virtual void relocate1(const Relocation *, upx_byte *location,
|
||||||
unsigned value, const char *type);
|
unsigned value, const char *type);
|
||||||
|
|
||||||
|
// target endianness abstraction
|
||||||
|
unsigned get_te16(const void *p) const { return bele->get16(p); }
|
||||||
|
unsigned get_te32(const void *p) const { return bele->get32(p); }
|
||||||
|
acc_uint64l_t get_te64(const void *p) const { return bele->get64(p); }
|
||||||
|
void set_te16(void *p, unsigned v) const { bele->set16(p, v); }
|
||||||
|
void set_te32(void *p, unsigned v) const { bele->set32(p, v); }
|
||||||
|
void set_te64(void *p, acc_uint64l_t v) const { bele->set64(p, v); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+79
-27
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,11 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "mygetopt.h"
|
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "packer.h"
|
#include "packer.h"
|
||||||
#include "p_elf.h"
|
#include "p_elf.h"
|
||||||
@@ -63,7 +62,7 @@ void options_t::reset()
|
|||||||
o->console = CON_FILE;
|
o->console = CON_FILE;
|
||||||
#if defined(__DJGPP__)
|
#if defined(__DJGPP__)
|
||||||
o->console = CON_INIT;
|
o->console = CON_INIT;
|
||||||
#elif defined(USE_SCREEN_WIN32)
|
#elif (USE_SCREEN_WIN32)
|
||||||
o->console = CON_INIT;
|
o->console = CON_INIT;
|
||||||
#elif 1 && defined(__linux__)
|
#elif 1 && defined(__linux__)
|
||||||
o->console = CON_INIT;
|
o->console = CON_INIT;
|
||||||
@@ -90,6 +89,19 @@ static int done_script_name = 0;
|
|||||||
const char *argv0 = "";
|
const char *argv0 = "";
|
||||||
const char *progname = "";
|
const char *progname = "";
|
||||||
|
|
||||||
|
static acc_getopt_t mfx_getopt;
|
||||||
|
#define mfx_optarg mfx_getopt.optarg
|
||||||
|
#define mfx_optind mfx_getopt.optind
|
||||||
|
#define mfx_option acc_getopt_longopt_t
|
||||||
|
static void handle_opterr(acc_getopt_p g, const char *f, void *v)
|
||||||
|
{
|
||||||
|
struct A { va_list ap; };
|
||||||
|
struct A *a = (struct A *) v;
|
||||||
|
fprintf( stderr, "%s: ", g->progname);
|
||||||
|
vfprintf(stderr, f, a->ap);
|
||||||
|
fprintf( stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int num_files = -1;
|
static int num_files = -1;
|
||||||
static int exit_code = EXIT_OK;
|
static int exit_code = EXIT_OK;
|
||||||
@@ -633,6 +645,17 @@ static int do_option(int optc, const char *arg)
|
|||||||
opt->debug.disable_random_id = true;
|
opt->debug.disable_random_id = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// mp (meta)
|
||||||
|
case 501:
|
||||||
|
getoptvar(&opt->mp_compress_task, 1, 999999, arg);
|
||||||
|
break;
|
||||||
|
case 502:
|
||||||
|
opt->mp_query_format = true;
|
||||||
|
break;
|
||||||
|
case 503:
|
||||||
|
opt->mp_query_num_tasks = true;
|
||||||
|
break;
|
||||||
|
|
||||||
// misc
|
// misc
|
||||||
case 512:
|
case 512:
|
||||||
opt->console = CON_FILE;
|
opt->console = CON_FILE;
|
||||||
@@ -870,7 +893,10 @@ static int do_option(int optc, const char *arg)
|
|||||||
opt->ps1_exe.do_8bit = true;
|
opt->ps1_exe.do_8bit = true;
|
||||||
break;
|
break;
|
||||||
case 673:
|
case 673:
|
||||||
opt->ps1_exe.do_8mb = false;
|
opt->ps1_exe.do_8mib = false;
|
||||||
|
break;
|
||||||
|
case 674:
|
||||||
|
opt->o_unix.unmap_all_pages = true; // val ?
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '\0':
|
case '\0':
|
||||||
@@ -1021,6 +1047,7 @@ static const struct mfx_option longopts[] =
|
|||||||
{"netbsd", 0x10, 0, 668},
|
{"netbsd", 0x10, 0, 668},
|
||||||
{"OpenBSD", 0x10, 0, 669},
|
{"OpenBSD", 0x10, 0, 669},
|
||||||
{"openbsd", 0x10, 0, 669},
|
{"openbsd", 0x10, 0, 669},
|
||||||
|
{"unmap-all-pages", 0x10, 0, 674}, // linux /proc/self/exe vanishes
|
||||||
// watcom/le
|
// watcom/le
|
||||||
{"le", 0x10, 0, 620}, // produce LE output
|
{"le", 0x10, 0, 620}, // produce LE output
|
||||||
// win32/pe
|
// win32/pe
|
||||||
@@ -1034,19 +1061,26 @@ static const struct mfx_option longopts[] =
|
|||||||
{"boot-only", 0x10, 0, 670},
|
{"boot-only", 0x10, 0, 670},
|
||||||
{"no-align", 0x10, 0, 671},
|
{"no-align", 0x10, 0, 671},
|
||||||
{"8-bit", 0x10, 0, 672},
|
{"8-bit", 0x10, 0, 672},
|
||||||
|
{"8mib-ram", 0x10, 0, 673},
|
||||||
{"8mb-ram", 0x10, 0, 673},
|
{"8mb-ram", 0x10, 0, 673},
|
||||||
|
|
||||||
|
// mp (meta) options
|
||||||
|
{"mp-compress-task", 0x31, 0, 501},
|
||||||
|
{"mp-query-format", 0x10, 0, 502},
|
||||||
|
{"mp-query-num-tasks", 0x10, 0, 503},
|
||||||
|
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
int optc, longind;
|
int optc, longind;
|
||||||
char buf[256];
|
char shortopts[256];
|
||||||
|
|
||||||
prepare_shortopts(buf,"123456789hH?V",longopts),
|
prepare_shortopts(shortopts, "123456789hH?V", longopts),
|
||||||
mfx_optind = 0;
|
acc_getopt_init(&mfx_getopt, 1, argc, argv);
|
||||||
mfx_opterr = 1;
|
mfx_getopt.progname = progname;
|
||||||
|
mfx_getopt.opterr = handle_opterr;
|
||||||
opt->o_unix.osabi0 = Elf32_Ehdr::ELFOSABI_LINUX;
|
opt->o_unix.osabi0 = Elf32_Ehdr::ELFOSABI_LINUX;
|
||||||
while ((optc = mfx_getopt_long(argc, argv, buf, longopts, &longind)) >= 0)
|
while ((optc = acc_getopt(&mfx_getopt, shortopts, longopts, &longind)) >= 0)
|
||||||
{
|
{
|
||||||
if (do_option(optc, argv[mfx_optind-1]) != 0)
|
if (do_option(optc, argv[mfx_optind-1]) != 0)
|
||||||
e_usage();
|
e_usage();
|
||||||
@@ -1132,7 +1166,7 @@ static const struct mfx_option longopts[] =
|
|||||||
int targc;
|
int targc;
|
||||||
char **targv = NULL;
|
char **targv = NULL;
|
||||||
static const char sep[] = " \t";
|
static const char sep[] = " \t";
|
||||||
char buf[256];
|
char shortopts[256];
|
||||||
|
|
||||||
var = getenv(OPTIONS_VAR);
|
var = getenv(OPTIONS_VAR);
|
||||||
if (var == NULL || !var[0])
|
if (var == NULL || !var[0])
|
||||||
@@ -1188,10 +1222,11 @@ static const struct mfx_option longopts[] =
|
|||||||
e_envopt(targv[i]);
|
e_envopt(targv[i]);
|
||||||
|
|
||||||
/* handle options */
|
/* handle options */
|
||||||
prepare_shortopts(buf,"123456789",longopts);
|
prepare_shortopts(shortopts, "123456789", longopts);
|
||||||
mfx_optind = 0;
|
acc_getopt_init(&mfx_getopt, 1, targc, targv);
|
||||||
mfx_opterr = 1;
|
mfx_getopt.progname = progname;
|
||||||
while ((optc = mfx_getopt_long(targc, targv, buf, longopts, &longind)) >= 0)
|
mfx_getopt.opterr = handle_opterr;
|
||||||
|
while ((optc = acc_getopt(&mfx_getopt, shortopts, longopts, &longind)) >= 0)
|
||||||
{
|
{
|
||||||
if (do_option(optc, targv[mfx_optind-1]) != 0)
|
if (do_option(optc, targv[mfx_optind-1]) != 0)
|
||||||
e_envopt(NULL);
|
e_envopt(NULL);
|
||||||
@@ -1240,8 +1275,8 @@ template <class T> struct TestBELE {
|
|||||||
static bool test(void)
|
static bool test(void)
|
||||||
{
|
{
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(T)
|
COMPILE_TIME_ASSERT_ALIGNED1(T)
|
||||||
struct test1_t { char a; T b; } __attribute_packed;
|
__packed_struct(test1_t) char a; T b; __packed_struct_end()
|
||||||
struct test2_t { char a; T b[3]; } __attribute_packed;
|
__packed_struct(test2_t) char a; T b[3]; __packed_struct_end()
|
||||||
test1_t t1[7]; UNUSED(t1); test2_t t2[7]; UNUSED(t2);
|
test1_t t1[7]; UNUSED(t1); test2_t t2[7]; UNUSED(t2);
|
||||||
COMPILE_TIME_ASSERT(sizeof(test1_t) == 1 + sizeof(T))
|
COMPILE_TIME_ASSERT(sizeof(test1_t) == 1 + sizeof(T))
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(test1_t)
|
COMPILE_TIME_ASSERT_ALIGNED1(test1_t)
|
||||||
@@ -1253,7 +1288,11 @@ static bool test(void)
|
|||||||
COMPILE_TIME_ASSERT(__acc_alignof(t1) == 1)
|
COMPILE_TIME_ASSERT(__acc_alignof(t1) == 1)
|
||||||
COMPILE_TIME_ASSERT(__acc_alignof(t2) == 1)
|
COMPILE_TIME_ASSERT(__acc_alignof(t2) == 1)
|
||||||
#endif
|
#endif
|
||||||
#if 1 && !defined(xUPX_OFFICIAL_BUILD)
|
#if 1 && (ACC_CC_WATCOMC)
|
||||||
|
test1_t t11; COMPILE_TIME_ASSERT(sizeof(t11.a) <= sizeof(t11.b))
|
||||||
|
test2_t t22; COMPILE_TIME_ASSERT(sizeof(t22.a) <= sizeof(t22.b))
|
||||||
|
#endif
|
||||||
|
#if 1 && !defined(UPX_OFFICIAL_BUILD)
|
||||||
T allbits; allbits = 0; allbits -= 1;
|
T allbits; allbits = 0; allbits -= 1;
|
||||||
//++allbits; allbits++; --allbits; allbits--;
|
//++allbits; allbits++; --allbits; allbits--;
|
||||||
T v1; v1 = 1; v1 *= 2; v1 -= 1;
|
T v1; v1 = 1; v1 *= 2; v1 -= 1;
|
||||||
@@ -1326,27 +1365,40 @@ void upx_sanity_check(void)
|
|||||||
assert(TestBELE<BE32>::test());
|
assert(TestBELE<BE32>::test());
|
||||||
assert(TestBELE<BE64>::test());
|
assert(TestBELE<BE64>::test());
|
||||||
{
|
{
|
||||||
static const unsigned char dd[32] = { 0, 0, 0, 0, 0, 0, 0,
|
static const unsigned char dd[32]
|
||||||
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
#if 1 && (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_PATHSCALE) && defined(__ELF__)
|
||||||
0, 0, 0, 0,
|
__attribute__((__aligned__(16)))
|
||||||
0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
|
#endif
|
||||||
|
= { 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
|
||||||
0, 0, 0, 0, 0 };
|
0, 0, 0, 0, 0 };
|
||||||
const unsigned char *d;
|
const unsigned char *d;
|
||||||
|
const N_BELE_RTP::AbstractPolicy *bele;
|
||||||
d = dd + 7;
|
d = dd + 7;
|
||||||
assert(upx_adler32(d, 4) == 0x09f003f7);
|
assert(upx_adler32(d, 4) == 0x09f003f7);
|
||||||
assert(upx_adler32(d, 4, 0) == 0x09ec03f6);
|
assert(upx_adler32(d, 4, 0) == 0x09ec03f6);
|
||||||
assert(upx_adler32(d, 4, 1) == 0x09f003f7);
|
assert(upx_adler32(d, 4, 1) == 0x09f003f7);
|
||||||
|
bele = &N_BELE_RTP::be_policy;
|
||||||
assert(get_be16(d) == 0xfffe);
|
assert(get_be16(d) == 0xfffe);
|
||||||
|
assert(bele->get16(d) == 0xfffe);
|
||||||
assert(get_be16_signed(d) == -2);
|
assert(get_be16_signed(d) == -2);
|
||||||
assert(get_be24(d) == 0xfffefd);
|
assert(get_be24(d) == 0xfffefd);
|
||||||
|
assert(bele->get24(d) == 0xfffefd);
|
||||||
assert(get_be24_signed(d) == -259);
|
assert(get_be24_signed(d) == -259);
|
||||||
assert(get_be32(d) == 0xfffefdfc);
|
assert(get_be32(d) == 0xfffefdfc);
|
||||||
|
assert(bele->get32(d) == 0xfffefdfc);
|
||||||
assert(get_be32_signed(d) == -66052);
|
assert(get_be32_signed(d) == -66052);
|
||||||
|
bele = &N_BELE_RTP::le_policy;
|
||||||
assert(get_le16(d) == 0xfeff);
|
assert(get_le16(d) == 0xfeff);
|
||||||
|
assert(bele->get16(d) == 0xfeff);
|
||||||
assert(get_le16_signed(d) == -257);
|
assert(get_le16_signed(d) == -257);
|
||||||
assert(get_le24(d) == 0xfdfeff);
|
assert(get_le24(d) == 0xfdfeff);
|
||||||
|
assert(bele->get24(d) == 0xfdfeff);
|
||||||
assert(get_le24_signed(d) == -131329);
|
assert(get_le24_signed(d) == -131329);
|
||||||
assert(get_le32(d) == 0xfcfdfeff);
|
assert(get_le32(d) == 0xfcfdfeff);
|
||||||
|
assert(bele->get32(d) == 0xfcfdfeff);
|
||||||
assert(get_le32_signed(d) == -50462977);
|
assert(get_le32_signed(d) == -50462977);
|
||||||
assert(get_le64_signed(d) == ACC_INT64_C(-506097522914230529));
|
assert(get_le64_signed(d) == ACC_INT64_C(-506097522914230529));
|
||||||
assert(find_be16(d, 2, 0xfffe) == 0);
|
assert(find_be16(d, 2, 0xfffe) == 0);
|
||||||
@@ -1367,7 +1419,7 @@ void upx_sanity_check(void)
|
|||||||
// main entry point
|
// main entry point
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#if !defined(WITH_GUI)
|
#if !(WITH_GUI)
|
||||||
|
|
||||||
#if (ACC_ARCH_M68K && ACC_OS_TOS && ACC_CC_GNUC) && defined(__MINT__)
|
#if (ACC_ARCH_M68K && ACC_OS_TOS && ACC_CC_GNUC) && defined(__MINT__)
|
||||||
extern "C" { extern long _stksize; long _stksize = 256 * 1024L; }
|
extern "C" { extern long _stksize; long _stksize = 256 * 1024L; }
|
||||||
@@ -1417,7 +1469,7 @@ int __acc_cdecl_main main(int argc, char *argv[])
|
|||||||
|
|
||||||
set_term(stderr);
|
set_term(stderr);
|
||||||
|
|
||||||
#if defined(WITH_UCL)
|
#if (WITH_UCL)
|
||||||
if (ucl_init() != UCL_E_OK)
|
if (ucl_init() != UCL_E_OK)
|
||||||
{
|
{
|
||||||
show_head();
|
show_head();
|
||||||
@@ -1428,7 +1480,7 @@ int __acc_cdecl_main main(int argc, char *argv[])
|
|||||||
e_exit(EXIT_INIT);
|
e_exit(EXIT_INIT);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(WITH_NRV)
|
#if (WITH_NRV)
|
||||||
if (nrv_init() != NRV_E_OK || NRV_VERSION != nrv_version())
|
if (nrv_init() != NRV_E_OK || NRV_VERSION != nrv_version())
|
||||||
{
|
{
|
||||||
show_head();
|
show_head();
|
||||||
@@ -1521,7 +1573,7 @@ int __acc_cdecl_main main(int argc, char *argv[])
|
|||||||
return exit_code;
|
return exit_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !defined(WITH_GUI) */
|
#endif /* !(WITH_GUI) */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ static int mcheck_init()
|
|||||||
if (use_mcheck < 0)
|
if (use_mcheck < 0)
|
||||||
{
|
{
|
||||||
use_mcheck = 1;
|
use_mcheck = 1;
|
||||||
#if defined(WITH_VALGRIND) && defined(RUNNING_ON_VALGRIND)
|
#if (WITH_VALGRIND) && defined(RUNNING_ON_VALGRIND)
|
||||||
if (RUNNING_ON_VALGRIND)
|
if (RUNNING_ON_VALGRIND)
|
||||||
{
|
{
|
||||||
//fprintf(stderr, "upx: detected RUNNING_ON_VALGRIND\n");
|
//fprintf(stderr, "upx: detected RUNNING_ON_VALGRIND\n");
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_MEM_H
|
#ifndef __UPX_MEM_H
|
||||||
#define __UPX_MEM_H
|
#define __UPX_MEM_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+547
-352
File diff suppressed because it is too large
Load Diff
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ void printClearLine(FILE *f)
|
|||||||
fflush(stdout); fflush(stderr);
|
fflush(stdout); fflush(stderr);
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
f = stdout;
|
f = stdout;
|
||||||
con_fprintf(f,clear_line_msg);
|
con_fprintf(f, "%s", clear_line_msg);
|
||||||
fflush(f);
|
fflush(f);
|
||||||
printSetNl(0);
|
printSetNl(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,706 +0,0 @@
|
|||||||
/* Getopt for GNU.
|
|
||||||
NOTE: getopt is now part of the C library, so if you don't know what
|
|
||||||
"Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
|
|
||||||
before changing it!
|
|
||||||
|
|
||||||
Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
|
|
||||||
Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by the
|
|
||||||
Free Software Foundation; either version 2, or (at your option) any
|
|
||||||
later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#undef PROGNAME
|
|
||||||
#if 0
|
|
||||||
#ifndef EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
#define PROGNAME(x) (x)
|
|
||||||
#else
|
|
||||||
#include "conf.h"
|
|
||||||
static const char *my_progname(const char *argv0)
|
|
||||||
{
|
|
||||||
return progname ? progname : argv0;
|
|
||||||
}
|
|
||||||
#define PROGNAME(x) my_progname(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
|
|
||||||
long-named option. Because this is not POSIX.2 compliant, it is
|
|
||||||
being phased out. */
|
|
||||||
/* #define GETOPT_COMPAT */
|
|
||||||
#undef GETOPT_COMPAT
|
|
||||||
|
|
||||||
/* This version of `getopt' appears to the caller like standard Unix `getopt'
|
|
||||||
but it behaves differently for the user, since it allows the user
|
|
||||||
to intersperse the options with the other arguments.
|
|
||||||
|
|
||||||
As `getopt' works, it permutes the elements of ARGV so that,
|
|
||||||
when it is done, all the options precede everything else. Thus
|
|
||||||
all application programs are extended to handle flexible argument order.
|
|
||||||
|
|
||||||
Setting the environment variable POSIXLY_CORRECT disables permutation.
|
|
||||||
Then the behavior is completely standard.
|
|
||||||
|
|
||||||
GNU application programs can use a third alternative mode in which
|
|
||||||
they can distinguish the relative order of options and other arguments. */
|
|
||||||
|
|
||||||
#include "mygetopt.h"
|
|
||||||
#define option mfx_option
|
|
||||||
#define optarg mfx_optarg
|
|
||||||
#define optind mfx_optind
|
|
||||||
#define opterr mfx_opterr
|
|
||||||
#define optopt mfx_optopt
|
|
||||||
#undef BAD_OPTION
|
|
||||||
|
|
||||||
/* For communication from `getopt' to the caller.
|
|
||||||
When `getopt' finds an option that takes an argument,
|
|
||||||
the argument value is returned here.
|
|
||||||
Also, when `ordering' is RETURN_IN_ORDER,
|
|
||||||
each non-option ARGV-element is returned here. */
|
|
||||||
|
|
||||||
char *optarg = NULL;
|
|
||||||
|
|
||||||
/* Index in ARGV of the next element to be scanned.
|
|
||||||
This is used for communication to and from the caller
|
|
||||||
and for communication between successive calls to `getopt'.
|
|
||||||
|
|
||||||
On entry to `getopt', zero means this is the first call; initialize.
|
|
||||||
|
|
||||||
When `getopt' returns EOF, this is the index of the first of the
|
|
||||||
non-option elements that the caller should itself scan.
|
|
||||||
|
|
||||||
Otherwise, `optind' communicates from one call to the next
|
|
||||||
how much of ARGV has been scanned so far. */
|
|
||||||
|
|
||||||
/* XXX 1003.2 says this must be 1 before any call. */
|
|
||||||
int optind = 0;
|
|
||||||
|
|
||||||
/* The next char to be scanned in the option-element
|
|
||||||
in which the last option character we returned was found.
|
|
||||||
This allows us to pick up the scan where we left off.
|
|
||||||
|
|
||||||
If this is zero, or a null string, it means resume the scan
|
|
||||||
by advancing to the next ARGV-element. */
|
|
||||||
|
|
||||||
static char *nextchar;
|
|
||||||
|
|
||||||
/* Callers store zero here to inhibit the error message
|
|
||||||
for unrecognized options. */
|
|
||||||
|
|
||||||
int opterr = 1;
|
|
||||||
|
|
||||||
/* Set to an option character which was unrecognized.
|
|
||||||
This must be initialized on some systems to avoid linking in the
|
|
||||||
system's own getopt implementation. */
|
|
||||||
|
|
||||||
#define BAD_OPTION '\0'
|
|
||||||
int optopt = BAD_OPTION;
|
|
||||||
|
|
||||||
/* Describe how to deal with options that follow non-option ARGV-elements.
|
|
||||||
|
|
||||||
If the caller did not specify anything,
|
|
||||||
the default is REQUIRE_ORDER if the environment variable
|
|
||||||
POSIXLY_CORRECT is defined, PERMUTE otherwise.
|
|
||||||
|
|
||||||
REQUIRE_ORDER means don't recognize them as options;
|
|
||||||
stop option processing when the first non-option is seen.
|
|
||||||
This is what Unix does.
|
|
||||||
This mode of operation is selected by either setting the environment
|
|
||||||
variable POSIXLY_CORRECT, or using `+' as the first character
|
|
||||||
of the list of option characters.
|
|
||||||
|
|
||||||
PERMUTE is the default. We permute the contents of ARGV as we scan,
|
|
||||||
so that eventually all the non-options are at the end. This allows options
|
|
||||||
to be given in any order, even with programs that were not written to
|
|
||||||
expect this.
|
|
||||||
|
|
||||||
RETURN_IN_ORDER is an option available to programs that were written
|
|
||||||
to expect options and other ARGV-elements in any order and that care about
|
|
||||||
the ordering of the two. We describe each non-option ARGV-element
|
|
||||||
as if it were the argument of an option with character code 1.
|
|
||||||
Using `-' as the first character of the list of option characters
|
|
||||||
selects this mode of operation.
|
|
||||||
|
|
||||||
The special argument `--' forces an end of option-scanning regardless
|
|
||||||
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
|
||||||
`--' can cause `getopt' to return EOF with `optind' != ARGC. */
|
|
||||||
|
|
||||||
static enum
|
|
||||||
{
|
|
||||||
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
|
||||||
} ordering;
|
|
||||||
|
|
||||||
/* Handle permutation of arguments. */
|
|
||||||
|
|
||||||
/* Describe the part of ARGV that contains non-options that have
|
|
||||||
been skipped. `first_nonopt' is the index in ARGV of the first of them;
|
|
||||||
`last_nonopt' is the index after the last of them. */
|
|
||||||
|
|
||||||
static int first_nonopt;
|
|
||||||
static int last_nonopt;
|
|
||||||
|
|
||||||
/* Exchange two adjacent subsequences of ARGV.
|
|
||||||
One subsequence is elements [first_nonopt,last_nonopt)
|
|
||||||
which contains all the non-options that have been skipped so far.
|
|
||||||
The other is elements [last_nonopt,optind), which contains all
|
|
||||||
the options processed since those non-options were skipped.
|
|
||||||
|
|
||||||
`first_nonopt' and `last_nonopt' are relocated so that they describe
|
|
||||||
the new indices of the non-options in ARGV after they are moved.
|
|
||||||
|
|
||||||
To perform the swap, we first reverse the order of all elements. So
|
|
||||||
all options now come before all non options, but they are in the
|
|
||||||
wrong order. So we put back the options and non options in original
|
|
||||||
order by reversing them again. For example:
|
|
||||||
original input: a b c -x -y
|
|
||||||
reverse all: -y -x c b a
|
|
||||||
reverse options: -x -y c b a
|
|
||||||
reverse non options: -x -y a b c
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static void exchange (char **argv)
|
|
||||||
{
|
|
||||||
char *temp; char **first, **last;
|
|
||||||
|
|
||||||
/* Reverse all the elements [first_nonopt, optind) */
|
|
||||||
first = &argv[first_nonopt];
|
|
||||||
last = &argv[optind-1];
|
|
||||||
while (first < last) {
|
|
||||||
temp = *first; *first = *last; *last = temp; first++; last--;
|
|
||||||
}
|
|
||||||
/* Put back the options in order */
|
|
||||||
first = &argv[first_nonopt];
|
|
||||||
first_nonopt += (optind - last_nonopt);
|
|
||||||
last = &argv[first_nonopt - 1];
|
|
||||||
while (first < last) {
|
|
||||||
temp = *first; *first = *last; *last = temp; first++; last--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Put back the non options in order */
|
|
||||||
first = &argv[first_nonopt];
|
|
||||||
last_nonopt = optind;
|
|
||||||
last = &argv[last_nonopt-1];
|
|
||||||
while (first < last) {
|
|
||||||
temp = *first; *first = *last; *last = temp; first++; last--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Scan elements of ARGV (whose length is ARGC) for option characters
|
|
||||||
given in OPTSTRING.
|
|
||||||
|
|
||||||
If an element of ARGV starts with '-', and is not exactly "-" or "--",
|
|
||||||
then it is an option element. The characters of this element
|
|
||||||
(aside from the initial '-') are option characters. If `getopt'
|
|
||||||
is called repeatedly, it returns successively each of the option characters
|
|
||||||
from each of the option elements.
|
|
||||||
|
|
||||||
If `getopt' finds another option character, it returns that character,
|
|
||||||
updating `optind' and `nextchar' so that the next call to `getopt' can
|
|
||||||
resume the scan with the following option character or ARGV-element.
|
|
||||||
|
|
||||||
If there are no more option characters, `getopt' returns `EOF'.
|
|
||||||
Then `optind' is the index in ARGV of the first ARGV-element
|
|
||||||
that is not an option. (The ARGV-elements have been permuted
|
|
||||||
so that those that are not options now come last.)
|
|
||||||
|
|
||||||
OPTSTRING is a string containing the legitimate option characters.
|
|
||||||
If an option character is seen that is not listed in OPTSTRING,
|
|
||||||
return BAD_OPTION after printing an error message. If you set `opterr' to
|
|
||||||
zero, the error message is suppressed but we still return BAD_OPTION.
|
|
||||||
|
|
||||||
If a char in OPTSTRING is followed by a colon, that means it wants an arg,
|
|
||||||
so the following text in the same ARGV-element, or the text of the following
|
|
||||||
ARGV-element, is returned in `optarg'. Two colons mean an option that
|
|
||||||
wants an optional arg; if there is text in the current ARGV-element,
|
|
||||||
it is returned in `optarg', otherwise `optarg' is set to zero.
|
|
||||||
|
|
||||||
If OPTSTRING starts with `-' or `+', it requests different methods of
|
|
||||||
handling the non-option ARGV-elements.
|
|
||||||
See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
|
|
||||||
|
|
||||||
Long-named options begin with `--' instead of `-'.
|
|
||||||
Their names may be abbreviated as long as the abbreviation is unique
|
|
||||||
or is an exact match for some defined option. If they have an
|
|
||||||
argument, it follows the option name in the same ARGV-element, separated
|
|
||||||
from the option name by a `=', or else the in next ARGV-element.
|
|
||||||
When `getopt' finds a long-named option, it returns 0 if that option's
|
|
||||||
`flag' field is nonzero, the value of the option's `val' field
|
|
||||||
if the `flag' field is zero.
|
|
||||||
|
|
||||||
LONGOPTS is a vector of `struct option' terminated by an
|
|
||||||
element containing a name which is zero.
|
|
||||||
|
|
||||||
LONGIND returns the index in LONGOPT of the long-named option found.
|
|
||||||
It is only valid when a long-named option has been found by the most
|
|
||||||
recent call.
|
|
||||||
|
|
||||||
If LONG_ONLY is nonzero, '-' as well as '--' can introduce
|
|
||||||
long-named options. */
|
|
||||||
|
|
||||||
static int _getopt_internal (int argc, char **argv, const char *optstring,
|
|
||||||
const struct option *longopts, int *longind,
|
|
||||||
int long_only)
|
|
||||||
{
|
|
||||||
static char empty_string[1];
|
|
||||||
int option_index;
|
|
||||||
|
|
||||||
if (longind != NULL)
|
|
||||||
*longind = -1;
|
|
||||||
|
|
||||||
optarg = 0;
|
|
||||||
|
|
||||||
/* Initialize the internal data when the first call is made.
|
|
||||||
Start processing options with ARGV-element 1 (since ARGV-element 0
|
|
||||||
is the program name); the sequence of previously skipped
|
|
||||||
non-option ARGV-elements is empty. */
|
|
||||||
|
|
||||||
if (optind == 0)
|
|
||||||
{
|
|
||||||
first_nonopt = last_nonopt = optind = 1;
|
|
||||||
|
|
||||||
nextchar = NULL;
|
|
||||||
|
|
||||||
/* Determine how to handle the ordering of options and nonoptions. */
|
|
||||||
|
|
||||||
if (optstring[0] == '-')
|
|
||||||
{
|
|
||||||
ordering = RETURN_IN_ORDER;
|
|
||||||
++optstring;
|
|
||||||
}
|
|
||||||
else if (optstring[0] == '+')
|
|
||||||
{
|
|
||||||
ordering = REQUIRE_ORDER;
|
|
||||||
++optstring;
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
else if (getenv ("POSIXLY_CORRECT") != NULL)
|
|
||||||
ordering = REQUIRE_ORDER;
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
ordering = PERMUTE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nextchar == NULL || *nextchar == '\0')
|
|
||||||
{
|
|
||||||
if (ordering == PERMUTE)
|
|
||||||
{
|
|
||||||
/* If we have just processed some options following some non-options,
|
|
||||||
exchange them so that the options come first. */
|
|
||||||
|
|
||||||
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
|
||||||
exchange (argv);
|
|
||||||
else if (last_nonopt != optind)
|
|
||||||
first_nonopt = optind;
|
|
||||||
|
|
||||||
/* Now skip any additional non-options
|
|
||||||
and extend the range of non-options previously skipped. */
|
|
||||||
|
|
||||||
while (optind < argc
|
|
||||||
&& (argv[optind][0] != '-' || argv[optind][1] == '\0')
|
|
||||||
#ifdef GETOPT_COMPAT
|
|
||||||
&& (longopts == NULL
|
|
||||||
|| argv[optind][0] != '+' || argv[optind][1] == '\0')
|
|
||||||
#endif /* GETOPT_COMPAT */
|
|
||||||
)
|
|
||||||
optind++;
|
|
||||||
last_nonopt = optind;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Special ARGV-element `--' means premature end of options.
|
|
||||||
Skip it like a null option,
|
|
||||||
then exchange with previous non-options as if it were an option,
|
|
||||||
then skip everything else like a non-option. */
|
|
||||||
|
|
||||||
if (optind != argc && !strcmp (argv[optind], "--"))
|
|
||||||
{
|
|
||||||
optind++;
|
|
||||||
|
|
||||||
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
|
||||||
exchange (argv);
|
|
||||||
else if (first_nonopt == last_nonopt)
|
|
||||||
first_nonopt = optind;
|
|
||||||
last_nonopt = argc;
|
|
||||||
|
|
||||||
optind = argc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we have done all the ARGV-elements, stop the scan
|
|
||||||
and back over any non-options that we skipped and permuted. */
|
|
||||||
|
|
||||||
if (optind == argc)
|
|
||||||
{
|
|
||||||
/* Set the next-arg-index to point at the non-options
|
|
||||||
that we previously skipped, so the caller will digest them. */
|
|
||||||
if (first_nonopt != last_nonopt)
|
|
||||||
optind = first_nonopt;
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we have come to a non-option and did not permute it,
|
|
||||||
either stop the scan or describe it to the caller and pass it by. */
|
|
||||||
|
|
||||||
if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
|
|
||||||
#ifdef GETOPT_COMPAT
|
|
||||||
&& (longopts == NULL
|
|
||||||
|| argv[optind][0] != '+' || argv[optind][1] == '\0')
|
|
||||||
#endif /* GETOPT_COMPAT */
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (ordering == REQUIRE_ORDER)
|
|
||||||
return EOF;
|
|
||||||
optarg = argv[optind++];
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We have found another option-ARGV-element.
|
|
||||||
Start decoding its characters. */
|
|
||||||
|
|
||||||
nextchar = (argv[optind] + 1
|
|
||||||
+ (longopts != NULL && argv[optind][1] == '-'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (longopts != NULL
|
|
||||||
&& ((argv[optind][0] == '-'
|
|
||||||
&& (argv[optind][1] == '-' || long_only))
|
|
||||||
#ifdef GETOPT_COMPAT
|
|
||||||
|| argv[optind][0] == '+'
|
|
||||||
#endif /* GETOPT_COMPAT */
|
|
||||||
))
|
|
||||||
{
|
|
||||||
const struct option *p;
|
|
||||||
char *s = nextchar;
|
|
||||||
int exact = 0;
|
|
||||||
int ambig = 0;
|
|
||||||
const struct option *pfound = NULL;
|
|
||||||
int indfound = 0;
|
|
||||||
int needexact = 0;
|
|
||||||
|
|
||||||
/* allow `--option#value' because you cannout assign a '='
|
|
||||||
to an environment variable under DOS command.com */
|
|
||||||
while (*s && *s != '=' && * s != '#')
|
|
||||||
s++;
|
|
||||||
|
|
||||||
/* Test all options for either exact match or abbreviated matches. */
|
|
||||||
for (p = longopts, option_index = 0; p->name;
|
|
||||||
p++, option_index++)
|
|
||||||
if (!strncmp (p->name, nextchar, (unsigned) (s - nextchar)))
|
|
||||||
{
|
|
||||||
if (p->has_arg & 0x10)
|
|
||||||
needexact = 1;
|
|
||||||
if ((unsigned) (s - nextchar) == strlen (p->name))
|
|
||||||
{
|
|
||||||
/* Exact match found. */
|
|
||||||
pfound = p;
|
|
||||||
indfound = option_index;
|
|
||||||
exact = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (pfound == NULL)
|
|
||||||
{
|
|
||||||
/* First nonexact match found. */
|
|
||||||
pfound = p;
|
|
||||||
indfound = option_index;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
/* Second nonexact match found. */
|
|
||||||
ambig = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* don't allow nonexact longoptions */
|
|
||||||
if (needexact && !exact)
|
|
||||||
{
|
|
||||||
if (opterr)
|
|
||||||
fprintf (stderr, "%s: unrecognized option `%s'\n",
|
|
||||||
PROGNAME(argv[0]), argv[optind]);
|
|
||||||
nextchar += strlen (nextchar);
|
|
||||||
optind++;
|
|
||||||
return BAD_OPTION;
|
|
||||||
}
|
|
||||||
if (ambig && !exact)
|
|
||||||
{
|
|
||||||
if (opterr)
|
|
||||||
fprintf (stderr, "%s: option `%s' is ambiguous\n",
|
|
||||||
PROGNAME(argv[0]), argv[optind]);
|
|
||||||
nextchar += strlen (nextchar);
|
|
||||||
optind++;
|
|
||||||
return BAD_OPTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pfound != NULL)
|
|
||||||
{
|
|
||||||
int have_arg = (s[0] != '\0');
|
|
||||||
if (have_arg && (pfound->has_arg & 0xf))
|
|
||||||
have_arg = (s[1] != '\0');
|
|
||||||
option_index = indfound;
|
|
||||||
optind++;
|
|
||||||
if (have_arg)
|
|
||||||
{
|
|
||||||
/* Don't test has_arg with >, because some C compilers don't
|
|
||||||
allow it to be used on enums. */
|
|
||||||
if (pfound->has_arg & 0xf)
|
|
||||||
optarg = s + 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (opterr)
|
|
||||||
{
|
|
||||||
if (argv[optind - 1][1] == '-')
|
|
||||||
/* --option */
|
|
||||||
fprintf (stderr,
|
|
||||||
"%s: option `--%s' doesn't allow an argument\n",
|
|
||||||
PROGNAME(argv[0]), pfound->name);
|
|
||||||
else
|
|
||||||
/* +option or -option */
|
|
||||||
fprintf (stderr,
|
|
||||||
"%s: option `%c%s' doesn't allow an argument\n",
|
|
||||||
PROGNAME(argv[0]), argv[optind - 1][0], pfound->name);
|
|
||||||
}
|
|
||||||
nextchar += strlen (nextchar);
|
|
||||||
return BAD_OPTION;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((pfound->has_arg & 0xf) == 1)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
if (optind < argc)
|
|
||||||
#else
|
|
||||||
if (optind < argc && (pfound->has_arg & 0x20) == 0)
|
|
||||||
#endif
|
|
||||||
optarg = argv[optind++];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (opterr)
|
|
||||||
fprintf (stderr, "%s: option `--%s%s' requires an argument\n",
|
|
||||||
PROGNAME(argv[0]), pfound->name,
|
|
||||||
(pfound->has_arg & 0x20) ? "=" : "");
|
|
||||||
nextchar += strlen (nextchar);
|
|
||||||
return optstring[0] == ':' ? ':' : BAD_OPTION;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nextchar += strlen (nextchar);
|
|
||||||
if (longind != NULL)
|
|
||||||
*longind = option_index;
|
|
||||||
if (pfound->flag)
|
|
||||||
{
|
|
||||||
*(pfound->flag) = pfound->val;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return pfound->val;
|
|
||||||
}
|
|
||||||
/* Can't find it as a long option. If this is not getopt_long_only,
|
|
||||||
or the option starts with '--' or is not a valid short
|
|
||||||
option, then it's an error.
|
|
||||||
Otherwise interpret it as a short option. */
|
|
||||||
if (!long_only || argv[optind][1] == '-'
|
|
||||||
#ifdef GETOPT_COMPAT
|
|
||||||
|| argv[optind][0] == '+'
|
|
||||||
#endif /* GETOPT_COMPAT */
|
|
||||||
|| strchr (optstring, *nextchar) == NULL)
|
|
||||||
{
|
|
||||||
if (opterr)
|
|
||||||
{
|
|
||||||
if (argv[optind][1] == '-')
|
|
||||||
/* --option */
|
|
||||||
fprintf (stderr, "%s: unrecognized option `--%s'\n",
|
|
||||||
PROGNAME(argv[0]), nextchar);
|
|
||||||
else
|
|
||||||
/* +option or -option */
|
|
||||||
fprintf (stderr, "%s: unrecognized option `%c%s'\n",
|
|
||||||
PROGNAME(argv[0]), argv[optind][0], nextchar);
|
|
||||||
}
|
|
||||||
nextchar = empty_string;
|
|
||||||
optind++;
|
|
||||||
return BAD_OPTION;
|
|
||||||
}
|
|
||||||
(void) &ambig; /* UNUSED */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look at and handle the next option-character. */
|
|
||||||
|
|
||||||
{
|
|
||||||
char c = *nextchar++;
|
|
||||||
const char *temp = strchr (optstring, c);
|
|
||||||
|
|
||||||
/* Increment `optind' when we start to process its last character. */
|
|
||||||
if (*nextchar == '\0')
|
|
||||||
++optind;
|
|
||||||
|
|
||||||
if (temp == NULL || c == ':')
|
|
||||||
{
|
|
||||||
if (opterr)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
if (c < 040 || c >= 0177)
|
|
||||||
fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
|
|
||||||
PROGNAME(argv[0]), c);
|
|
||||||
else
|
|
||||||
fprintf (stderr, "%s: unrecognized option `-%c'\n", PROGNAME(argv[0]), c);
|
|
||||||
#else
|
|
||||||
/* 1003.2 specifies the format of this message. */
|
|
||||||
fprintf (stderr, "%s: illegal option -- %c\n", PROGNAME(argv[0]), c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
optopt = c;
|
|
||||||
return BAD_OPTION;
|
|
||||||
}
|
|
||||||
if (temp[1] == ':')
|
|
||||||
{
|
|
||||||
if (temp[2] == ':')
|
|
||||||
{
|
|
||||||
/* This is an option that accepts an argument optionally. */
|
|
||||||
if (*nextchar != '\0')
|
|
||||||
{
|
|
||||||
optarg = nextchar;
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
optarg = 0;
|
|
||||||
nextchar = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* This is an option that requires an argument. */
|
|
||||||
if (*nextchar != '\0')
|
|
||||||
{
|
|
||||||
optarg = nextchar;
|
|
||||||
/* If we end this ARGV-element by taking the rest as an arg,
|
|
||||||
we must advance to the next element now. */
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
else if (optind == argc)
|
|
||||||
{
|
|
||||||
if (opterr)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
fprintf (stderr, "%s: option `-%c' requires an argument\n",
|
|
||||||
PROGNAME(argv[0]), c);
|
|
||||||
#else
|
|
||||||
/* 1003.2 specifies the format of this message. */
|
|
||||||
fprintf (stderr, "%s: option requires an argument -- %c\n",
|
|
||||||
PROGNAME(argv[0]), c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
optopt = c;
|
|
||||||
if (optstring[0] == ':')
|
|
||||||
c = ':';
|
|
||||||
else
|
|
||||||
c = BAD_OPTION;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
/* We already incremented `optind' once;
|
|
||||||
increment it again when taking next ARGV-elt as argument. */
|
|
||||||
optarg = argv[optind++];
|
|
||||||
nextchar = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int mfx_getopt(int argc, char **argv, const char *optstring)
|
|
||||||
{
|
|
||||||
return _getopt_internal (argc, argv, optstring,
|
|
||||||
(const struct option *) 0,
|
|
||||||
(int *) 0,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int mfx_getopt_long(int argc, char **argv, const char *options,
|
|
||||||
const struct option *long_options, int *opt_index)
|
|
||||||
{
|
|
||||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef TEST
|
|
||||||
|
|
||||||
/* Compile with -DTEST to make an executable for use in testing
|
|
||||||
the above definition of `getopt'. */
|
|
||||||
|
|
||||||
int
|
|
||||||
main (argc, argv)
|
|
||||||
int argc;
|
|
||||||
char **argv;
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
int digit_optind = 0;
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
int this_option_optind = optind ? optind : 1;
|
|
||||||
|
|
||||||
c = getopt (argc, argv, "abc:d:0123456789");
|
|
||||||
if (c == EOF)
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case '0':
|
|
||||||
case '1':
|
|
||||||
case '2':
|
|
||||||
case '3':
|
|
||||||
case '4':
|
|
||||||
case '5':
|
|
||||||
case '6':
|
|
||||||
case '7':
|
|
||||||
case '8':
|
|
||||||
case '9':
|
|
||||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
|
||||||
printf ("digits occur in two different argv-elements.\n");
|
|
||||||
digit_optind = this_option_optind;
|
|
||||||
printf ("option %c\n", c);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'a':
|
|
||||||
printf ("option a\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'b':
|
|
||||||
printf ("option b\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'c':
|
|
||||||
printf ("option c with value `%s'\n", optarg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BAD_OPTION:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind < argc)
|
|
||||||
{
|
|
||||||
printf ("non-option ARGV-elements: ");
|
|
||||||
while (optind < argc)
|
|
||||||
printf ("%s ", argv[optind++]);
|
|
||||||
printf ("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
exit (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TEST */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et:nowrap
|
|
||||||
*/
|
|
||||||
|
|
||||||
-102
@@ -1,102 +0,0 @@
|
|||||||
/* Declarations for getopt.
|
|
||||||
Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by the
|
|
||||||
Free Software Foundation; either version 2, or (at your option) any
|
|
||||||
later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
||||||
|
|
||||||
#ifndef __MFX_GETOPT_H
|
|
||||||
#define __MFX_GETOPT_H 1
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
/* extern "C" { */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For communication from `getopt' to the caller.
|
|
||||||
When `getopt' finds an option that takes an argument,
|
|
||||||
the argument value is returned here.
|
|
||||||
Also, when `ordering' is RETURN_IN_ORDER,
|
|
||||||
each non-option ARGV-element is returned here. */
|
|
||||||
|
|
||||||
extern char *mfx_optarg;
|
|
||||||
|
|
||||||
/* Index in ARGV of the next element to be scanned.
|
|
||||||
This is used for communication to and from the caller
|
|
||||||
and for communication between successive calls to `getopt'.
|
|
||||||
|
|
||||||
On entry to `getopt', zero means this is the first call; initialize.
|
|
||||||
|
|
||||||
When `getopt' returns EOF, this is the index of the first of the
|
|
||||||
non-option elements that the caller should itself scan.
|
|
||||||
|
|
||||||
Otherwise, `optind' communicates from one call to the next
|
|
||||||
how much of ARGV has been scanned so far. */
|
|
||||||
|
|
||||||
extern int mfx_optind;
|
|
||||||
|
|
||||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
|
||||||
for unrecognized options. */
|
|
||||||
|
|
||||||
extern int mfx_opterr;
|
|
||||||
|
|
||||||
/* Set to an option character which was unrecognized. */
|
|
||||||
|
|
||||||
extern int mfx_optopt;
|
|
||||||
|
|
||||||
/* Describe the long-named options requested by the application.
|
|
||||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
|
||||||
of `struct option' terminated by an element containing a name which is
|
|
||||||
zero.
|
|
||||||
|
|
||||||
The field `has_arg' is:
|
|
||||||
no_argument (or 0) if the option does not take an argument,
|
|
||||||
required_argument (or 1) if the option requires an argument,
|
|
||||||
optional_argument (or 2) if the option takes an optional argument.
|
|
||||||
|
|
||||||
If the field `flag' is not NULL, it points to a variable that is set
|
|
||||||
to the value given in the field `val' when the option is found, but
|
|
||||||
left unchanged if the option is not found.
|
|
||||||
|
|
||||||
To have a long-named option do something other than set an `int' to
|
|
||||||
a compiled-in constant, such as set a value from `optarg', set the
|
|
||||||
option's `flag' field to zero and its `val' field to a nonzero
|
|
||||||
value (the equivalent single-letter option character, if there is
|
|
||||||
one). For long options that have a zero `flag' field, `getopt'
|
|
||||||
returns the contents of the `val' field. */
|
|
||||||
|
|
||||||
struct mfx_option
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
/* has_arg can't be an enum because some compilers complain about
|
|
||||||
type mismatches in all the code that assumes it is an int. */
|
|
||||||
int has_arg;
|
|
||||||
int *flag;
|
|
||||||
int val;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
|
||||||
|
|
||||||
#define mfx_no_argument 0
|
|
||||||
#define mfx_required_argument 1
|
|
||||||
#define mfx_optional_argument 2
|
|
||||||
#define mfx_exact_argument 0x10 /* no abbrev. */
|
|
||||||
|
|
||||||
int mfx_getopt(int argc, char **argv, const char *shortopts);
|
|
||||||
int mfx_getopt_long(int argc, char **argv, const char *shortopts,
|
|
||||||
const struct mfx_option *longopts, int *longind);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
/* } */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __MFX_GETOPT_H */
|
|
||||||
+11
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_OPTIONS_H
|
#ifndef __UPX_OPTIONS_H
|
||||||
#define __UPX_OPTIONS_H
|
#define __UPX_OPTIONS_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -45,6 +45,11 @@ enum {
|
|||||||
struct options_t {
|
struct options_t {
|
||||||
int cmd;
|
int cmd;
|
||||||
|
|
||||||
|
// mp (meta) options
|
||||||
|
int mp_compress_task;
|
||||||
|
bool mp_query_format;
|
||||||
|
bool mp_query_num_tasks;
|
||||||
|
|
||||||
// compression options
|
// compression options
|
||||||
int method;
|
int method;
|
||||||
bool method_lzma_seen;
|
bool method_lzma_seen;
|
||||||
@@ -129,7 +134,7 @@ struct options_t {
|
|||||||
bool boot_only;
|
bool boot_only;
|
||||||
bool no_align;
|
bool no_align;
|
||||||
bool do_8bit;
|
bool do_8bit;
|
||||||
bool do_8mb;
|
bool do_8mib;
|
||||||
} ps1_exe;
|
} ps1_exe;
|
||||||
struct {
|
struct {
|
||||||
unsigned blocksize;
|
unsigned blocksize;
|
||||||
@@ -137,6 +142,7 @@ struct options_t {
|
|||||||
bool is_ptinterp; // is PT_INTERP, so don't adjust auxv_t
|
bool is_ptinterp; // is PT_INTERP, so don't adjust auxv_t
|
||||||
bool use_ptinterp; // use PT_INTERP /opt/upx/run
|
bool use_ptinterp; // use PT_INTERP /opt/upx/run
|
||||||
bool make_ptinterp; // make PT_INTERP [ignore current file!]
|
bool make_ptinterp; // make PT_INTERP [ignore current file!]
|
||||||
|
bool unmap_all_pages; // thus /proc/self/exe vanishes
|
||||||
unsigned char osabi0; // replacement if 0==.e_ident[EI_OSABI]
|
unsigned char osabi0; // replacement if 0==.e_ident[EI_OSABI]
|
||||||
enum { SCRIPT_MAX = 32 };
|
enum { SCRIPT_MAX = 32 };
|
||||||
const char *script_name;
|
const char *script_name;
|
||||||
|
|||||||
+7
-9
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -148,14 +148,12 @@ Linker* PackArmPe::newLinker() const
|
|||||||
// import handling
|
// import handling
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
struct import_desc
|
__packed_struct(import_desc)
|
||||||
{
|
|
||||||
LE32 oft; // orig first thunk
|
LE32 oft; // orig first thunk
|
||||||
char _[8];
|
char _[8];
|
||||||
LE32 dllname;
|
LE32 dllname;
|
||||||
LE32 iat; // import address table
|
LE32 iat; // import address table
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
void PackArmPe::processImports(unsigned myimport, unsigned iat_off) // pass 2
|
void PackArmPe::processImports(unsigned myimport, unsigned iat_off) // pass 2
|
||||||
{
|
{
|
||||||
@@ -714,7 +712,7 @@ void PackArmPe::pack(OutputFile *fo)
|
|||||||
|
|
||||||
// limit stack size needed for runtime decompression
|
// limit stack size needed for runtime decompression
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
compressWithFilters(&ft, 2048, &cconf, filter_strategy,
|
compressWithFilters(&ft, 2048, &cconf, filter_strategy,
|
||||||
ih.codebase, rvamin, 0, NULL, 0);
|
ih.codebase, rvamin, 0, NULL, 0);
|
||||||
// info: see buildLoader()
|
// info: see buildLoader()
|
||||||
@@ -898,7 +896,7 @@ void PackArmPe::pack(OutputFile *fo)
|
|||||||
// set_le32(ibuf + ic,get_le32("UPX "));
|
// set_le32(ibuf + ic,get_le32("UPX "));
|
||||||
ibuf.clear(0, oh.filealign);
|
ibuf.clear(0, oh.filealign);
|
||||||
|
|
||||||
info("Image size change: %u -> %u kBytes",
|
info("Image size change: %u -> %u KiB",
|
||||||
ih.imagesize / 1024, oh.imagesize / 1024);
|
ih.imagesize / 1024, oh.imagesize / 1024);
|
||||||
|
|
||||||
infoHeader("[Writing compressed file]");
|
infoHeader("[Writing compressed file]");
|
||||||
|
|||||||
+6
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,14 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_ARMPE_H
|
#ifndef __UPX_P_ARMPE_H
|
||||||
#define __UPX_P_ARMPE_H
|
#define __UPX_P_ARMPE_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// arm/pe
|
// arm/pe
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
static const
|
static const
|
||||||
#include "stub/i086-dos16.com.h"
|
#include "stub/i086-dos16.com.h"
|
||||||
|
|
||||||
//#define TESTING
|
//#define TESTING 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_COM_H
|
#ifndef __UPX_P_COM_H
|
||||||
#define __UPX_P_COM_H
|
#define __UPX_P_COM_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -303,7 +303,7 @@ void PackDjgpp2::pack(OutputFile *fo)
|
|||||||
// compress
|
// compress
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
// limit stack size needed for runtime decompression
|
// limit stack size needed for runtime decompression
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
compressWithFilters(&ft, 512, &cconf);
|
compressWithFilters(&ft, 512, &cconf);
|
||||||
|
|
||||||
// patch coff header #2
|
// patch coff header #2
|
||||||
|
|||||||
+9
-13
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_DJGPP2_H
|
#ifndef __UPX_P_DJGPP2_H
|
||||||
#define __UPX_P_DJGPP2_H
|
#define __UPX_P_DJGPP2_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -66,19 +66,16 @@ protected:
|
|||||||
|
|
||||||
long coff_offset;
|
long coff_offset;
|
||||||
|
|
||||||
struct external_scnhdr_t
|
__packed_struct(external_scnhdr_t)
|
||||||
{
|
|
||||||
char _[12]; // name, paddr
|
char _[12]; // name, paddr
|
||||||
LE32 vaddr;
|
LE32 vaddr;
|
||||||
LE32 size;
|
LE32 size;
|
||||||
LE32 scnptr;
|
LE32 scnptr;
|
||||||
char misc[12]; // relptr, lnnoptr, nreloc, nlnno
|
char misc[12]; // relptr, lnnoptr, nreloc, nlnno
|
||||||
char __[4]; // flags
|
char __[4]; // flags
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct coff_header_t
|
__packed_struct(coff_header_t)
|
||||||
{
|
|
||||||
// ext_file_hdr
|
// ext_file_hdr
|
||||||
LE16 f_magic;
|
LE16 f_magic;
|
||||||
LE16 f_nscns;
|
LE16 f_nscns;
|
||||||
@@ -99,8 +96,7 @@ protected:
|
|||||||
|
|
||||||
// section headers
|
// section headers
|
||||||
external_scnhdr_t sh[3];
|
external_scnhdr_t sh[3];
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
coff_header_t coff_hdr;
|
coff_header_t coff_hdr;
|
||||||
external_scnhdr_t *text,*data,*bss;
|
external_scnhdr_t *text,*data,*bss;
|
||||||
|
|||||||
+82
-53
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_ELF_H
|
#ifndef __UPX_P_ELF_H
|
||||||
#define __UPX_P_ELF_H
|
#define __UPX_P_ELF_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -52,8 +52,7 @@ struct ElfITypes
|
|||||||
|
|
||||||
// The ELF file header. This appears at the start of every ELF file.
|
// The ELF file header. This appears at the start of every ELF file.
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Ehdr
|
__packed_struct(Ehdr)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Half Half;
|
typedef typename TElfITypes::Half Half;
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
@@ -76,13 +75,11 @@ struct Ehdr
|
|||||||
|
|
||||||
# define WANT_EHDR_ENUM 1
|
# define WANT_EHDR_ENUM 1
|
||||||
# include "p_elf_enum.h"
|
# include "p_elf_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Dyn
|
__packed_struct(Dyn)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Xword Xword;
|
typedef typename TElfITypes::Xword Xword;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
|
|
||||||
@@ -91,13 +88,32 @@ struct Dyn
|
|||||||
|
|
||||||
# define WANT_DYN_ENUM 1
|
# define WANT_DYN_ENUM 1
|
||||||
# include "p_elf_enum.h"
|
# include "p_elf_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct External_Note
|
__packed_struct(Rel)
|
||||||
{
|
typedef typename TElfITypes::Xword Xword;
|
||||||
|
typedef typename TElfITypes::Addr Addr;
|
||||||
|
|
||||||
|
Addr r_offset;
|
||||||
|
Xword r_info;
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
|
||||||
|
template <class TElfITypes>
|
||||||
|
__packed_struct(Rela)
|
||||||
|
typedef typename TElfITypes::Xword Xword;
|
||||||
|
typedef typename TElfITypes::Addr Addr;
|
||||||
|
|
||||||
|
Addr r_offset;
|
||||||
|
Xword r_info;
|
||||||
|
Xword r_addend;
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
|
||||||
|
template <class TElfITypes>
|
||||||
|
__packed_struct(External_Note)
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
|
|
||||||
Word xn_namesz; // includes terminating '\0'
|
Word xn_namesz; // includes terminating '\0'
|
||||||
@@ -105,8 +121,7 @@ struct External_Note
|
|||||||
Word xn_type;
|
Word xn_type;
|
||||||
//char xn_name[N]; // terminate with '\0'
|
//char xn_name[N]; // terminate with '\0'
|
||||||
//char xn_data[M]; // aligned to 0 mod 4
|
//char xn_data[M]; // aligned to 0 mod 4
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace N_Elf
|
} // namespace N_Elf
|
||||||
@@ -119,8 +134,7 @@ __attribute_packed;
|
|||||||
namespace N_Elf32 {
|
namespace N_Elf32 {
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Phdr
|
__packed_struct(Phdr)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
typedef typename TElfITypes::Off Off;
|
typedef typename TElfITypes::Off Off;
|
||||||
@@ -136,13 +150,11 @@ struct Phdr
|
|||||||
|
|
||||||
# define WANT_PHDR_ENUM 1
|
# define WANT_PHDR_ENUM 1
|
||||||
# include "p_elf_enum.h"
|
# include "p_elf_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Shdr
|
__packed_struct(Shdr)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
typedef typename TElfITypes::Off Off;
|
typedef typename TElfITypes::Off Off;
|
||||||
@@ -160,13 +172,11 @@ struct Shdr
|
|||||||
|
|
||||||
# define WANT_SHDR_ENUM 1
|
# define WANT_SHDR_ENUM 1
|
||||||
# include "p_elf_enum.h"
|
# include "p_elf_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Sym
|
__packed_struct(Sym)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
typedef typename TElfITypes::Section Section;
|
typedef typename TElfITypes::Section Section;
|
||||||
@@ -183,9 +193,9 @@ struct Sym
|
|||||||
|
|
||||||
static unsigned int get_st_bind(unsigned x) { return 0xf & (x>>4); }
|
static unsigned int get_st_bind(unsigned x) { return 0xf & (x>>4); }
|
||||||
static unsigned int get_st_type(unsigned x) { return 0xf & x ; }
|
static unsigned int get_st_type(unsigned x) { return 0xf & x ; }
|
||||||
static unsigned char make_st_info(unsigned bind, unsigned type) { return (bind<<4) + (0xf & type); }
|
static unsigned char make_st_info(unsigned bind, unsigned type)
|
||||||
}
|
{ return (unsigned char) (((bind<<4) + (0xf & type)) & 0xff); }
|
||||||
__attribute_packed;
|
__packed_struct_end()
|
||||||
|
|
||||||
|
|
||||||
} // namespace N_Elf32
|
} // namespace N_Elf32
|
||||||
@@ -198,8 +208,7 @@ __attribute_packed;
|
|||||||
namespace N_Elf64 {
|
namespace N_Elf64 {
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Phdr
|
__packed_struct(Phdr)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
typedef typename TElfITypes::Xword Xword;
|
typedef typename TElfITypes::Xword Xword;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
@@ -216,13 +225,11 @@ struct Phdr
|
|||||||
|
|
||||||
# define WANT_PHDR_ENUM 1
|
# define WANT_PHDR_ENUM 1
|
||||||
# include "p_elf_enum.h"
|
# include "p_elf_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Shdr
|
__packed_struct(Shdr)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
typedef typename TElfITypes::Xword Xword;
|
typedef typename TElfITypes::Xword Xword;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
@@ -241,13 +248,11 @@ struct Shdr
|
|||||||
|
|
||||||
# define WANT_SHDR_ENUM 1
|
# define WANT_SHDR_ENUM 1
|
||||||
# include "p_elf_enum.h"
|
# include "p_elf_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
template <class TElfITypes>
|
template <class TElfITypes>
|
||||||
struct Sym
|
__packed_struct(Sym)
|
||||||
{
|
|
||||||
typedef typename TElfITypes::Word Word;
|
typedef typename TElfITypes::Word Word;
|
||||||
typedef typename TElfITypes::Xword Xword;
|
typedef typename TElfITypes::Xword Xword;
|
||||||
typedef typename TElfITypes::Addr Addr;
|
typedef typename TElfITypes::Addr Addr;
|
||||||
@@ -265,9 +270,9 @@ struct Sym
|
|||||||
|
|
||||||
static unsigned int get_st_bind(unsigned x) { return 0xf & (x>>4); }
|
static unsigned int get_st_bind(unsigned x) { return 0xf & (x>>4); }
|
||||||
static unsigned int get_st_type(unsigned x) { return 0xf & x ; }
|
static unsigned int get_st_type(unsigned x) { return 0xf & x ; }
|
||||||
static unsigned char make_st_info(unsigned bind, unsigned type) { return (bind<<4) + (0xf & type); }
|
static unsigned char make_st_info(unsigned bind, unsigned type)
|
||||||
}
|
{ return (unsigned char) (((bind<<4) + (0xf & type)) & 0xff); }
|
||||||
__attribute_packed;
|
__packed_struct_end()
|
||||||
|
|
||||||
|
|
||||||
} // namespace N_Elf64
|
} // namespace N_Elf64
|
||||||
@@ -284,17 +289,19 @@ struct ElfClass_32
|
|||||||
{
|
{
|
||||||
typedef TP BeLePolicy;
|
typedef TP BeLePolicy;
|
||||||
|
|
||||||
// integral types
|
// integral types (target endianness)
|
||||||
typedef typename TP::U16 U16;
|
typedef typename TP::U16 TE16;
|
||||||
typedef typename TP::U32 U32;
|
typedef typename TP::U32 TE32;
|
||||||
typedef typename TP::U64 U64;
|
typedef typename TP::U64 TE64;
|
||||||
typedef N_Elf::ElfITypes<U16, U32, U32, U32, U32> ElfITypes;
|
typedef N_Elf::ElfITypes<TE16, TE32, TE32, TE32, TE32> ElfITypes;
|
||||||
|
|
||||||
// ELF types
|
// ELF types
|
||||||
typedef N_Elf ::Ehdr<ElfITypes> Ehdr;
|
typedef N_Elf ::Ehdr<ElfITypes> Ehdr;
|
||||||
typedef N_Elf32::Phdr<ElfITypes> Phdr;
|
typedef N_Elf32::Phdr<ElfITypes> Phdr;
|
||||||
typedef N_Elf32::Shdr<ElfITypes> Shdr;
|
typedef N_Elf32::Shdr<ElfITypes> Shdr;
|
||||||
typedef N_Elf ::Dyn <ElfITypes> Dyn;
|
typedef N_Elf ::Dyn <ElfITypes> Dyn;
|
||||||
|
typedef N_Elf ::Rel <ElfITypes> Rel;
|
||||||
|
typedef N_Elf ::Rela<ElfITypes> Rela;
|
||||||
typedef N_Elf32::Sym <ElfITypes> Sym;
|
typedef N_Elf32::Sym <ElfITypes> Sym;
|
||||||
typedef N_Elf ::External_Note<ElfITypes> External_Note;
|
typedef N_Elf ::External_Note<ElfITypes> External_Note;
|
||||||
|
|
||||||
@@ -304,11 +311,15 @@ struct ElfClass_32
|
|||||||
COMPILE_TIME_ASSERT(sizeof(Phdr) == 32)
|
COMPILE_TIME_ASSERT(sizeof(Phdr) == 32)
|
||||||
COMPILE_TIME_ASSERT(sizeof(Shdr) == 40)
|
COMPILE_TIME_ASSERT(sizeof(Shdr) == 40)
|
||||||
COMPILE_TIME_ASSERT(sizeof(Dyn) == 8)
|
COMPILE_TIME_ASSERT(sizeof(Dyn) == 8)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(Rel) == 8)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(Rela) == 12)
|
||||||
COMPILE_TIME_ASSERT(sizeof(Sym) == 16)
|
COMPILE_TIME_ASSERT(sizeof(Sym) == 16)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Ehdr)
|
COMPILE_TIME_ASSERT_ALIGNED1(Ehdr)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Phdr)
|
COMPILE_TIME_ASSERT_ALIGNED1(Phdr)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Shdr)
|
COMPILE_TIME_ASSERT_ALIGNED1(Shdr)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Dyn)
|
COMPILE_TIME_ASSERT_ALIGNED1(Dyn)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(Rel)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(Rela)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Sym)
|
COMPILE_TIME_ASSERT_ALIGNED1(Sym)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -319,17 +330,19 @@ struct ElfClass_64
|
|||||||
{
|
{
|
||||||
typedef TP BeLePolicy;
|
typedef TP BeLePolicy;
|
||||||
|
|
||||||
// integral types
|
// integral types (target endianness)
|
||||||
typedef typename TP::U16 U16;
|
typedef typename TP::U16 TE16;
|
||||||
typedef typename TP::U32 U32;
|
typedef typename TP::U32 TE32;
|
||||||
typedef typename TP::U64 U64;
|
typedef typename TP::U64 TE64;
|
||||||
typedef N_Elf::ElfITypes<U16, U32, U64, U64, U64> ElfITypes;
|
typedef N_Elf::ElfITypes<TE16, TE32, TE64, TE64, TE64> ElfITypes;
|
||||||
|
|
||||||
// ELF types
|
// ELF types
|
||||||
typedef N_Elf ::Ehdr<ElfITypes> Ehdr;
|
typedef N_Elf ::Ehdr<ElfITypes> Ehdr;
|
||||||
typedef N_Elf64::Phdr<ElfITypes> Phdr;
|
typedef N_Elf64::Phdr<ElfITypes> Phdr;
|
||||||
typedef N_Elf64::Shdr<ElfITypes> Shdr;
|
typedef N_Elf64::Shdr<ElfITypes> Shdr;
|
||||||
typedef N_Elf ::Dyn <ElfITypes> Dyn;
|
typedef N_Elf ::Dyn <ElfITypes> Dyn;
|
||||||
|
typedef N_Elf ::Rel <ElfITypes> Rel;
|
||||||
|
typedef N_Elf ::Rela<ElfITypes> Rela;
|
||||||
typedef N_Elf64::Sym <ElfITypes> Sym;
|
typedef N_Elf64::Sym <ElfITypes> Sym;
|
||||||
typedef N_Elf ::External_Note<ElfITypes> External_Note;
|
typedef N_Elf ::External_Note<ElfITypes> External_Note;
|
||||||
|
|
||||||
@@ -339,11 +352,15 @@ struct ElfClass_64
|
|||||||
COMPILE_TIME_ASSERT(sizeof(Phdr) == 56)
|
COMPILE_TIME_ASSERT(sizeof(Phdr) == 56)
|
||||||
COMPILE_TIME_ASSERT(sizeof(Shdr) == 64)
|
COMPILE_TIME_ASSERT(sizeof(Shdr) == 64)
|
||||||
COMPILE_TIME_ASSERT(sizeof(Dyn) == 16)
|
COMPILE_TIME_ASSERT(sizeof(Dyn) == 16)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(Rel) == 16)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(Rela) == 24)
|
||||||
COMPILE_TIME_ASSERT(sizeof(Sym) == 24)
|
COMPILE_TIME_ASSERT(sizeof(Sym) == 24)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Ehdr)
|
COMPILE_TIME_ASSERT_ALIGNED1(Ehdr)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Phdr)
|
COMPILE_TIME_ASSERT_ALIGNED1(Phdr)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Shdr)
|
COMPILE_TIME_ASSERT_ALIGNED1(Shdr)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Dyn)
|
COMPILE_TIME_ASSERT_ALIGNED1(Dyn)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(Rel)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(Rela)
|
||||||
COMPILE_TIME_ASSERT_ALIGNED1(Sym)
|
COMPILE_TIME_ASSERT_ALIGNED1(Sym)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -368,6 +385,8 @@ typedef ElfClass_Host32::Ehdr Elf32_Ehdr;
|
|||||||
typedef ElfClass_Host32::Phdr Elf32_Phdr;
|
typedef ElfClass_Host32::Phdr Elf32_Phdr;
|
||||||
typedef ElfClass_Host32::Shdr Elf32_Shdr;
|
typedef ElfClass_Host32::Shdr Elf32_Shdr;
|
||||||
typedef ElfClass_Host32::Dyn Elf32_Dyn;
|
typedef ElfClass_Host32::Dyn Elf32_Dyn;
|
||||||
|
typedef ElfClass_Host32::Rel Elf32_Rel;
|
||||||
|
typedef ElfClass_Host32::Rela Elf32_Rela;
|
||||||
typedef ElfClass_Host32::Sym Elf32_Sym;
|
typedef ElfClass_Host32::Sym Elf32_Sym;
|
||||||
typedef ElfClass_Host32::External_Note Elf32_External_Note;
|
typedef ElfClass_Host32::External_Note Elf32_External_Note;
|
||||||
|
|
||||||
@@ -375,6 +394,8 @@ typedef ElfClass_Host64::Ehdr Elf64_Ehdr;
|
|||||||
typedef ElfClass_Host64::Phdr Elf64_Phdr;
|
typedef ElfClass_Host64::Phdr Elf64_Phdr;
|
||||||
typedef ElfClass_Host64::Shdr Elf64_Shdr;
|
typedef ElfClass_Host64::Shdr Elf64_Shdr;
|
||||||
typedef ElfClass_Host64::Dyn Elf64_Dyn;
|
typedef ElfClass_Host64::Dyn Elf64_Dyn;
|
||||||
|
typedef ElfClass_Host64::Rel Elf64_Rel;
|
||||||
|
typedef ElfClass_Host64::Rela Elf64_Rela;
|
||||||
typedef ElfClass_Host64::Sym Elf64_Sym;
|
typedef ElfClass_Host64::Sym Elf64_Sym;
|
||||||
typedef ElfClass_Host64::External_Note Elf64_External_Note;
|
typedef ElfClass_Host64::External_Note Elf64_External_Note;
|
||||||
|
|
||||||
@@ -382,6 +403,8 @@ typedef ElfClass_BE32::Ehdr Elf_BE32_Ehdr;
|
|||||||
typedef ElfClass_BE32::Phdr Elf_BE32_Phdr;
|
typedef ElfClass_BE32::Phdr Elf_BE32_Phdr;
|
||||||
typedef ElfClass_BE32::Shdr Elf_BE32_Shdr;
|
typedef ElfClass_BE32::Shdr Elf_BE32_Shdr;
|
||||||
typedef ElfClass_BE32::Dyn Elf_BE32_Dyn;
|
typedef ElfClass_BE32::Dyn Elf_BE32_Dyn;
|
||||||
|
typedef ElfClass_BE32::Rel Elf_BE32_Rel;
|
||||||
|
typedef ElfClass_BE32::Rela Elf_BE32_Rela;
|
||||||
typedef ElfClass_BE32::Sym Elf_BE32_Sym;
|
typedef ElfClass_BE32::Sym Elf_BE32_Sym;
|
||||||
typedef ElfClass_BE32::External_Note Elf_BE32_External_Note;
|
typedef ElfClass_BE32::External_Note Elf_BE32_External_Note;
|
||||||
|
|
||||||
@@ -389,6 +412,8 @@ typedef ElfClass_BE64::Ehdr Elf_BE64_Ehdr;
|
|||||||
typedef ElfClass_BE64::Phdr Elf_BE64_Phdr;
|
typedef ElfClass_BE64::Phdr Elf_BE64_Phdr;
|
||||||
typedef ElfClass_BE64::Shdr Elf_BE64_Shdr;
|
typedef ElfClass_BE64::Shdr Elf_BE64_Shdr;
|
||||||
typedef ElfClass_BE64::Dyn Elf_BE64_Dyn;
|
typedef ElfClass_BE64::Dyn Elf_BE64_Dyn;
|
||||||
|
typedef ElfClass_BE64::Rel Elf_BE64_Rel;
|
||||||
|
typedef ElfClass_BE64::Rela Elf_BE64_Rela;
|
||||||
typedef ElfClass_BE64::Sym Elf_BE64_Sym;
|
typedef ElfClass_BE64::Sym Elf_BE64_Sym;
|
||||||
typedef ElfClass_BE64::External_Note Elf_BE64_External_Note;
|
typedef ElfClass_BE64::External_Note Elf_BE64_External_Note;
|
||||||
|
|
||||||
@@ -396,6 +421,8 @@ typedef ElfClass_LE32::Ehdr Elf_LE32_Ehdr;
|
|||||||
typedef ElfClass_LE32::Phdr Elf_LE32_Phdr;
|
typedef ElfClass_LE32::Phdr Elf_LE32_Phdr;
|
||||||
typedef ElfClass_LE32::Shdr Elf_LE32_Shdr;
|
typedef ElfClass_LE32::Shdr Elf_LE32_Shdr;
|
||||||
typedef ElfClass_LE32::Dyn Elf_LE32_Dyn;
|
typedef ElfClass_LE32::Dyn Elf_LE32_Dyn;
|
||||||
|
typedef ElfClass_LE32::Rel Elf_LE32_Rel;
|
||||||
|
typedef ElfClass_LE32::Rela Elf_LE32_Rela;
|
||||||
typedef ElfClass_LE32::Sym Elf_LE32_Sym;
|
typedef ElfClass_LE32::Sym Elf_LE32_Sym;
|
||||||
typedef ElfClass_LE32::External_Note Elf_LE32_External_Note;
|
typedef ElfClass_LE32::External_Note Elf_LE32_External_Note;
|
||||||
|
|
||||||
@@ -403,6 +430,8 @@ typedef ElfClass_LE64::Ehdr Elf_LE64_Ehdr;
|
|||||||
typedef ElfClass_LE64::Phdr Elf_LE64_Phdr;
|
typedef ElfClass_LE64::Phdr Elf_LE64_Phdr;
|
||||||
typedef ElfClass_LE64::Shdr Elf_LE64_Shdr;
|
typedef ElfClass_LE64::Shdr Elf_LE64_Shdr;
|
||||||
typedef ElfClass_LE64::Dyn Elf_LE64_Dyn;
|
typedef ElfClass_LE64::Dyn Elf_LE64_Dyn;
|
||||||
|
typedef ElfClass_LE64::Rel Elf_LE64_Rel;
|
||||||
|
typedef ElfClass_LE64::Rela Elf_LE64_Rela;
|
||||||
typedef ElfClass_LE64::Sym Elf_LE64_Sym;
|
typedef ElfClass_LE64::Sym Elf_LE64_Sym;
|
||||||
typedef ElfClass_LE64::External_Note Elf_LE64_External_Note;
|
typedef ElfClass_LE64::External_Note Elf_LE64_External_Note;
|
||||||
|
|
||||||
|
|||||||
+17
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -141,14 +141,23 @@
|
|||||||
enum { // d_tag
|
enum { // d_tag
|
||||||
DT_NULL = 0, /* End flag */
|
DT_NULL = 0, /* End flag */
|
||||||
DT_NEEDED = 1, /* Name of needed library */
|
DT_NEEDED = 1, /* Name of needed library */
|
||||||
DT_PLTRELSZ = 2, /* Size in bytes of PLT relocs */
|
DT_PLTRELSZ = 2, /* Size in bytes of PLT relocs */
|
||||||
DT_HASH = 4, /* Hash table of symbol names */
|
DT_HASH = 4, /* Hash table of symbol names */
|
||||||
DT_STRTAB = 5, /* String table */
|
DT_STRTAB = 5, /* String table */
|
||||||
DT_SYMTAB = 6, /* Symbol table */
|
DT_SYMTAB = 6, /* Symbol table */
|
||||||
|
DT_RELA = 7, /* Relocations which do contain an addend */
|
||||||
|
DT_RELAENT = 9, /* Size of one RELA relocation */
|
||||||
|
DT_INIT = 12, /* Address of init function */
|
||||||
|
DT_REL = 17, /* Relocations which contain no addend */
|
||||||
|
DT_RELENT = 19, /* Size of one Rel relocation */
|
||||||
DT_STRSZ = 10, /* Sizeof string table */
|
DT_STRSZ = 10, /* Sizeof string table */
|
||||||
DT_PLTREL = 20, /* Type of reloc in PLT */
|
DT_PLTREL = 20, /* Type of reloc in PLT */
|
||||||
DT_JMPREL = 23, /* Address of PLT relocs */
|
DT_JMPREL = 23, /* Address of PLT relocs */
|
||||||
DT_GNU_HASH = 0x6ffffef5 /* GNU-style hash table */
|
DT_CHECKSUM = 0x6ffffdf8, /* Only for prelink? */
|
||||||
|
DT_GNU_HASH = 0x6ffffef5, /* GNU-style hash table */
|
||||||
|
DT_VERSYM = 0x6ffffff0, /* version[] for each symbol */
|
||||||
|
DT_VERDEF = 0x6ffffffc, /* version definitions[] */
|
||||||
|
DT_VERNEEDED= 0x6ffffffe /* version[] needed */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+13
-12
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -51,20 +51,21 @@ PackExe::PackExe(InputFile *f) :
|
|||||||
super(f)
|
super(f)
|
||||||
{
|
{
|
||||||
bele = &N_BELE_RTP::le_policy;
|
bele = &N_BELE_RTP::le_policy;
|
||||||
COMPILE_TIME_ASSERT(sizeof(exe_header_t) == 32);
|
COMPILE_TIME_ASSERT(sizeof(exe_header_t) == 32)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(exe_header_t)
|
||||||
ih_exesize = ih_imagesize = ih_overlay = 0;
|
ih_exesize = ih_imagesize = ih_overlay = 0;
|
||||||
stack_for_lzma = 0;
|
stack_for_lzma = 0;
|
||||||
use_clear_dirty_stack = false;
|
use_clear_dirty_stack = false;
|
||||||
|
|
||||||
// disable lzma for "--brute" unless explicitly given "--lzma"
|
|
||||||
if (opt->all_methods_use_lzma && !opt->method_lzma_seen)
|
|
||||||
opt->all_methods_use_lzma = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const int *PackExe::getCompressionMethods(int method, int level) const
|
const int *PackExe::getCompressionMethods(int method, int level) const
|
||||||
{
|
{
|
||||||
bool small = ih_imagesize <= 256*1024;
|
bool small = ih_imagesize <= 256*1024;
|
||||||
|
// disable lzma for "--brute" unless explicitly given "--lzma"
|
||||||
|
// WARNING: this side effect persists for later files!
|
||||||
|
if (opt->all_methods_use_lzma && !opt->method_lzma_seen)
|
||||||
|
opt->all_methods_use_lzma = false;
|
||||||
return Packer::getDefaultCompressionMethods_8(method, level, small);
|
return Packer::getDefaultCompressionMethods_8(method, level, small);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,14 +507,14 @@ void PackExe::pack(OutputFile *fo)
|
|||||||
// compress (max_match = 8192)
|
// compress (max_match = 8192)
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
cconf.conf_ucl.max_match = MAXMATCH;
|
cconf.conf_ucl.max_match = MAXMATCH;
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
compressWithFilters(&ft, 32, &cconf);
|
compressWithFilters(&ft, 32, &cconf);
|
||||||
|
|
||||||
if (M_IS_NRV2B(ph.method) || M_IS_NRV2D(ph.method) || M_IS_NRV2E(ph.method))
|
if (M_IS_NRV2B(ph.method) || M_IS_NRV2D(ph.method) || M_IS_NRV2E(ph.method))
|
||||||
if (ph.max_run_found + ph.max_match_found > 0x8000)
|
if (ph.max_run_found + ph.max_match_found > 0x8000)
|
||||||
throwCantPack("decompressor limit exceeded, send a bugreport");
|
throwCantPack("decompressor limit exceeded, send a bugreport");
|
||||||
|
|
||||||
#ifdef TESTING
|
#if TESTING
|
||||||
if (opt->debug.debug_level)
|
if (opt->debug.debug_level)
|
||||||
{
|
{
|
||||||
printf("image+relocs %d -> %d\n",ih_imagesize+relocsize,ph.c_len);
|
printf("image+relocs %d -> %d\n",ih_imagesize+relocsize,ph.c_len);
|
||||||
@@ -630,7 +631,7 @@ void PackExe::pack(OutputFile *fo)
|
|||||||
//fprintf(stderr,"\ne_len=%x d_len=%x c_len=%x oo=%x ulen=%x destp=%x copys=%x images=%x",e_len,d_len,packedsize,ph.overlap_overhead,ph.u_len,destpara,copysize,ih_imagesize);
|
//fprintf(stderr,"\ne_len=%x d_len=%x c_len=%x oo=%x ulen=%x destp=%x copys=%x images=%x",e_len,d_len,packedsize,ph.overlap_overhead,ph.u_len,destpara,copysize,ih_imagesize);
|
||||||
|
|
||||||
// write header + write loader + compressed file
|
// write header + write loader + compressed file
|
||||||
#ifdef TESTING
|
#if TESTING
|
||||||
if (opt->debug.debug_level)
|
if (opt->debug.debug_level)
|
||||||
printf("\n%d %d %d %d\n",(int)sizeof(oh),e_len,packedsize,d_len);
|
printf("\n%d %d %d %d\n",(int)sizeof(oh),e_len,packedsize,d_len);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+7
-9
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_EXE_H
|
#ifndef __UPX_P_EXE_H
|
||||||
#define __UPX_P_EXE_H
|
#define __UPX_P_EXE_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -74,8 +74,7 @@ protected:
|
|||||||
virtual Linker* newLinker() const;
|
virtual Linker* newLinker() const;
|
||||||
void addLoaderEpilogue(int flag);
|
void addLoaderEpilogue(int flag);
|
||||||
|
|
||||||
struct exe_header_t
|
__packed_struct(exe_header_t)
|
||||||
{
|
|
||||||
LE16 ident;
|
LE16 ident;
|
||||||
LE16 m512;
|
LE16 m512;
|
||||||
LE16 p512;
|
LE16 p512;
|
||||||
@@ -91,8 +90,7 @@ protected:
|
|||||||
LE16 relocoffs;
|
LE16 relocoffs;
|
||||||
char __[2]; // overlnum
|
char __[2]; // overlnum
|
||||||
LE32 firstreloc;
|
LE32 firstreloc;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
exe_header_t ih, oh;
|
exe_header_t ih, oh;
|
||||||
|
|
||||||
|
|||||||
+1142
-548
File diff suppressed because it is too large
Load Diff
+70
-57
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_LX_ELF_H //{
|
#ifndef __UPX_P_LX_ELF_H //{
|
||||||
#define __UPX_P_LX_ELF_H
|
#define __UPX_P_LX_ELF_H 1
|
||||||
|
|
||||||
|
|
||||||
class PackLinuxElf : public PackUnix
|
class PackLinuxElf : public PackUnix
|
||||||
@@ -61,9 +61,14 @@ protected:
|
|||||||
) = 0;
|
) = 0;
|
||||||
virtual void defineSymbols(Filter const *);
|
virtual void defineSymbols(Filter const *);
|
||||||
virtual void addStubEntrySections(Filter const *);
|
virtual void addStubEntrySections(Filter const *);
|
||||||
virtual void unpack(OutputFile *fo) = 0;
|
virtual void unpack(OutputFile *fo);
|
||||||
|
|
||||||
|
virtual unsigned elf_get_offset_from_address(acc_uint64l_t) const = 0;
|
||||||
|
virtual void const *elf_find_dynamic(unsigned) const = 0;
|
||||||
|
virtual acc_uint64l_t elf_unsigned_dynamic(unsigned) const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
unsigned e_phnum; /* Program header table entry count */
|
||||||
char *file_image; // if ET_DYN investigation
|
char *file_image; // if ET_DYN investigation
|
||||||
char const *dynstr; // from DT_STRTAB
|
char const *dynstr; // from DT_STRTAB
|
||||||
|
|
||||||
@@ -72,6 +77,10 @@ protected:
|
|||||||
unsigned sz_pack2; // after pack2(), before loader
|
unsigned sz_pack2; // after pack2(), before loader
|
||||||
unsigned lg2_page; // log2(PAGE_SIZE)
|
unsigned lg2_page; // log2(PAGE_SIZE)
|
||||||
unsigned page_size; // 1u<<lg2_page
|
unsigned page_size; // 1u<<lg2_page
|
||||||
|
unsigned xct_off; // shared library: file offset of SHT_EXECINSTR
|
||||||
|
unsigned hatch_off; // file offset of escape hatch
|
||||||
|
acc_uint64l_t load_va; // PT_LOAD[0].p_vaddr
|
||||||
|
acc_uint64l_t xct_va; // minimum SHT_EXECINSTR virtual address
|
||||||
|
|
||||||
unsigned short e_machine;
|
unsigned short e_machine;
|
||||||
unsigned char ei_class;
|
unsigned char ei_class;
|
||||||
@@ -122,49 +131,47 @@ protected:
|
|||||||
|
|
||||||
static unsigned elf_hash(char const *) /*const*/;
|
static unsigned elf_hash(char const *) /*const*/;
|
||||||
static unsigned gnu_hash(char const *) /*const*/;
|
static unsigned gnu_hash(char const *) /*const*/;
|
||||||
virtual void const *elf_find_dynamic(unsigned) const;
|
|
||||||
virtual Elf32_Sym const *elf_lookup(char const *) const;
|
virtual Elf32_Sym const *elf_lookup(char const *) const;
|
||||||
virtual unsigned elf_get_offset_from_address(unsigned) const;
|
virtual unsigned elf_get_offset_from_address(acc_uint64l_t) const;
|
||||||
Elf32_Shdr const *elf_find_section_name(char const *) const;
|
Elf32_Shdr const *elf_find_section_name(char const *) const;
|
||||||
Elf32_Shdr const *elf_find_section_type(unsigned) const;
|
Elf32_Shdr const *elf_find_section_type(unsigned) const;
|
||||||
|
void const *elf_find_dynamic(unsigned) const;
|
||||||
|
acc_uint64l_t elf_unsigned_dynamic(unsigned) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Elf32_Ehdr ehdri; // from input file
|
Elf32_Ehdr ehdri; // from input file
|
||||||
Elf32_Phdr *phdri; // for input file
|
Elf32_Phdr *phdri; // for input file
|
||||||
Elf32_Shdr const *shdri; // from input file
|
Elf32_Shdr const *shdri; // from input file
|
||||||
unsigned page_mask; // AND clears the offset-within-page
|
unsigned page_mask; // AND clears the offset-within-page
|
||||||
|
|
||||||
Elf32_Dyn const *dynseg; // from PT_DYNAMIC
|
Elf32_Dyn const *dynseg; // from PT_DYNAMIC
|
||||||
unsigned int const *hashtab; // from DT_HASH
|
unsigned int const *hashtab; // from DT_HASH
|
||||||
unsigned int const *gashtab; // from DT_GNU_HASH
|
unsigned int const *gashtab; // from DT_GNU_HASH
|
||||||
Elf32_Sym const *dynsym; // from DT_SYMTAB
|
Elf32_Sym const *dynsym; // from DT_SYMTAB
|
||||||
char const *shstrtab; // via Elf32_Shdr
|
char const *shstrtab; // via Elf32_Shdr
|
||||||
int n_elf_shnum; // via e_shnum
|
int n_elf_shnum; // via e_shnum
|
||||||
|
|
||||||
Elf32_Shdr const *sec_strndx;
|
Elf32_Shdr const *sec_strndx;
|
||||||
Elf32_Shdr const *sec_dynsym;
|
Elf32_Shdr const *sec_dynsym;
|
||||||
Elf32_Shdr const *sec_dynstr;
|
Elf32_Shdr const *sec_dynstr;
|
||||||
|
|
||||||
struct cprElfHdr1 {
|
__packed_struct(cprElfHdr1)
|
||||||
Elf32_Ehdr ehdr;
|
Elf32_Ehdr ehdr;
|
||||||
Elf32_Phdr phdr[1];
|
Elf32_Phdr phdr[1];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct cprElfHdr2 {
|
__packed_struct(cprElfHdr2)
|
||||||
Elf32_Ehdr ehdr;
|
Elf32_Ehdr ehdr;
|
||||||
Elf32_Phdr phdr[2];
|
Elf32_Phdr phdr[2];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct cprElfHdr3 {
|
__packed_struct(cprElfHdr3)
|
||||||
Elf32_Ehdr ehdr;
|
Elf32_Ehdr ehdr;
|
||||||
Elf32_Phdr phdr[3];
|
Elf32_Phdr phdr[3];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
cprElfHdr3 elfout;
|
cprElfHdr3 elfout;
|
||||||
|
|
||||||
@@ -222,31 +229,46 @@ protected:
|
|||||||
virtual unsigned find_LOAD_gap(Elf64_Phdr const *const phdri, unsigned const k,
|
virtual unsigned find_LOAD_gap(Elf64_Phdr const *const phdri, unsigned const k,
|
||||||
unsigned const e_phnum);
|
unsigned const e_phnum);
|
||||||
|
|
||||||
|
virtual unsigned elf_get_offset_from_address(acc_uint64l_t) const;
|
||||||
|
Elf64_Shdr const *elf_find_section_name(char const *) const;
|
||||||
|
Elf64_Shdr const *elf_find_section_type(unsigned) const;
|
||||||
|
void const *elf_find_dynamic(unsigned) const;
|
||||||
|
acc_uint64l_t elf_unsigned_dynamic(unsigned) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Elf64_Ehdr ehdri; // from input file
|
Elf64_Ehdr ehdri; // from input file
|
||||||
Elf64_Phdr *phdri; // for input file
|
Elf64_Phdr *phdri; // for input file
|
||||||
|
Elf64_Shdr const *shdri; // from input file
|
||||||
acc_uint64l_t page_mask; // AND clears the offset-within-page
|
acc_uint64l_t page_mask; // AND clears the offset-within-page
|
||||||
|
|
||||||
struct cprElfHdr1 {
|
Elf64_Dyn const *dynseg; // from PT_DYNAMIC
|
||||||
|
unsigned int const *hashtab; // from DT_HASH
|
||||||
|
unsigned int const *gashtab; // from DT_GNU_HASH
|
||||||
|
Elf64_Sym const *dynsym; // from DT_SYMTAB
|
||||||
|
char const *shstrtab; // via Elf64_Shdr
|
||||||
|
int n_elf_shnum; // via e_shnum
|
||||||
|
|
||||||
|
Elf64_Shdr const *sec_strndx;
|
||||||
|
Elf64_Shdr const *sec_dynsym;
|
||||||
|
Elf64_Shdr const *sec_dynstr;
|
||||||
|
|
||||||
|
__packed_struct(cprElfHdr1)
|
||||||
Elf64_Ehdr ehdr;
|
Elf64_Ehdr ehdr;
|
||||||
Elf64_Phdr phdr[1];
|
Elf64_Phdr phdr[1];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct cprElfHdr2 {
|
__packed_struct(cprElfHdr2)
|
||||||
Elf64_Ehdr ehdr;
|
Elf64_Ehdr ehdr;
|
||||||
Elf64_Phdr phdr[2];
|
Elf64_Phdr phdr[2];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct cprElfHdr3 {
|
__packed_struct(cprElfHdr3)
|
||||||
Elf64_Ehdr ehdr;
|
Elf64_Ehdr ehdr;
|
||||||
Elf64_Phdr phdr[3];
|
Elf64_Phdr phdr[3];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
cprElfHdr3 elfout;
|
cprElfHdr3 elfout;
|
||||||
|
|
||||||
@@ -264,44 +286,33 @@ class PackLinuxElf32Be : public PackLinuxElf32
|
|||||||
{
|
{
|
||||||
typedef PackLinuxElf32 super;
|
typedef PackLinuxElf32 super;
|
||||||
protected:
|
protected:
|
||||||
PackLinuxElf32Be(InputFile *f) : super(f) { bele = &N_BELE_RTP::be_policy; }
|
PackLinuxElf32Be(InputFile *f) : super(f) {
|
||||||
|
bele = &N_BELE_RTP::be_policy;
|
||||||
virtual acc_uint64l_t get_native64(const void *b) const { return get_be64(b); }
|
e_phnum = get_te16(&ehdri.e_phnum);
|
||||||
virtual unsigned get_native32(const void *b) const { return get_be32(b); }
|
}
|
||||||
virtual unsigned get_native16(const void *b) const { return get_be16(b); }
|
|
||||||
virtual void set_native64(void *b, acc_uint64l_t v) const { set_be64(b, v); }
|
|
||||||
virtual void set_native32(void *b, unsigned v) const { set_be32(b, v); }
|
|
||||||
virtual void set_native16(void *b, unsigned v) const { set_be16(b, v); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class PackLinuxElf32Le : public PackLinuxElf32
|
class PackLinuxElf32Le : public PackLinuxElf32
|
||||||
{
|
{
|
||||||
typedef PackLinuxElf32 super;
|
typedef PackLinuxElf32 super;
|
||||||
protected:
|
protected:
|
||||||
PackLinuxElf32Le(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; }
|
PackLinuxElf32Le(InputFile *f) : super(f) {
|
||||||
|
bele = &N_BELE_RTP::le_policy;
|
||||||
virtual acc_uint64l_t get_native64(const void *b) const { return get_le64(b); }
|
e_phnum = get_te16(&ehdri.e_phnum);
|
||||||
virtual unsigned get_native32(const void *b) const { return get_le32(b); }
|
}
|
||||||
virtual unsigned get_native16(const void *b) const { return get_le16(b); }
|
|
||||||
virtual void set_native64(void *b, acc_uint64l_t v) const { set_le64(b, v); }
|
|
||||||
virtual void set_native32(void *b, unsigned v) const { set_le32(b, v); }
|
|
||||||
virtual void set_native16(void *b, unsigned v) const { set_le16(b, v); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class PackLinuxElf64Le : public PackLinuxElf64
|
class PackLinuxElf64Le : public PackLinuxElf64
|
||||||
{
|
{
|
||||||
typedef PackLinuxElf64 super;
|
typedef PackLinuxElf64 super;
|
||||||
protected:
|
protected:
|
||||||
PackLinuxElf64Le(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; }
|
PackLinuxElf64Le(InputFile *f) : super(f) {
|
||||||
|
bele = &N_BELE_RTP::le_policy;
|
||||||
virtual acc_uint64l_t get_native64(const void *b) const { return get_le64(b); }
|
e_phnum = get_te16(&ehdri.e_phnum);
|
||||||
virtual unsigned get_native32(const void *b) const { return get_le32(b); }
|
}
|
||||||
virtual unsigned get_native16(const void *b) const { return get_le16(b); }
|
|
||||||
virtual void set_native64(void *b, acc_uint64l_t v) const { set_le64(b, v); }
|
|
||||||
virtual void set_native32(void *b, unsigned v) const { set_le32(b, v); }
|
|
||||||
virtual void set_native16(void *b, unsigned v) const { set_le16(b, v); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// linux/elf64amd
|
// linux/elf64amd
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -325,6 +336,7 @@ protected:
|
|||||||
virtual void defineSymbols(Filter const *);
|
virtual void defineSymbols(Filter const *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// linux/elf32ppc
|
// linux/elf32ppc
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -345,6 +357,7 @@ protected:
|
|||||||
virtual Linker* newLinker() const;
|
virtual Linker* newLinker() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// linux/elf386
|
// linux/elf386
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -360,8 +373,6 @@ public:
|
|||||||
virtual const char *getFullName(const options_t *) const { return "i386-linux.elf"; }
|
virtual const char *getFullName(const options_t *) const { return "i386-linux.elf"; }
|
||||||
virtual const int *getFilters() const;
|
virtual const int *getFilters() const;
|
||||||
|
|
||||||
virtual void unpack(OutputFile *fo);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void pack1(OutputFile *, Filter &); // generate executable header
|
virtual void pack1(OutputFile *, Filter &); // generate executable header
|
||||||
|
|
||||||
@@ -421,6 +432,7 @@ protected:
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// linux/elfarm
|
// linux/elfarm
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -503,6 +515,7 @@ protected:
|
|||||||
virtual void defineSymbols(Filter const *);
|
virtual void defineSymbols(Filter const *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /*} already included */
|
#endif /*} already included */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+20
-17
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2001-2007 John F. Reiser
|
Copyright (C) 2001-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -132,8 +132,8 @@ PackLinuxI386::generateElfHdr(
|
|||||||
unsigned const brka
|
unsigned const brka
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
cprElfHdr2 *const h2 = (cprElfHdr2 *)&elfout;
|
cprElfHdr2 *const h2 = (cprElfHdr2 *)(void *)&elfout;
|
||||||
cprElfHdr3 *const h3 = (cprElfHdr3 *)&elfout;
|
cprElfHdr3 *const h3 = (cprElfHdr3 *)(void *)&elfout;
|
||||||
memcpy(h3, proto, sizeof(*h3)); // reads beyond, but OK
|
memcpy(h3, proto, sizeof(*h3)); // reads beyond, but OK
|
||||||
|
|
||||||
assert(h2->ehdr.e_phoff == sizeof(Elf32_Ehdr));
|
assert(h2->ehdr.e_phoff == sizeof(Elf32_Ehdr));
|
||||||
@@ -526,28 +526,31 @@ bool PackLinuxI386::canPack()
|
|||||||
ei_osabi = osabi0; // Proudly declares its osabi in Ehdr.
|
ei_osabi = osabi0; // Proudly declares its osabi in Ehdr.
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
unsigned const e_phnum = get_native16(&ehdr.e_phnum);
|
unsigned const e_phnum = get_te16(&ehdr.e_phnum);
|
||||||
if (e_phnum<=(512/sizeof(Elf32_Phdr))) {
|
if (e_phnum<=(512/sizeof(Elf32_Phdr))) {
|
||||||
char buf2[512];
|
union {
|
||||||
fi->seek(get_native32(&ehdr.e_phoff), SEEK_SET);
|
unsigned char buf2[512];
|
||||||
fi->readx(buf2, sizeof(buf2));
|
//Elf32_Phdr phdr;
|
||||||
|
} u;
|
||||||
|
fi->seek(get_te32(&ehdr.e_phoff), SEEK_SET);
|
||||||
|
fi->readx(u.buf2, sizeof(u.buf2));
|
||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
Elf32_Phdr const *phdr = (Elf32_Phdr const *)buf2;
|
Elf32_Phdr const *phdr = (Elf32_Phdr *) u.buf2;
|
||||||
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
|
||||||
if (phdr->PT_NOTE == get_native32(&phdr->p_type)) {
|
if (phdr->PT_NOTE == get_te32(&phdr->p_type)) {
|
||||||
unsigned const offset = get_native32(&phdr->p_offset);
|
unsigned const offset = get_te32(&phdr->p_offset);
|
||||||
struct Elf32_Note note; memset(¬e, 0, sizeof(note));
|
struct Elf32_Note note; memset(¬e, 0, sizeof(note));
|
||||||
fi->seek(offset, SEEK_SET);
|
fi->seek(offset, SEEK_SET);
|
||||||
fi->readx(¬e, sizeof(note));
|
fi->readx(¬e, sizeof(note));
|
||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
if (4==get_native32(¬e.descsz)
|
if (4==get_te32(¬e.descsz)
|
||||||
&& 1==get_native32(¬e.type)
|
&& 1==get_te32(¬e.type)
|
||||||
&& 0==note.end ) {
|
&& 0==note.end ) {
|
||||||
if (0==strcmp("NetBSD", (char const *)¬e.text)) {
|
if (0==strcmp("NetBSD", (char const *)note.text)) {
|
||||||
ei_osabi = Elf32_Ehdr::ELFOSABI_NETBSD;
|
ei_osabi = Elf32_Ehdr::ELFOSABI_NETBSD;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (0==strcmp("OpenBSD", (char const *)¬e.text)) {
|
if (0==strcmp("OpenBSD", (char const *)note.text)) {
|
||||||
ei_osabi = Elf32_Ehdr::ELFOSABI_OPENBSD;
|
ei_osabi = Elf32_Ehdr::ELFOSABI_OPENBSD;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-13
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_LX_EXC_H
|
#ifndef __UPX_P_LX_EXC_H
|
||||||
#define __UPX_P_LX_EXC_H
|
#define __UPX_P_LX_EXC_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -87,26 +87,23 @@ protected:
|
|||||||
|
|
||||||
unsigned n_mru;
|
unsigned n_mru;
|
||||||
|
|
||||||
struct cprElfHdr1 {
|
__packed_struct(cprElfHdr1)
|
||||||
Elf_LE32_Ehdr ehdr;
|
Elf_LE32_Ehdr ehdr;
|
||||||
Elf_LE32_Phdr phdr[1];
|
Elf_LE32_Phdr phdr[1];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct cprElfHdr2 {
|
__packed_struct(cprElfHdr2)
|
||||||
Elf_LE32_Ehdr ehdr;
|
Elf_LE32_Ehdr ehdr;
|
||||||
Elf_LE32_Phdr phdr[2];
|
Elf_LE32_Phdr phdr[2];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct cprElfHdr3 {
|
__packed_struct(cprElfHdr3)
|
||||||
Elf_LE32_Ehdr ehdr;
|
Elf_LE32_Ehdr ehdr;
|
||||||
Elf_LE32_Phdr phdr[3];
|
Elf_LE32_Phdr phdr[3];
|
||||||
l_info linfo;
|
l_info linfo;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
cprElfHdr3 elfout;
|
cprElfHdr3 elfout;
|
||||||
|
|
||||||
|
|||||||
+17
-14
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -197,15 +197,18 @@ void PackLinuxElf32x86interp::pack3(OutputFile *fo, Filter &/*ft*/)
|
|||||||
void PackLinuxElf32x86interp::unpack(OutputFile *fo)
|
void PackLinuxElf32x86interp::unpack(OutputFile *fo)
|
||||||
{
|
{
|
||||||
#define MAX_INTERP_HDR 512
|
#define MAX_INTERP_HDR 512
|
||||||
char bufehdr[MAX_INTERP_HDR];
|
union {
|
||||||
Elf32_Ehdr *const ehdr = (Elf32_Ehdr *)bufehdr;
|
unsigned char buf[MAX_INTERP_HDR];
|
||||||
Elf32_Phdr const *phdr = (Elf32_Phdr *)(1+ehdr);
|
//struct { Elf32_Ehdr ehdr; Elf32_Phdr phdr; } e;
|
||||||
|
} u;
|
||||||
|
Elf32_Ehdr *const ehdr = (Elf32_Ehdr *) u.buf;
|
||||||
|
Elf32_Phdr const *phdr = (Elf32_Phdr *) (u.buf + sizeof(*ehdr));
|
||||||
|
|
||||||
unsigned szb_info = sizeof(b_info);
|
unsigned szb_info = sizeof(b_info);
|
||||||
{
|
{
|
||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
fi->readx(bufehdr, MAX_INTERP_HDR);
|
fi->readx(u.buf, MAX_INTERP_HDR);
|
||||||
unsigned const e_entry = get_native32(&ehdr->e_entry);
|
unsigned const e_entry = get_te32(&ehdr->e_entry);
|
||||||
if (e_entry < 0x401180) { /* old style, 8-byte b_info */
|
if (e_entry < 0x401180) { /* old style, 8-byte b_info */
|
||||||
szb_info = 2*sizeof(unsigned);
|
szb_info = 2*sizeof(unsigned);
|
||||||
}
|
}
|
||||||
@@ -214,16 +217,16 @@ void PackLinuxElf32x86interp::unpack(OutputFile *fo)
|
|||||||
fi->seek(overlay_offset, SEEK_SET);
|
fi->seek(overlay_offset, SEEK_SET);
|
||||||
p_info hbuf;
|
p_info hbuf;
|
||||||
fi->readx(&hbuf, sizeof(hbuf));
|
fi->readx(&hbuf, sizeof(hbuf));
|
||||||
unsigned orig_file_size = get_native32(&hbuf.p_filesize);
|
unsigned orig_file_size = get_te32(&hbuf.p_filesize);
|
||||||
blocksize = get_native32(&hbuf.p_blocksize);
|
blocksize = get_te32(&hbuf.p_blocksize);
|
||||||
if (file_size > (off_t)orig_file_size || blocksize > orig_file_size)
|
if (file_size > (off_t)orig_file_size || blocksize > orig_file_size)
|
||||||
throwCantUnpack("file header corrupted");
|
throwCantUnpack("file header corrupted");
|
||||||
|
|
||||||
ibuf.alloc(blocksize + OVERHEAD);
|
ibuf.alloc(blocksize + OVERHEAD);
|
||||||
b_info bhdr; memset(&bhdr, 0, sizeof(bhdr));
|
b_info bhdr; memset(&bhdr, 0, sizeof(bhdr));
|
||||||
fi->readx(&bhdr, szb_info);
|
fi->readx(&bhdr, szb_info);
|
||||||
ph.u_len = get_native32(&bhdr.sz_unc);
|
ph.u_len = get_te32(&bhdr.sz_unc);
|
||||||
ph.c_len = get_native32(&bhdr.sz_cpr);
|
ph.c_len = get_te32(&bhdr.sz_cpr);
|
||||||
ph.filter_cto = bhdr.b_cto8;
|
ph.filter_cto = bhdr.b_cto8;
|
||||||
|
|
||||||
// Uncompress Ehdr and Phdrs.
|
// Uncompress Ehdr and Phdrs.
|
||||||
@@ -277,7 +280,7 @@ void PackLinuxElf32x86interp::unpack(OutputFile *fo)
|
|||||||
|
|
||||||
// check for end-of-file
|
// check for end-of-file
|
||||||
fi->readx(&bhdr, szb_info);
|
fi->readx(&bhdr, szb_info);
|
||||||
unsigned const sz_unc = ph.u_len = get_native32(&bhdr.sz_unc);
|
unsigned const sz_unc = ph.u_len = get_te32(&bhdr.sz_unc);
|
||||||
|
|
||||||
if (sz_unc == 0) { // uncompressed size 0 -> EOF
|
if (sz_unc == 0) { // uncompressed size 0 -> EOF
|
||||||
// note: magic is always stored le32
|
// note: magic is always stored le32
|
||||||
|
|||||||
+5
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_LX_INTERP_H //{
|
#ifndef __UPX_P_LX_INTERP_H //{
|
||||||
#define __UPX_P_LX_INTERP_H
|
#define __UPX_P_LX_INTERP_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+5
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -91,7 +91,7 @@ PackLinuxI386sh::buildLoader(Filter const *ft)
|
|||||||
// filter
|
// filter
|
||||||
optimizeFilter(&fold_ft, buf, sz_fold);
|
optimizeFilter(&fold_ft, buf, sz_fold);
|
||||||
unsigned fold_hdrlen = sizeof(l_info) + sizeof(Elf32_Ehdr) +
|
unsigned fold_hdrlen = sizeof(l_info) + sizeof(Elf32_Ehdr) +
|
||||||
sizeof(Elf32_Phdr) * get_native32(&((Elf32_Ehdr const *)(void *)buf)->e_phnum);
|
sizeof(Elf32_Phdr) * get_te32(&((Elf32_Ehdr const *)(void *)buf)->e_phnum);
|
||||||
if (0 == get_le32(fold_hdrlen + buf)) {
|
if (0 == get_le32(fold_hdrlen + buf)) {
|
||||||
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
|
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
|
||||||
fold_hdrlen = umax(0x80, fold_hdrlen);
|
fold_hdrlen = umax(0x80, fold_hdrlen);
|
||||||
|
|||||||
+5
-5
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2000-2007 John F. Reiser
|
Copyright (C) 2000-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John F. Reiser
|
John F. Reiser
|
||||||
<jreiser@users.sourceforge.net>
|
<jreiser@users.sourceforge.net>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_LX_SH_H //{
|
#ifndef __UPX_P_LX_SH_H //{
|
||||||
#define __UPX_P_LX_SH_H
|
#define __UPX_P_LX_SH_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+815
-92
File diff suppressed because it is too large
Load Diff
+416
-116
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,33 +21,31 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_MACHO_H
|
#ifndef __UPX_P_MACHO_H
|
||||||
#define __UPX_P_MACHO_H
|
#define __UPX_P_MACHO_H 1
|
||||||
|
|
||||||
|
|
||||||
struct Mach_fat_header {
|
__packed_struct(Mach_fat_header)
|
||||||
BE32 magic;
|
BE32 magic;
|
||||||
enum { // note conflict with java bytecode PackLinuxI386
|
enum { // note conflict with java bytecode PackLinuxI386
|
||||||
FAT_MAGIC = 0xcafebabe,
|
FAT_MAGIC = 0xcafebabe,
|
||||||
FAT_MAGIC_SWAB = 0xbebafeca
|
FAT_MAGIC_SWAB = 0xbebafeca
|
||||||
};
|
};
|
||||||
BE32 nfat_arch; // Number of Mach_fat_arch which follow.
|
BE32 nfat_arch; // Number of Mach_fat_arch which follow.
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct Mach_fat_arch {
|
__packed_struct(Mach_fat_arch)
|
||||||
BE32 cputype;
|
BE32 cputype;
|
||||||
BE32 cpusubtype;
|
BE32 cpusubtype;
|
||||||
BE32 offset;
|
BE32 offset;
|
||||||
BE32 size;
|
BE32 size;
|
||||||
BE32 align; /* shift count; log base 2 */
|
BE32 align; /* shift count; log base 2 */
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -68,8 +66,7 @@ struct MachITypes
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_header
|
__packed_struct(Mach_header)
|
||||||
{
|
|
||||||
typedef typename TMachITypes::Word Word;
|
typedef typename TMachITypes::Word Word;
|
||||||
|
|
||||||
Word magic;
|
Word magic;
|
||||||
@@ -81,12 +78,11 @@ struct Mach_header
|
|||||||
Word flags;
|
Word flags;
|
||||||
#define WANT_MACH_HEADER_ENUM 1
|
#define WANT_MACH_HEADER_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_header64
|
__packed_struct(Mach_header64)
|
||||||
{ // only difference is padding to 0 mod 8
|
// only difference is padding to 0 mod 8
|
||||||
typedef typename TMachITypes::Word Word;
|
typedef typename TMachITypes::Word Word;
|
||||||
|
|
||||||
Word magic;
|
Word magic;
|
||||||
@@ -99,12 +95,10 @@ struct Mach_header64
|
|||||||
Word reserved; // pad to 0 mod 8
|
Word reserved; // pad to 0 mod 8
|
||||||
#define WANT_MACH_HEADER_ENUM 1
|
#define WANT_MACH_HEADER_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_segment_command
|
__packed_struct(Mach_segment_command)
|
||||||
{
|
|
||||||
typedef typename TMachITypes::Word Word;
|
typedef typename TMachITypes::Word Word;
|
||||||
typedef typename TMachITypes::Addr Addr;
|
typedef typename TMachITypes::Addr Addr;
|
||||||
typedef typename TMachITypes::Off Off;
|
typedef typename TMachITypes::Off Off;
|
||||||
@@ -122,12 +116,10 @@ struct Mach_segment_command
|
|||||||
Word flags;
|
Word flags;
|
||||||
#define WANT_MACH_SEGMENT_ENUM 1
|
#define WANT_MACH_SEGMENT_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_section_command
|
__packed_struct(Mach_section_command)
|
||||||
{
|
|
||||||
typedef typename TMachITypes::Word Word;
|
typedef typename TMachITypes::Word Word;
|
||||||
typedef typename TMachITypes::Addr Addr;
|
typedef typename TMachITypes::Addr Addr;
|
||||||
typedef typename TMachITypes::Off Off;
|
typedef typename TMachITypes::Off Off;
|
||||||
@@ -136,21 +128,149 @@ struct Mach_section_command
|
|||||||
char segname[16];
|
char segname[16];
|
||||||
Addr addr; /* memory address */
|
Addr addr; /* memory address */
|
||||||
Addr size; /* size in bytes */
|
Addr size; /* size in bytes */
|
||||||
Word offset; /* file offset */ // FIXME: 64 bit?
|
Word offset; /* file offset */
|
||||||
Word align; /* power of 2 */
|
Word align; /* power of 2 */
|
||||||
Word reloff; /* file offset of relocation entries */
|
Word reloff; /* file offset of relocation entries */
|
||||||
Word nreloc; /* number of relocation entries */
|
Word nreloc; /* number of relocation entries */
|
||||||
Word flags; /* section type and attributes */
|
Word flags; /* section type and attributes */
|
||||||
Word reserved1;
|
Word reserved1; /* for offset or index */
|
||||||
Word reserved2;
|
Word reserved2; /* for count or sizeof */
|
||||||
#define WANT_MACH_SECTION_ENUM 1
|
#define WANT_MACH_SECTION_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_ppc_thread_state
|
__packed_struct(Mach_section_command_64)
|
||||||
{
|
typedef typename TMachITypes::Word Word;
|
||||||
|
typedef typename TMachITypes::Addr Addr;
|
||||||
|
typedef typename TMachITypes::Off Off;
|
||||||
|
typedef typename TMachITypes::Word Off32;
|
||||||
|
typedef typename TMachITypes::Xword Xword;
|
||||||
|
|
||||||
|
char sectname[16];
|
||||||
|
char segname[16];
|
||||||
|
Addr addr; /* memory address */
|
||||||
|
Addr size; /* size in bytes */
|
||||||
|
Off32 offset; /* file offset */
|
||||||
|
Word align; /* power of 2 */
|
||||||
|
Word reloff; /* file offset of relocation entries */
|
||||||
|
Word nreloc; /* number of relocation entries */
|
||||||
|
Word flags; /* section type and attributes */
|
||||||
|
Word reserved1; /* for offset or index */
|
||||||
|
Word reserved2; /* for count or sizeof */
|
||||||
|
Word reserved3; /* NOT IN 32-bit VERSION!! */
|
||||||
|
#define WANT_MACH_SECTION_ENUM 1
|
||||||
|
#include "p_mach_enum.h"
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_symtab_command)
|
||||||
|
typedef typename TMachITypes::Word Word;
|
||||||
|
typedef typename TMachITypes::Off Off;
|
||||||
|
typedef typename TMachITypes::Word Off32;
|
||||||
|
|
||||||
|
Word cmd; /* LC_SYMTAB */
|
||||||
|
Word cmdsize; /* sizeof(struct Mach_symtab_command) */
|
||||||
|
Off32 symoff; /* symbol table offset */
|
||||||
|
Word nsyms; /* number of symbol table entries */
|
||||||
|
Off32 stroff; /* string table offset */
|
||||||
|
Word strsize; /* string table size in bytes */
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_dysymtab_command)
|
||||||
|
typedef typename TMachITypes::Word Word;
|
||||||
|
typedef typename TMachITypes::Off Off;
|
||||||
|
typedef typename TMachITypes::Word Off32;
|
||||||
|
|
||||||
|
Word cmd; /* LC_DYSYMTAB */
|
||||||
|
Word cmdsize; /* sizeof(struct Mach_dysymtab_command) */
|
||||||
|
Word ilocalsym; /* index to local symbols */
|
||||||
|
Word nlocalsym; /* number of local symbols */
|
||||||
|
Word iextdefsym; /* index to externally defined symbols */
|
||||||
|
Word nextdefsym; /* number of externally defined symbols */
|
||||||
|
Word iundefsym; /* index to undefined symbols */
|
||||||
|
Word nundefsym; /* number of undefined symbols */
|
||||||
|
Off32 tocoff; /* file offset to table of contents */
|
||||||
|
Word ntoc; /* number of entries in table of contents */
|
||||||
|
Off32 modtaboff; /* file offset to module table */
|
||||||
|
Word nmodtab; /* number of module table entries */
|
||||||
|
Off32 extrefsymoff; /* offset to referenced symbol table */
|
||||||
|
Word nextrefsymoff; /* number of referenced symbol table entries */
|
||||||
|
Off32 indirectsymoff; /* file offset to the indirect symbol table */
|
||||||
|
Word nindirectsyms; /* number of indirect symbol table entries */
|
||||||
|
Off32 extreloff; /* offset to external relocation entries */
|
||||||
|
Word nextrel; /* number of external relocation entries */
|
||||||
|
Off32 locreloff; /* offset to local relocation entries */
|
||||||
|
Word nlocrel; /* number of local relocation entries */
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_segsplit_info_command)
|
||||||
|
typedef typename TMachITypes::Word Word;
|
||||||
|
typedef typename TMachITypes::Off Off;
|
||||||
|
|
||||||
|
Word cmd; /* LC_SEGMENT_SPLIT_INFO */
|
||||||
|
Word cmdsize; /* sizeof(struct Mach_segsplit_info_command) */
|
||||||
|
Off dataoff;
|
||||||
|
Word datasize;
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_routines_command)
|
||||||
|
typedef typename TMachITypes::Word Word;
|
||||||
|
typedef typename TMachITypes::Addr Addr;
|
||||||
|
|
||||||
|
Word cmd;
|
||||||
|
Word cmdsize;
|
||||||
|
Addr init_address;
|
||||||
|
Word init_module;
|
||||||
|
Word reserved1;
|
||||||
|
Word reserved2;
|
||||||
|
Word reserved3;
|
||||||
|
Word reserved4;
|
||||||
|
Word reserved5;
|
||||||
|
Word reserved6;
|
||||||
|
#define WANT_MACH_SEGMENT_ENUM 1
|
||||||
|
#include "p_mach_enum.h"
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_routines_command_64)
|
||||||
|
typedef typename TMachITypes::Word Word;
|
||||||
|
typedef typename TMachITypes::Addr Addr;
|
||||||
|
typedef typename TMachITypes::Xword Xword;
|
||||||
|
|
||||||
|
Word cmd;
|
||||||
|
Word cmdsize;
|
||||||
|
Addr init_address;
|
||||||
|
Xword init_module;
|
||||||
|
Xword reserved1;
|
||||||
|
Xword reserved2;
|
||||||
|
Xword reserved3;
|
||||||
|
Xword reserved4;
|
||||||
|
Xword reserved5;
|
||||||
|
Xword reserved6;
|
||||||
|
#define WANT_MACH_SEGMENT_ENUM 1
|
||||||
|
#include "p_mach_enum.h"
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_twolevel_hints_command)
|
||||||
|
typedef typename TMachITypes::Word Word;
|
||||||
|
typedef typename TMachITypes::Addr Addr;
|
||||||
|
typedef typename TMachITypes::Off Off;
|
||||||
|
|
||||||
|
Word cmd;
|
||||||
|
Word cmdsize;
|
||||||
|
Off offset; /* offset to the hint table */
|
||||||
|
Word nhints; /* number of hints */
|
||||||
|
#define WANT_MACH_SEGMENT_ENUM 1
|
||||||
|
#include "p_mach_enum.h"
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_ppc_thread_state)
|
||||||
typedef typename TMachITypes::Addr Addr;
|
typedef typename TMachITypes::Addr Addr;
|
||||||
|
|
||||||
Addr srr0; /* Instruction address register (PC; entry addr) */
|
Addr srr0; /* Instruction address register (PC; entry addr) */
|
||||||
@@ -167,12 +287,10 @@ struct Mach_ppc_thread_state
|
|||||||
Addr mq; /* MQ register (601 only) */
|
Addr mq; /* MQ register (601 only) */
|
||||||
|
|
||||||
Addr vrsave; /* Vector Save Register */
|
Addr vrsave; /* Vector Save Register */
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_i386_thread_state
|
__packed_struct(Mach_i386_thread_state)
|
||||||
{
|
|
||||||
typedef typename TMachITypes::Word Word;
|
typedef typename TMachITypes::Word Word;
|
||||||
|
|
||||||
Word eax, ebx, ecx, edx;
|
Word eax, ebx, ecx, edx;
|
||||||
@@ -181,12 +299,22 @@ struct Mach_i386_thread_state
|
|||||||
Word eflags;
|
Word eflags;
|
||||||
Word eip, cs;
|
Word eip, cs;
|
||||||
Word ds, es, fs, gs;
|
Word ds, es, fs, gs;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_i386_new_thread_state
|
__packed_struct(Mach_AMD64_thread_state)
|
||||||
{
|
typedef typename TMachITypes::Xword Xword;
|
||||||
|
|
||||||
|
Xword rax, rbx, rcx, rdx;
|
||||||
|
Xword rdi, rsi, rbp, rsp;
|
||||||
|
Xword r8, r9, r10, r11;
|
||||||
|
Xword r12, r13, r14, r15;
|
||||||
|
Xword rip, rflags;
|
||||||
|
Xword cs, fs, gs;
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_i386_new_thread_state)
|
||||||
typedef typename TMachITypes::Word Word;
|
typedef typename TMachITypes::Word Word;
|
||||||
|
|
||||||
Word gs, fs, es, ds;
|
Word gs, fs, es, ds;
|
||||||
@@ -194,8 +322,18 @@ struct Mach_i386_new_thread_state
|
|||||||
Word ebx, edx, ecx, eax;
|
Word ebx, edx, ecx, eax;
|
||||||
Word eip, cs, efl;
|
Word eip, cs, efl;
|
||||||
Word uesp, ss;
|
Word uesp, ss;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
template <class TMachITypes>
|
||||||
|
__packed_struct(Mach_ARM_thread_state)
|
||||||
|
typedef typename TMachITypes::Word Word;
|
||||||
|
|
||||||
|
Word r[13]; // r0-r12
|
||||||
|
Word sp; // r13
|
||||||
|
Word lr; // r14
|
||||||
|
Word pc; // r15
|
||||||
|
Word cpsr;
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
} // namespace N_Mach
|
} // namespace N_Mach
|
||||||
|
|
||||||
@@ -206,8 +344,7 @@ namespace N_Mach32 {
|
|||||||
namespace N_Mach64 {
|
namespace N_Mach64 {
|
||||||
|
|
||||||
template <class TMachITypes>
|
template <class TMachITypes>
|
||||||
struct Mach_ppc_thread_state64
|
__packed_struct(Mach_ppc_thread_state64)
|
||||||
{
|
|
||||||
typedef typename TMachITypes::Word Word;
|
typedef typename TMachITypes::Word Word;
|
||||||
typedef typename TMachITypes::Xword Xword;
|
typedef typename TMachITypes::Xword Xword;
|
||||||
|
|
||||||
@@ -224,8 +361,7 @@ struct Mach_ppc_thread_state64
|
|||||||
Xword ctr; /* Count register */
|
Xword ctr; /* Count register */
|
||||||
|
|
||||||
Word vrsave; /* Vector Save Register */
|
Word vrsave; /* Vector Save Register */
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
} // namespace N_Mach64
|
} // namespace N_Mach64
|
||||||
|
|
||||||
@@ -236,13 +372,13 @@ struct MachClass_32
|
|||||||
{
|
{
|
||||||
typedef TP BeLePolicy;
|
typedef TP BeLePolicy;
|
||||||
|
|
||||||
// integral types
|
// integral types (target endianness)
|
||||||
typedef typename TP::U16 U16;
|
typedef typename TP::U16 TE16;
|
||||||
typedef typename TP::U32 U32;
|
typedef typename TP::U32 TE32;
|
||||||
typedef typename TP::U64 U64;
|
typedef typename TP::U64 TE64;
|
||||||
typedef N_Mach::MachITypes<U32, U64, U32, U32> MachITypes;
|
typedef N_Mach::MachITypes<TE32, TE64, TE32, TE32> MachITypes;
|
||||||
#if (ACC_CC_BORLANDC)
|
#if (ACC_CC_BORLANDC)
|
||||||
typedef U32 Addr;
|
typedef TE32 Addr;
|
||||||
#else
|
#else
|
||||||
typedef typename MachITypes::Addr Addr;
|
typedef typename MachITypes::Addr Addr;
|
||||||
#endif
|
#endif
|
||||||
@@ -251,8 +387,15 @@ struct MachClass_32
|
|||||||
typedef N_Mach::Mach_header<MachITypes> Mach_header;
|
typedef N_Mach::Mach_header<MachITypes> Mach_header;
|
||||||
typedef N_Mach::Mach_segment_command<MachITypes> Mach_segment_command;
|
typedef N_Mach::Mach_segment_command<MachITypes> Mach_segment_command;
|
||||||
typedef N_Mach::Mach_section_command<MachITypes> Mach_section_command;
|
typedef N_Mach::Mach_section_command<MachITypes> Mach_section_command;
|
||||||
|
typedef N_Mach::Mach_symtab_command<MachITypes> Mach_symtab_command;
|
||||||
|
typedef N_Mach::Mach_dysymtab_command<MachITypes> Mach_dysymtab_command;
|
||||||
|
typedef N_Mach::Mach_segsplit_info_command<MachITypes> Mach_segsplit_info_command;
|
||||||
|
typedef N_Mach::Mach_routines_command<MachITypes> Mach_routines_command;
|
||||||
|
typedef N_Mach::Mach_twolevel_hints_command<MachITypes> Mach_twolevel_hints_command;
|
||||||
typedef N_Mach::Mach_ppc_thread_state<MachITypes> Mach_ppc_thread_state;
|
typedef N_Mach::Mach_ppc_thread_state<MachITypes> Mach_ppc_thread_state;
|
||||||
typedef N_Mach::Mach_i386_thread_state<MachITypes> Mach_i386_thread_state;
|
typedef N_Mach::Mach_i386_thread_state<MachITypes> Mach_i386_thread_state;
|
||||||
|
typedef N_Mach::Mach_AMD64_thread_state<MachITypes> Mach_AMD64_thread_state;
|
||||||
|
typedef N_Mach::Mach_ARM_thread_state<MachITypes> Mach_ARM_thread_state;
|
||||||
|
|
||||||
static void compileTimeAssertions() {
|
static void compileTimeAssertions() {
|
||||||
BeLePolicy::compileTimeAssertions();
|
BeLePolicy::compileTimeAssertions();
|
||||||
@@ -265,19 +408,30 @@ struct MachClass_64
|
|||||||
{
|
{
|
||||||
typedef TP BeLePolicy;
|
typedef TP BeLePolicy;
|
||||||
|
|
||||||
// integral types
|
// integral types (target endianness)
|
||||||
typedef typename TP::U16 U16;
|
typedef typename TP::U16 TE16;
|
||||||
typedef typename TP::U32 U32;
|
typedef typename TP::U32 TE32;
|
||||||
typedef typename TP::U64 U64;
|
typedef typename TP::U64 TE64;
|
||||||
typedef N_Mach::MachITypes<U32, U64, U64, U64> MachITypes;
|
typedef N_Mach::MachITypes<TE32, TE64, TE64, TE64> MachITypes;
|
||||||
|
#if (ACC_CC_BORLANDC)
|
||||||
|
typedef TE64 Addr;
|
||||||
|
#else
|
||||||
|
typedef typename MachITypes::Addr Addr;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Mach types
|
// Mach types
|
||||||
typedef N_Mach::Mach_header64<MachITypes> Mach_header;
|
typedef N_Mach::Mach_header64<MachITypes> Mach_header;
|
||||||
typedef N_Mach::Mach_segment_command<MachITypes> Mach_segment_command;
|
typedef N_Mach::Mach_segment_command<MachITypes> Mach_segment_command;
|
||||||
typedef N_Mach::Mach_section_command<MachITypes> Mach_section_command;
|
typedef N_Mach::Mach_section_command_64<MachITypes> Mach_section_command;
|
||||||
|
typedef N_Mach::Mach_symtab_command<MachITypes> Mach_symtab_command;
|
||||||
|
typedef N_Mach::Mach_dysymtab_command<MachITypes> Mach_dysymtab_command;
|
||||||
|
typedef N_Mach::Mach_segsplit_info_command<MachITypes> Mach_segsplit_info_command;
|
||||||
|
typedef N_Mach::Mach_routines_command_64<MachITypes> Mach_routines_command;
|
||||||
|
typedef N_Mach::Mach_twolevel_hints_command<MachITypes> Mach_twolevel_hints_command;
|
||||||
|
|
||||||
static void compileTimeAssertions() {
|
static void compileTimeAssertions() {
|
||||||
BeLePolicy::compileTimeAssertions();
|
BeLePolicy::compileTimeAssertions();
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(Addr) == 8)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -293,24 +447,56 @@ typedef N_Mach::MachClass_64<N_BELE_CTP::LEPolicy> MachClass_LE64;
|
|||||||
// shortcuts
|
// shortcuts
|
||||||
typedef MachClass_Host32::Mach_segment_command Mach32_segment_command;
|
typedef MachClass_Host32::Mach_segment_command Mach32_segment_command;
|
||||||
typedef MachClass_Host32::Mach_section_command Mach32_section_command;
|
typedef MachClass_Host32::Mach_section_command Mach32_section_command;
|
||||||
|
typedef MachClass_Host32::Mach_symtab_command Mach32_symtab_command;
|
||||||
|
typedef MachClass_Host32::Mach_dysymtab_command Mach32_dysymtab_command;
|
||||||
|
typedef MachClass_Host32::Mach_segsplit_info_command Mach32_segsplit_info_command;
|
||||||
|
typedef MachClass_Host32::Mach_routines_command Mach32_routines_command;
|
||||||
|
typedef MachClass_Host32::Mach_twolevel_hints_command Mach32_twolevel_hints_command;
|
||||||
|
|
||||||
typedef MachClass_Host64::Mach_segment_command Mach64_segment_command;
|
typedef MachClass_Host64::Mach_segment_command Mach64_segment_command;
|
||||||
typedef MachClass_Host64::Mach_section_command Mach64_section_command;
|
typedef MachClass_Host64::Mach_section_command Mach64_section_command;
|
||||||
|
typedef MachClass_Host64::Mach_symtab_command Mach64_symtab_command;
|
||||||
|
typedef MachClass_Host64::Mach_dysymtab_command Mach64_dysymtab_command;
|
||||||
|
typedef MachClass_Host64::Mach_segsplit_info_command Mach64_segsplit_info_command;
|
||||||
|
typedef MachClass_Host64::Mach_routines_command Mach64_routines_command;
|
||||||
|
typedef MachClass_Host64::Mach_twolevel_hints_command Mach64_twolevel_hints_command;
|
||||||
|
|
||||||
typedef MachClass_BE32::Mach_segment_command MachBE32_segment_command;
|
typedef MachClass_BE32::Mach_segment_command MachBE32_segment_command;
|
||||||
typedef MachClass_BE32::Mach_section_command MachBE32_section_command;
|
typedef MachClass_BE32::Mach_section_command MachBE32_section_command;
|
||||||
|
typedef MachClass_BE32::Mach_symtab_command MachBE32_symtab_command;
|
||||||
|
typedef MachClass_BE32::Mach_dysymtab_command MachBE32_dysymtab_command;
|
||||||
|
typedef MachClass_BE32::Mach_segsplit_info_command MachBE32_segsplit_info_command;
|
||||||
|
typedef MachClass_BE32::Mach_routines_command MachBE32_routines_command;
|
||||||
|
typedef MachClass_BE32::Mach_twolevel_hints_command MachBE32_twolevel_hints_command;
|
||||||
|
|
||||||
typedef MachClass_BE64::Mach_segment_command MachBE64_segment_command;
|
typedef MachClass_BE64::Mach_segment_command MachBE64_segment_command;
|
||||||
typedef MachClass_BE64::Mach_section_command MachBE64_section_command;
|
typedef MachClass_BE64::Mach_section_command MachBE64_section_command;
|
||||||
|
typedef MachClass_BE64::Mach_symtab_command MachBE64_symtab_command;
|
||||||
|
typedef MachClass_BE64::Mach_dysymtab_command MachBE64_dysymtab_command;
|
||||||
|
typedef MachClass_BE64::Mach_segsplit_info_command MachBE64_segsplit_info_command;
|
||||||
|
typedef MachClass_BE64::Mach_routines_command MachBE64_routines_command;
|
||||||
|
typedef MachClass_BE64::Mach_twolevel_hints_command MachBE64_twolevel_hints_command;
|
||||||
|
|
||||||
typedef MachClass_LE32::Mach_segment_command MachLE32_segment_command;
|
typedef MachClass_LE32::Mach_segment_command MachLE32_segment_command;
|
||||||
typedef MachClass_LE32::Mach_section_command MachLE32_section_command;
|
typedef MachClass_LE32::Mach_section_command MachLE32_section_command;
|
||||||
|
typedef MachClass_LE32::Mach_symtab_command MachLE32_symtab_command;
|
||||||
|
typedef MachClass_LE32::Mach_dysymtab_command MachLE32_dysymtab_command;
|
||||||
|
typedef MachClass_LE32::Mach_segsplit_info_command MachLE32_segsplit_info_command;
|
||||||
|
typedef MachClass_LE32::Mach_routines_command MachLE32_routines_command;
|
||||||
|
typedef MachClass_LE32::Mach_twolevel_hints_command MachLE32_twolevel_hints_command;
|
||||||
|
|
||||||
typedef MachClass_LE64::Mach_segment_command MachLE64_segment_command;
|
typedef MachClass_LE64::Mach_segment_command MachLE64_segment_command;
|
||||||
typedef MachClass_LE64::Mach_section_command MachLE64_section_command;
|
typedef MachClass_LE64::Mach_section_command MachLE64_section_command;
|
||||||
|
typedef MachClass_LE64::Mach_symtab_command MachLE64_symtab_command;
|
||||||
|
typedef MachClass_LE64::Mach_dysymtab_command MachLE64_dysymtab_command;
|
||||||
|
typedef MachClass_LE64::Mach_segsplit_info_command MachLE64_segsplit_info_command;
|
||||||
|
typedef MachClass_LE64::Mach_routines_command MachLE64_routines_command;
|
||||||
|
typedef MachClass_LE64::Mach_twolevel_hints_command MachLE64_twolevel_hints_command;
|
||||||
|
|
||||||
typedef MachClass_BE32::Mach_ppc_thread_state Mach_ppc_thread_state;
|
typedef MachClass_BE32::Mach_ppc_thread_state Mach_ppc_thread_state;
|
||||||
typedef MachClass_LE32::Mach_i386_thread_state Mach_i386_thread_state;
|
typedef MachClass_LE32::Mach_i386_thread_state Mach_i386_thread_state;
|
||||||
|
typedef MachClass_LE32::Mach_AMD64_thread_state Mach_AMD64_thread_state; // FIXME LE32 vs AMD64
|
||||||
|
typedef MachClass_LE32::Mach_ARM_thread_state Mach_ARM_thread_state;
|
||||||
#include "p_unix.h"
|
#include "p_unix.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -322,18 +508,24 @@ protected:
|
|||||||
typedef TMachClass MachClass;
|
typedef TMachClass MachClass;
|
||||||
typedef typename MachClass::BeLePolicy BeLePolicy;
|
typedef typename MachClass::BeLePolicy BeLePolicy;
|
||||||
typedef typename MachClass::MachITypes MachITypes;
|
typedef typename MachClass::MachITypes MachITypes;
|
||||||
// integral types
|
// integral types (target endianness)
|
||||||
typedef typename MachClass::U16 U16;
|
typedef typename MachClass::TE16 TE16;
|
||||||
typedef typename MachClass::U32 U32;
|
typedef typename MachClass::TE32 TE32;
|
||||||
typedef typename MachClass::U64 U64;
|
typedef typename MachClass::TE64 TE64;
|
||||||
typedef typename MachClass::Addr Addr;
|
typedef typename MachClass::Addr Addr;
|
||||||
// Mach types
|
// Mach types
|
||||||
typedef typename MachClass::Mach_header Mach_header;
|
typedef typename MachClass::Mach_header Mach_header;
|
||||||
typedef typename MachClass::Mach_segment_command Mach_segment_command;
|
typedef typename MachClass::Mach_segment_command Mach_segment_command;
|
||||||
typedef typename MachClass::Mach_section_command Mach_section_command;
|
typedef typename MachClass::Mach_section_command Mach_section_command;
|
||||||
|
typedef typename MachClass::Mach_symtab_command Mach_symtab_command;
|
||||||
|
typedef typename MachClass::Mach_dysymtab_command Mach_dysymtab_command;
|
||||||
|
typedef typename MachClass::Mach_segsplit_info_command Mach_segsplit_info_command;
|
||||||
|
typedef typename MachClass::Mach_routines_command Mach_routines_command;
|
||||||
|
typedef typename MachClass::Mach_twolevel_hints_command Mach_twolevel_hints_command;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PackMachBase(InputFile *, unsigned cpuid, unsigned t_flavor, unsigned ts_word_cnt, unsigned tc_size);
|
PackMachBase(InputFile *, unsigned cpuid, unsigned filetype,
|
||||||
|
unsigned t_flavor, unsigned ts_word_cnt, unsigned tc_size);
|
||||||
virtual ~PackMachBase();
|
virtual ~PackMachBase();
|
||||||
virtual int getVersion() const { return 13; }
|
virtual int getVersion() const { return 13; }
|
||||||
virtual const int *getCompressionMethods(int method, int level) const;
|
virtual const int *getCompressionMethods(int method, int level) const;
|
||||||
@@ -344,6 +536,8 @@ public:
|
|||||||
virtual void pack3(OutputFile *, Filter &) = 0; // append loader
|
virtual void pack3(OutputFile *, Filter &) = 0; // append loader
|
||||||
virtual void pack4(OutputFile *, Filter &) = 0; // append PackHeader
|
virtual void pack4(OutputFile *, Filter &) = 0; // append PackHeader
|
||||||
|
|
||||||
|
virtual void pack4dylib(OutputFile *, Filter &, Addr init_address);
|
||||||
|
|
||||||
virtual void pack1_setup_threado(OutputFile *const fo) = 0;
|
virtual void pack1_setup_threado(OutputFile *const fo) = 0;
|
||||||
virtual void unpack(OutputFile *fo);
|
virtual void unpack(OutputFile *fo);
|
||||||
|
|
||||||
@@ -366,6 +560,7 @@ protected:
|
|||||||
static int __acc_cdecl_qsort compare_segment_command(void const *aa, void const *bb);
|
static int __acc_cdecl_qsort compare_segment_command(void const *aa, void const *bb);
|
||||||
|
|
||||||
unsigned my_cputype;
|
unsigned my_cputype;
|
||||||
|
unsigned my_filetype;
|
||||||
unsigned my_thread_flavor;
|
unsigned my_thread_flavor;
|
||||||
unsigned my_thread_state_word_count;
|
unsigned my_thread_state_word_count;
|
||||||
unsigned my_thread_command_size;
|
unsigned my_thread_command_size;
|
||||||
@@ -375,37 +570,47 @@ protected:
|
|||||||
unsigned sz_mach_headers;
|
unsigned sz_mach_headers;
|
||||||
Mach_segment_command *rawmseg; // as input, with sections
|
Mach_segment_command *rawmseg; // as input, with sections
|
||||||
Mach_segment_command *msegcmd; // LC_SEGMENT first, without sections
|
Mach_segment_command *msegcmd; // LC_SEGMENT first, without sections
|
||||||
|
unsigned o_routines_cmd; // file offset to LC_ROUINTES
|
||||||
|
acc_uint64l_t prev_init_address;
|
||||||
Mach_header mhdri;
|
Mach_header mhdri;
|
||||||
|
|
||||||
Mach_header mhdro;
|
Mach_header mhdro;
|
||||||
Mach_segment_command segcmdo;
|
Mach_segment_command segcmdo;
|
||||||
|
|
||||||
struct b_info { // 12-byte header before each compressed block
|
__packed_struct(b_info) // 12-byte header before each compressed block
|
||||||
U32 sz_unc; // uncompressed_size
|
TE32 sz_unc; // uncompressed_size
|
||||||
U32 sz_cpr; // compressed_size
|
TE32 sz_cpr; // compressed_size
|
||||||
unsigned char b_method; // compression algorithm
|
unsigned char b_method; // compression algorithm
|
||||||
unsigned char b_ftid; // filter id
|
unsigned char b_ftid; // filter id
|
||||||
unsigned char b_cto8; // filter parameter
|
unsigned char b_cto8; // filter parameter
|
||||||
unsigned char b_unused;
|
unsigned char b_unused;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
struct l_info { // 12-byte trailer in header for loader
|
__packed_struct(l_info) // 12-byte trailer in header for loader
|
||||||
U32 l_checksum;
|
TE32 l_checksum;
|
||||||
LE32 l_magic;
|
LE32 l_magic;
|
||||||
U16 l_lsize;
|
TE16 l_lsize;
|
||||||
unsigned char l_version;
|
unsigned char l_version;
|
||||||
unsigned char l_format;
|
unsigned char l_format;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct p_info { // 12-byte packed program header
|
__packed_struct(p_info) // 12-byte packed program header
|
||||||
U32 p_progid;
|
TE32 p_progid;
|
||||||
U32 p_filesize;
|
TE32 p_filesize;
|
||||||
U32 p_blocksize;
|
TE32 p_blocksize;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct l_info linfo;
|
struct l_info linfo;
|
||||||
|
|
||||||
|
static void compileTimeAssertions() {
|
||||||
|
MachClass::compileTimeAssertions();
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(b_info) == 12)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(l_info) == 12)
|
||||||
|
COMPILE_TIME_ASSERT(sizeof(p_info) == 12)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(b_info)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(l_info)
|
||||||
|
COMPILE_TIME_ASSERT_ALIGNED1(p_info)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -414,21 +619,12 @@ class PackMachPPC32 : public PackMachBase<MachClass_BE32>
|
|||||||
typedef PackMachBase<MachClass_BE32> super;
|
typedef PackMachBase<MachClass_BE32> super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PackMachPPC32(InputFile *f) : super(f, Mach_header::CPU_TYPE_POWERPC,
|
PackMachPPC32(InputFile *f);
|
||||||
Mach_thread_command::PPC_THREAD_STATE,
|
|
||||||
sizeof(Mach_ppc_thread_state)>>2, sizeof(threado)) { }
|
|
||||||
|
|
||||||
virtual int getFormat() const { return UPX_F_MACH_PPC32; }
|
virtual int getFormat() const { return UPX_F_MACH_PPC32; }
|
||||||
virtual const char *getName() const { return "Mach/ppc32"; }
|
virtual const char *getName() const { return "Mach/ppc32"; }
|
||||||
virtual const char *getFullName(const options_t *) const { return "powerpc-darwin.macho"; }
|
virtual const char *getFullName(const options_t *) const { return "powerpc-darwin.macho"; }
|
||||||
|
|
||||||
virtual acc_uint64l_t get_native64(const void *b) const { return get_be64(b); }
|
|
||||||
virtual unsigned get_native32(const void *b) const { return get_be32(b); }
|
|
||||||
virtual unsigned get_native16(const void *b) const { return get_be16(b); }
|
|
||||||
virtual void set_native64(void *b, acc_uint64l_t v) const { set_be64(b, v); }
|
|
||||||
virtual void set_native32(void *b, unsigned v) const { set_be32(b, v); }
|
|
||||||
virtual void set_native16(void *b, unsigned v) const { set_be16(b, v); }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual const int *getFilters() const;
|
virtual const int *getFilters() const;
|
||||||
|
|
||||||
@@ -438,28 +634,41 @@ protected:
|
|||||||
virtual Linker* newLinker() const;
|
virtual Linker* newLinker() const;
|
||||||
virtual void buildLoader(const Filter *ft);
|
virtual void buildLoader(const Filter *ft);
|
||||||
|
|
||||||
struct Mach_thread_command
|
__packed_struct(Mach_thread_command)
|
||||||
{
|
|
||||||
BE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */
|
BE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */
|
||||||
BE32 cmdsize; /* total size of this command */
|
BE32 cmdsize; /* total size of this command */
|
||||||
BE32 flavor;
|
BE32 flavor;
|
||||||
BE32 count; /* sizeof(following_thread_state)/4 */
|
BE32 count; /* sizeof(following_thread_state)/4 */
|
||||||
Mach_ppc_thread_state state;
|
Mach_ppc_thread_state state;
|
||||||
#define WANT_MACH_THREAD_ENUM
|
#define WANT_MACH_THREAD_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
Mach_thread_command threado;
|
Mach_thread_command threado;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class PackDylibPPC32 : public PackMachPPC32
|
||||||
|
{
|
||||||
|
typedef PackMachPPC32 super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PackDylibPPC32(InputFile *f);
|
||||||
|
|
||||||
|
virtual int getFormat() const { return UPX_F_DYLIB_PPC32; }
|
||||||
|
virtual const char *getName() const { return "Dylib/ppc32"; }
|
||||||
|
virtual const char *getFullName(const options_t *) const { return "powerpc-darwin.dylib"; }
|
||||||
|
protected:
|
||||||
|
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||||
|
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||||
|
virtual void buildLoader(const Filter *ft);
|
||||||
|
};
|
||||||
|
|
||||||
class PackMachI386 : public PackMachBase<MachClass_LE32>
|
class PackMachI386 : public PackMachBase<MachClass_LE32>
|
||||||
{
|
{
|
||||||
typedef PackMachBase<MachClass_LE32> super;
|
typedef PackMachBase<MachClass_LE32> super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PackMachI386(InputFile *f) : super(f, Mach_header::CPU_TYPE_I386,
|
PackMachI386(InputFile *f);
|
||||||
(unsigned)Mach_thread_command::i386_THREAD_STATE,
|
|
||||||
sizeof(Mach_i386_thread_state)>>2, sizeof(threado)) { }
|
|
||||||
|
|
||||||
virtual int getFormat() const { return UPX_F_MACH_i386; }
|
virtual int getFormat() const { return UPX_F_MACH_i386; }
|
||||||
virtual const char *getName() const { return "Mach/i386"; }
|
virtual const char *getName() const { return "Mach/i386"; }
|
||||||
@@ -467,13 +676,6 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
virtual const int *getFilters() const;
|
virtual const int *getFilters() const;
|
||||||
|
|
||||||
virtual acc_uint64l_t get_native64(const void *b) const { return get_le64(b); }
|
|
||||||
virtual unsigned get_native32(const void *b) const { return get_le32(b); }
|
|
||||||
virtual unsigned get_native16(const void *b) const { return get_le16(b); }
|
|
||||||
virtual void set_native64(void *b, acc_uint64l_t v) const { set_le64(b, v); }
|
|
||||||
virtual void set_native32(void *b, unsigned v) const { set_le32(b, v); }
|
|
||||||
virtual void set_native16(void *b, unsigned v) const { set_le16(b, v); }
|
|
||||||
|
|
||||||
virtual void pack1_setup_threado(OutputFile *const fo);
|
virtual void pack1_setup_threado(OutputFile *const fo);
|
||||||
virtual void pack3(OutputFile *, Filter &); // append loader
|
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||||
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||||
@@ -481,17 +683,115 @@ protected:
|
|||||||
virtual void buildLoader(const Filter *ft);
|
virtual void buildLoader(const Filter *ft);
|
||||||
virtual void addStubEntrySections(Filter const *);
|
virtual void addStubEntrySections(Filter const *);
|
||||||
|
|
||||||
struct Mach_thread_command
|
__packed_struct(Mach_thread_command)
|
||||||
{
|
|
||||||
LE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */
|
LE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */
|
||||||
LE32 cmdsize; /* total size of this command */
|
LE32 cmdsize; /* total size of this command */
|
||||||
LE32 flavor;
|
LE32 flavor;
|
||||||
LE32 count; /* sizeof(following_thread_state)/4 */
|
LE32 count; /* sizeof(following_thread_state)/4 */
|
||||||
Mach_i386_thread_state state;
|
Mach_i386_thread_state state;
|
||||||
#define WANT_MACH_THREAD_ENUM
|
#define WANT_MACH_THREAD_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
Mach_thread_command threado;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PackDylibI386 : public PackMachI386
|
||||||
|
{
|
||||||
|
typedef PackMachI386 super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PackDylibI386(InputFile *f);
|
||||||
|
|
||||||
|
virtual int getFormat() const { return UPX_F_DYLIB_i386; }
|
||||||
|
virtual const char *getName() const { return "Dylib/i386"; }
|
||||||
|
virtual const char *getFullName(const options_t *) const { return "i386-darwin.dylib"; }
|
||||||
|
protected:
|
||||||
|
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||||
|
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||||
|
virtual void buildLoader(const Filter *ft);
|
||||||
|
};
|
||||||
|
|
||||||
|
class PackMachAMD64 : public PackMachBase<MachClass_LE64>
|
||||||
|
{
|
||||||
|
typedef PackMachBase<MachClass_LE64> super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PackMachAMD64(InputFile *f);
|
||||||
|
|
||||||
|
virtual int getFormat() const { return UPX_F_MACH_AMD64; }
|
||||||
|
virtual const char *getName() const { return "Mach/AMD64"; }
|
||||||
|
virtual const char *getFullName(const options_t *) const { return "AMD64-darwin.macho"; }
|
||||||
|
protected:
|
||||||
|
virtual const int *getFilters() const;
|
||||||
|
|
||||||
|
virtual void pack1_setup_threado(OutputFile *const fo);
|
||||||
|
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||||
|
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||||
|
virtual Linker* newLinker() const;
|
||||||
|
virtual void buildLoader(const Filter *ft);
|
||||||
|
virtual void addStubEntrySections(Filter const *);
|
||||||
|
|
||||||
|
__packed_struct(Mach_thread_command)
|
||||||
|
LE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */
|
||||||
|
LE32 cmdsize; /* total size of this command */
|
||||||
|
LE32 flavor;
|
||||||
|
LE32 count; /* sizeof(following_thread_state)/4 */
|
||||||
|
Mach_AMD64_thread_state state;
|
||||||
|
#define WANT_MACH_THREAD_ENUM 1
|
||||||
|
#include "p_mach_enum.h"
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
|
Mach_thread_command threado;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PackDylibAMD64 : public PackMachAMD64
|
||||||
|
{
|
||||||
|
typedef PackMachAMD64 super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PackDylibAMD64(InputFile *f);
|
||||||
|
|
||||||
|
virtual int getFormat() const { return UPX_F_DYLIB_AMD64; }
|
||||||
|
virtual const char *getName() const { return "Dylib/AMD64"; }
|
||||||
|
virtual const char *getFullName(const options_t *) const { return "AMD64-darwin.dylib"; }
|
||||||
|
protected:
|
||||||
|
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||||
|
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||||
|
virtual void buildLoader(const Filter *ft);
|
||||||
|
};
|
||||||
|
|
||||||
|
class PackMachARMEL : public PackMachBase<MachClass_LE32>
|
||||||
|
{
|
||||||
|
typedef PackMachBase<MachClass_LE32> super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PackMachARMEL(InputFile *f);
|
||||||
|
|
||||||
|
virtual int getFormat() const { return UPX_F_MACH_ARMEL; }
|
||||||
|
virtual const char *getName() const { return "Mach/ARMEL"; }
|
||||||
|
virtual const char *getFullName(const options_t *) const { return "ARMEL-darwin.macho"; }
|
||||||
|
protected:
|
||||||
|
virtual const int *getCompressionMethods(int method, int level) const;
|
||||||
|
virtual const int *getFilters() const;
|
||||||
|
|
||||||
|
virtual void pack1_setup_threado(OutputFile *const fo);
|
||||||
|
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||||
|
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||||
|
virtual Linker* newLinker() const;
|
||||||
|
virtual void buildLoader(const Filter *ft);
|
||||||
|
virtual void addStubEntrySections(Filter const *);
|
||||||
|
|
||||||
|
__packed_struct(Mach_thread_command)
|
||||||
|
LE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */
|
||||||
|
LE32 cmdsize; /* total size of this command */
|
||||||
|
LE32 flavor;
|
||||||
|
LE32 count; /* sizeof(following_thread_state)/4 */
|
||||||
|
Mach_ARM_thread_state state;
|
||||||
|
#define WANT_MACH_THREAD_ENUM 1
|
||||||
|
#include "p_mach_enum.h"
|
||||||
|
__packed_struct_end()
|
||||||
|
|
||||||
Mach_thread_command threado;
|
Mach_thread_command threado;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -529,11 +829,11 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
enum { N_FAT_ARCH = 5 };
|
enum { N_FAT_ARCH = 5 };
|
||||||
protected:
|
protected:
|
||||||
struct Fat_head {
|
__packed_struct(Fat_head)
|
||||||
struct Mach_fat_header fat;
|
struct Mach_fat_header fat;
|
||||||
struct Mach_fat_arch arch[N_FAT_ARCH];
|
struct Mach_fat_arch arch[N_FAT_ARCH];
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
Fat_head fat_head;
|
Fat_head fat_head;
|
||||||
|
|
||||||
// UI handler
|
// UI handler
|
||||||
@@ -541,7 +841,7 @@ protected:
|
|||||||
|
|
||||||
// linker
|
// linker
|
||||||
Linker *linker;
|
Linker *linker;
|
||||||
#define WANT_MACH_HEADER_ENUM
|
#define WANT_MACH_HEADER_ENUM 1
|
||||||
#include "p_mach_enum.h"
|
#include "p_mach_enum.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+47
-12
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 2007 John F. Reiser
|
Copyright (C) 2007-2010 John F. Reiser
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -40,11 +40,19 @@
|
|||||||
};
|
};
|
||||||
enum { // cputype
|
enum { // cputype
|
||||||
CPU_TYPE_I386 = 7,
|
CPU_TYPE_I386 = 7,
|
||||||
|
CPU_TYPE_X86_64 = 0x01000007,
|
||||||
|
CPU_TYPE_ARM = 12,
|
||||||
CPU_TYPE_POWERPC = 0x00000012,
|
CPU_TYPE_POWERPC = 0x00000012,
|
||||||
CPU_TYPE_POWERPC64 = 0x01000012
|
CPU_TYPE_POWERPC64 = 0x01000012
|
||||||
};
|
};
|
||||||
|
enum { // cpusubtype
|
||||||
|
CPU_SUBTYPE_ARM_ALL = 0,
|
||||||
|
CPU_SUBTYPE_ARM_V4T = 5,
|
||||||
|
CPU_SUBTYPE_ARM_V6 = 6
|
||||||
|
};
|
||||||
enum { // filetype
|
enum { // filetype
|
||||||
MH_EXECUTE = 2
|
MH_EXECUTE = 2,
|
||||||
|
MH_DYLIB = 6
|
||||||
};
|
};
|
||||||
enum { // flags
|
enum { // flags
|
||||||
MH_NOUNDEFS = 1
|
MH_NOUNDEFS = 1
|
||||||
@@ -55,10 +63,26 @@
|
|||||||
#undef WANT_MACH_SEGMENT_ENUM
|
#undef WANT_MACH_SEGMENT_ENUM
|
||||||
enum { // cmd
|
enum { // cmd
|
||||||
LC_SEGMENT = 0x1,
|
LC_SEGMENT = 0x1,
|
||||||
|
LC_SYMTAB = 0x2,
|
||||||
LC_THREAD = 0x4,
|
LC_THREAD = 0x4,
|
||||||
LC_UNIXTHREAD = 0x5,
|
LC_UNIXTHREAD = 0x5,
|
||||||
|
LC_DYSYMTAB = 0xb,
|
||||||
|
LC_LOAD_DYLIB = 0xc,
|
||||||
|
LC_ID_DYLIB = 0xd,
|
||||||
LC_LOAD_DYLINKER = 0xe,
|
LC_LOAD_DYLINKER = 0xe,
|
||||||
LC_SEGMENT_64 = 0x19
|
LC_ROUTINES = 0x11,
|
||||||
|
LC_TWOLEVEL_HINTS= 0x16,
|
||||||
|
LC_SEGMENT_64 = 0x19,
|
||||||
|
LC_ROUTINES_64 = 0x1a,
|
||||||
|
LC_UUID = 0x1b,
|
||||||
|
LC_RPATH = 0x1c,
|
||||||
|
LC_CODE_SIGNATURE = 0x1d,
|
||||||
|
LC_SEGMENT_SPLIT_INFO = 0x1e,
|
||||||
|
LC_REEXPORT_DYLIB = 0x1f,
|
||||||
|
LC_LAZY_LOAD_DYLIB= 0X20,
|
||||||
|
LC_ENCRYPTION_INFO= 0X21,
|
||||||
|
LC_DYLD_INFO = 0X22, // compressed dyld information (10.6.x)
|
||||||
|
LC_REQ_DYLD = 0x80000000 // OR'ed ==> must not ignore
|
||||||
};
|
};
|
||||||
enum { // maxprot
|
enum { // maxprot
|
||||||
VM_PROT_READ = 1,
|
VM_PROT_READ = 1,
|
||||||
@@ -69,24 +93,32 @@
|
|||||||
|
|
||||||
#ifdef WANT_MACH_SECTION_ENUM /*{*/
|
#ifdef WANT_MACH_SECTION_ENUM /*{*/
|
||||||
#undef WANT_MACH_SECTION_ENUM
|
#undef WANT_MACH_SECTION_ENUM
|
||||||
enum { // section flags
|
enum { // section type (low byte only)
|
||||||
S_REGULAR = 0,
|
S_REGULAR = 0,
|
||||||
S_ZEROFILL,
|
S_ZEROFILL,
|
||||||
S_CSTRING_LITERALS,
|
S_CSTRING_LITERALS,
|
||||||
S_4BYTE_LITERALS,
|
S_4BYTE_LITERALS,
|
||||||
S_8BYTE_LITERALS,
|
S_8BYTE_LITERALS,
|
||||||
S_LITERAL_POINTERS,
|
S_LITERAL_POINTERS,
|
||||||
S_NON_LAZY_SYMBOL_POINTERS,
|
S_NON_LAZY_SYMBOL_POINTERS, // sectname __nl_symbol_ptr
|
||||||
S_LAZY_SYMBOL_POINTERS,
|
S_LAZY_SYMBOL_POINTERS, // sectname __la_symbol_ptr
|
||||||
S_SYMBOL_STUBS,
|
S_SYMBOL_STUBS,
|
||||||
S_MOD_INIT_FUNC_POINTERS,
|
S_MOD_INIT_FUNC_POINTERS, // sectname __mod_init_func
|
||||||
S_MOD_TERM_FNC_POINTERS,
|
S_MOD_TERM_FUNC_POINTERS,
|
||||||
S_COALESCED
|
S_COALESCED,
|
||||||
|
S_GB_ZEROFILL,
|
||||||
|
S_INTERPOSING,
|
||||||
|
S_16BYTE_LITERALS,
|
||||||
|
S_DTRACE_DOF
|
||||||
};
|
};
|
||||||
enum {
|
enum { // section flags (high 24 bits)
|
||||||
S_ATTR_PURE_INSTRUCTIONS = 0x80000000,
|
S_ATTR_PURE_INSTRUCTIONS = 0x80000000,
|
||||||
S_ATTR_NO_TOC = 0x40000000,
|
S_ATTR_NO_TOC = 0x40000000,
|
||||||
S_ATTR_STRIP_STATIC_SYMS = 0x20000000,
|
S_ATTR_STRIP_STATIC_SYMS = 0x20000000,
|
||||||
|
S_ATTR_NO_DEAD_STRIP = 0x10000000,
|
||||||
|
S_ATTR_LIVE_SUPPORT = 0x08000000,
|
||||||
|
S_ATTR_SELF_MODIFYING_CODE = 0x04000000,
|
||||||
|
S_ATTR_DEBUG = 0x02000000,
|
||||||
S_ATTR_SOME_INSTRUCTIONS = 0x00000400,
|
S_ATTR_SOME_INSTRUCTIONS = 0x00000400,
|
||||||
S_ATTR_EXT_RELOC = 0x00000200,
|
S_ATTR_EXT_RELOC = 0x00000200,
|
||||||
S_ATTR_LOC_RELOC = 0x00000100
|
S_ATTR_LOC_RELOC = 0x00000100
|
||||||
@@ -97,8 +129,11 @@
|
|||||||
#undef WANT_MACH_THREAD_ENUM
|
#undef WANT_MACH_THREAD_ENUM
|
||||||
enum { // thread flavor
|
enum { // thread flavor
|
||||||
PPC_THREAD_STATE = 1,
|
PPC_THREAD_STATE = 1,
|
||||||
i386_THREAD_STATE = 1,
|
PPC_THREAD_STATE64 = 5,
|
||||||
i386_OLD_THREAD_STATE = -1
|
x86_THREAD_STATE32 = 1,
|
||||||
|
x86_THREAD_STATE64 = 4,
|
||||||
|
i386_OLD_THREAD_STATE = -1,
|
||||||
|
ARM_THREAD_STATE = 1
|
||||||
};
|
};
|
||||||
#endif /*}*/
|
#endif /*}*/
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2002-2007 Jens Medoch
|
Copyright (C) 2002-2010 Jens Medoch
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
Jens Medoch
|
Jens Medoch
|
||||||
<jssg@users.sourceforge.net>
|
<jssg@users.sourceforge.net>
|
||||||
@@ -95,7 +95,7 @@ PackPs1::PackPs1(InputFile *f) :
|
|||||||
COMPILE_TIME_ASSERT(SZ_IH_BKUP == 40)
|
COMPILE_TIME_ASSERT(SZ_IH_BKUP == 40)
|
||||||
|
|
||||||
fdata_size = file_size - PS_HDR_SIZE;
|
fdata_size = file_size - PS_HDR_SIZE;
|
||||||
ram_size = !opt->ps1_exe.do_8mb ? 0x200000 : 0x800000;
|
ram_size = !opt->ps1_exe.do_8mib ? 0x200000 : 0x800000;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int *PackPs1::getCompressionMethods(int method, int level) const
|
const int *PackPs1::getCompressionMethods(int method, int level) const
|
||||||
@@ -127,8 +127,8 @@ int PackPs1::readFileHeader()
|
|||||||
{
|
{
|
||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
fi->readx(&ih, sizeof(ih));
|
fi->readx(&ih, sizeof(ih));
|
||||||
if (memcmp(&ih.id, "PS-X EXE", 8) != 0 &&
|
if (memcmp(&ih.id[0], "PS-X EXE", 8) != 0 &&
|
||||||
memcmp(&ih.id, "EXE X-SP", 8) != 0)
|
memcmp(&ih.id[0], "EXE X-SP", 8) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (ih.text != 0 || ih.data != 0)
|
if (ih.text != 0 || ih.data != 0)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -433,7 +433,7 @@ bool PackPs1::findBssSection()
|
|||||||
reg = REG1(op);
|
reg = REG1(op);
|
||||||
for (; i >= 0; i--)
|
for (; i >= 0; i--)
|
||||||
{
|
{
|
||||||
bss_nfo *p = (bss_nfo *)&p1[i];
|
bss_nfo *p = (bss_nfo *)(void *)&p1[i];
|
||||||
unsigned short op1 = p->op1, op2 = p->op2;
|
unsigned short op1 = p->op1, op2 = p->op2;
|
||||||
|
|
||||||
// check for la (x),bss_start
|
// check for la (x),bss_start
|
||||||
@@ -500,7 +500,7 @@ void PackPs1::pack(OutputFile *fo)
|
|||||||
// compress (max_match = 65535)
|
// compress (max_match = 65535)
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
cconf.conf_ucl.max_match = 65535;
|
cconf.conf_ucl.max_match = 65535;
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
compressWithFilters(&ft, sa_cnt, &cconf);
|
compressWithFilters(&ft, sa_cnt, &cconf);
|
||||||
|
|
||||||
if (overlap)
|
if (overlap)
|
||||||
|
|||||||
+13
-21
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
Copyright (C) 2002-2007 Jens Medoch
|
Copyright (C) 2002-2010 Jens Medoch
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
Jens Medoch
|
Jens Medoch
|
||||||
<jssg@users.sourceforge.net>
|
<jssg@users.sourceforge.net>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_PS1_H
|
#ifndef __UPX_P_PS1_H
|
||||||
#define __UPX_P_PS1_H
|
#define __UPX_P_PS1_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -67,8 +67,7 @@ protected:
|
|||||||
virtual int readFileHeader();
|
virtual int readFileHeader();
|
||||||
virtual bool checkFileHeader();
|
virtual bool checkFileHeader();
|
||||||
|
|
||||||
struct ps1_exe_t
|
__packed_struct(ps1_exe_t)
|
||||||
{
|
|
||||||
// ident string
|
// ident string
|
||||||
char id[8];
|
char id[8];
|
||||||
// is NULL
|
// is NULL
|
||||||
@@ -91,33 +90,26 @@ protected:
|
|||||||
char origin[60];
|
char origin[60];
|
||||||
// backup of the original header (epc - is_len)
|
// backup of the original header (epc - is_len)
|
||||||
// id & the upx header ...
|
// id & the upx header ...
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
// for unpack
|
// for unpack
|
||||||
struct ps1_exe_hb_t
|
__packed_struct(ps1_exe_hb_t)
|
||||||
{
|
|
||||||
LE32 ih_bkup[10];
|
LE32 ih_bkup[10];
|
||||||
// plus checksum for the backup
|
// plus checksum for the backup
|
||||||
LE32 ih_csum;
|
LE32 ih_csum;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct ps1_exe_chb_t
|
__packed_struct(ps1_exe_chb_t)
|
||||||
{
|
|
||||||
unsigned char id;
|
unsigned char id;
|
||||||
unsigned char len;
|
unsigned char len;
|
||||||
LE16 ih_csum;
|
LE16 ih_csum;
|
||||||
unsigned char ih_bkup;
|
unsigned char ih_bkup;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct bss_nfo
|
__packed_struct(bss_nfo)
|
||||||
{
|
|
||||||
LE16 hi1, op1, lo1, op2;
|
LE16 hi1, op1, lo1, op2;
|
||||||
LE16 hi2, op3, lo2, op4;
|
LE16 hi2, op3, lo2, op4;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
ps1_exe_t ih, oh;
|
ps1_exe_t ih, oh;
|
||||||
ps1_exe_hb_t bh;
|
ps1_exe_hb_t bh;
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_SYS_H
|
#ifndef __UPX_P_SYS_H
|
||||||
#define __UPX_P_SYS_H
|
#define __UPX_P_SYS_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -242,7 +242,7 @@ void PackTmt::pack(OutputFile *fo)
|
|||||||
// compress
|
// compress
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
// limit stack size needed for runtime decompression
|
// limit stack size needed for runtime decompression
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
compressWithFilters(&ft, 512, &cconf);
|
compressWithFilters(&ft, 512, &cconf);
|
||||||
|
|
||||||
const unsigned lsize = getLoaderSize();
|
const unsigned lsize = getLoaderSize();
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_TMT_H
|
#ifndef __UPX_P_TMT_H
|
||||||
#define __UPX_P_TMT_H
|
#define __UPX_P_TMT_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+8
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -446,7 +446,7 @@ void PackTos::pack(OutputFile *fo)
|
|||||||
overlay = file_size - (FH_SIZE + i_text + i_data + i_sym);
|
overlay = file_size - (FH_SIZE + i_text + i_data + i_sym);
|
||||||
fi->readx(ibuf+t,overlay);
|
fi->readx(ibuf+t,overlay);
|
||||||
|
|
||||||
#if 0 || defined(TESTING)
|
#if 0 || (TESTING)
|
||||||
printf("text: %d, data: %d, sym: %d, bss: %d, flags=0x%x\n",
|
printf("text: %d, data: %d, sym: %d, bss: %d, flags=0x%x\n",
|
||||||
i_text, i_data, i_sym, i_bss, (int)ih.fh_flag);
|
i_text, i_data, i_sym, i_bss, (int)ih.fh_flag);
|
||||||
printf("xx1 reloc: %d, overlay: %d, fixup: %d\n", relocsize, overlay, overlay >= 4 ? (int)get_be32(ibuf+t) : -1);
|
printf("xx1 reloc: %d, overlay: %d, fixup: %d\n", relocsize, overlay, overlay >= 4 ? (int)get_be32(ibuf+t) : -1);
|
||||||
@@ -476,7 +476,7 @@ void PackTos::pack(OutputFile *fo)
|
|||||||
symbols.need_reloc = true;
|
symbols.need_reloc = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 || defined(TESTING)
|
#if 0 || (TESTING)
|
||||||
printf("xx2: %d relocs: %d, overlay: %d, t: %d\n", nrelocs, relocsize, overlay, t);
|
printf("xx2: %d relocs: %d, overlay: %d, t: %d\n", nrelocs, relocsize, overlay, t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -487,7 +487,7 @@ void PackTos::pack(OutputFile *fo)
|
|||||||
ih.fh_sym = 0; // we stripped all symbols
|
ih.fh_sym = 0; // we stripped all symbols
|
||||||
memcpy(ibuf+t, &ih, FH_SIZE);
|
memcpy(ibuf+t, &ih, FH_SIZE);
|
||||||
t += FH_SIZE;
|
t += FH_SIZE;
|
||||||
#if 0 || defined(TESTING)
|
#if 0 || (TESTING)
|
||||||
printf("xx3 reloc: %d, overlay: %d, t: %d\n", relocsize, overlay, t);
|
printf("xx3 reloc: %d, overlay: %d, t: %d\n", relocsize, overlay, t);
|
||||||
#endif
|
#endif
|
||||||
assert(t <= isize);
|
assert(t <= isize);
|
||||||
@@ -507,7 +507,7 @@ void PackTos::pack(OutputFile *fo)
|
|||||||
// compress (max_match = 65535)
|
// compress (max_match = 65535)
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
cconf.conf_ucl.max_match = 65535;
|
cconf.conf_ucl.max_match = 65535;
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
compressWithFilters(&ft, 512, &cconf);
|
compressWithFilters(&ft, 512, &cconf);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -686,7 +686,7 @@ void PackTos::pack(OutputFile *fo)
|
|||||||
// add an empty relocation fixup to workaround a bug in some TOS versions
|
// add an empty relocation fixup to workaround a bug in some TOS versions
|
||||||
oh.fh_reloc = 0;
|
oh.fh_reloc = 0;
|
||||||
|
|
||||||
#if 0 || defined(TESTING)
|
#if 0 || (TESTING)
|
||||||
printf("old text: %6d, data: %6d, bss: %6d, reloc: %d, overlay: %d\n",
|
printf("old text: %6d, data: %6d, bss: %6d, reloc: %d, overlay: %d\n",
|
||||||
i_text, i_data, i_bss, relocsize, overlay);
|
i_text, i_data, i_bss, relocsize, overlay);
|
||||||
printf("new text: %6d, data: %6d, bss: %6d, flag=0x%x\n",
|
printf("new text: %6d, data: %6d, bss: %6d, flag=0x%x\n",
|
||||||
|
|||||||
+6
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_TOS_H
|
#ifndef __UPX_P_TOS_H
|
||||||
#define __UPX_P_TOS_H
|
#define __UPX_P_TOS_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -62,8 +62,7 @@ protected:
|
|||||||
virtual int readFileHeader();
|
virtual int readFileHeader();
|
||||||
virtual bool checkFileHeader();
|
virtual bool checkFileHeader();
|
||||||
|
|
||||||
struct tos_header_t
|
__packed_struct(tos_header_t)
|
||||||
{
|
|
||||||
BE16 fh_magic;
|
BE16 fh_magic;
|
||||||
BE32 fh_text;
|
BE32 fh_text;
|
||||||
BE32 fh_data;
|
BE32 fh_data;
|
||||||
@@ -72,8 +71,7 @@ protected:
|
|||||||
BE32 fh_reserved;
|
BE32 fh_reserved;
|
||||||
BE32 fh_flag;
|
BE32 fh_flag;
|
||||||
BE16 fh_reloc;
|
BE16 fh_reloc;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
tos_header_t ih, oh;
|
tos_header_t ih, oh;
|
||||||
|
|
||||||
|
|||||||
+27
-27
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -191,8 +191,8 @@ void PackUnix::pack2(OutputFile *fo, Filter &ft)
|
|||||||
// write block header
|
// write block header
|
||||||
b_info blk_info;
|
b_info blk_info;
|
||||||
memset(&blk_info, 0, sizeof(blk_info));
|
memset(&blk_info, 0, sizeof(blk_info));
|
||||||
set_native32(&blk_info.sz_unc, ph.u_len);
|
set_te32(&blk_info.sz_unc, ph.u_len);
|
||||||
set_native32(&blk_info.sz_cpr, ph.c_len);
|
set_te32(&blk_info.sz_cpr, ph.c_len);
|
||||||
if (ph.c_len < ph.u_len) {
|
if (ph.c_len < ph.u_len) {
|
||||||
blk_info.b_method = (unsigned char) ph.method;
|
blk_info.b_method = (unsigned char) ph.method;
|
||||||
blk_info.b_ftid = (unsigned char) ph.filter;
|
blk_info.b_ftid = (unsigned char) ph.filter;
|
||||||
@@ -252,7 +252,7 @@ void PackUnix::pack4(OutputFile *fo, Filter &)
|
|||||||
writePackHeader(fo);
|
writePackHeader(fo);
|
||||||
|
|
||||||
unsigned tmp;
|
unsigned tmp;
|
||||||
set_native32(&tmp, overlay_offset);
|
set_te32(&tmp, overlay_offset);
|
||||||
fo->write(&tmp, sizeof(tmp));
|
fo->write(&tmp, sizeof(tmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,9 +278,9 @@ void PackUnix::pack(OutputFile *fo)
|
|||||||
pack1(fo, ft); // generate Elf header, etc.
|
pack1(fo, ft); // generate Elf header, etc.
|
||||||
|
|
||||||
p_info hbuf;
|
p_info hbuf;
|
||||||
set_native32(&hbuf.p_progid, progid);
|
set_te32(&hbuf.p_progid, progid);
|
||||||
set_native32(&hbuf.p_filesize, file_size);
|
set_te32(&hbuf.p_filesize, file_size);
|
||||||
set_native32(&hbuf.p_blocksize, blocksize);
|
set_te32(&hbuf.p_blocksize, blocksize);
|
||||||
fo->write(&hbuf, sizeof(hbuf));
|
fo->write(&hbuf, sizeof(hbuf));
|
||||||
|
|
||||||
pack2(fo, ft); // append the compressed body
|
pack2(fo, ft); // append the compressed body
|
||||||
@@ -389,8 +389,8 @@ void PackUnix::packExtent(
|
|||||||
ph.c_adler = upx_adler32(obuf, ph.c_len, ph.saved_c_adler);
|
ph.c_adler = upx_adler32(obuf, ph.c_len, ph.saved_c_adler);
|
||||||
end_u_adler = ph.u_adler;
|
end_u_adler = ph.u_adler;
|
||||||
memset(&tmp, 0, sizeof(tmp));
|
memset(&tmp, 0, sizeof(tmp));
|
||||||
set_native32(&tmp.sz_unc, hdr_u_len);
|
set_te32(&tmp.sz_unc, hdr_u_len);
|
||||||
set_native32(&tmp.sz_cpr, hdr_c_len);
|
set_te32(&tmp.sz_cpr, hdr_c_len);
|
||||||
tmp.b_method = (unsigned char) ph.method;
|
tmp.b_method = (unsigned char) ph.method;
|
||||||
fo->write(&tmp, sizeof(tmp));
|
fo->write(&tmp, sizeof(tmp));
|
||||||
b_len += sizeof(b_info);
|
b_len += sizeof(b_info);
|
||||||
@@ -400,8 +400,8 @@ void PackUnix::packExtent(
|
|||||||
hdr_u_len = 0; // compress hdr one time only
|
hdr_u_len = 0; // compress hdr one time only
|
||||||
}
|
}
|
||||||
memset(&tmp, 0, sizeof(tmp));
|
memset(&tmp, 0, sizeof(tmp));
|
||||||
set_native32(&tmp.sz_unc, ph.u_len);
|
set_te32(&tmp.sz_unc, ph.u_len);
|
||||||
set_native32(&tmp.sz_cpr, ph.c_len);
|
set_te32(&tmp.sz_cpr, ph.c_len);
|
||||||
if (ph.c_len < ph.u_len) {
|
if (ph.c_len < ph.u_len) {
|
||||||
tmp.b_method = (unsigned char) ph.method;
|
tmp.b_method = (unsigned char) ph.method;
|
||||||
if (ft) {
|
if (ft) {
|
||||||
@@ -412,6 +412,9 @@ void PackUnix::packExtent(
|
|||||||
fo->write(&tmp, sizeof(tmp));
|
fo->write(&tmp, sizeof(tmp));
|
||||||
b_len += sizeof(b_info);
|
b_len += sizeof(b_info);
|
||||||
|
|
||||||
|
if (ft) {
|
||||||
|
ph.u_adler = end_u_adler;
|
||||||
|
}
|
||||||
// write compressed data
|
// write compressed data
|
||||||
if (ph.c_len < ph.u_len) {
|
if (ph.c_len < ph.u_len) {
|
||||||
fo->write(obuf, ph.c_len);
|
fo->write(obuf, ph.c_len);
|
||||||
@@ -422,9 +425,6 @@ void PackUnix::packExtent(
|
|||||||
fo->write(ibuf, ph.u_len);
|
fo->write(ibuf, ph.u_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ft) {
|
|
||||||
ph.u_adler = end_u_adler;
|
|
||||||
}
|
|
||||||
total_in += ph.u_len;
|
total_in += ph.u_len;
|
||||||
total_out += ph.c_len;
|
total_out += ph.c_len;
|
||||||
}
|
}
|
||||||
@@ -439,8 +439,8 @@ void PackUnix::unpackExtent(unsigned wanted, OutputFile *fo,
|
|||||||
b_info hdr; memset(&hdr, 0, sizeof(hdr));
|
b_info hdr; memset(&hdr, 0, sizeof(hdr));
|
||||||
while (wanted) {
|
while (wanted) {
|
||||||
fi->readx(&hdr, szb_info);
|
fi->readx(&hdr, szb_info);
|
||||||
int const sz_unc = ph.u_len = get_native32(&hdr.sz_unc);
|
int const sz_unc = ph.u_len = get_te32(&hdr.sz_unc);
|
||||||
int const sz_cpr = ph.c_len = get_native32(&hdr.sz_cpr);
|
int const sz_cpr = ph.c_len = get_te32(&hdr.sz_cpr);
|
||||||
ph.filter_cto = hdr.b_cto8;
|
ph.filter_cto = hdr.b_cto8;
|
||||||
|
|
||||||
if (sz_unc == 0) { // must never happen while 0!=wanted
|
if (sz_unc == 0) { // must never happen while 0!=wanted
|
||||||
@@ -509,7 +509,7 @@ int PackUnix::canUnpack()
|
|||||||
int l = ph.buf_offset + ph.getPackHeaderSize();
|
int l = ph.buf_offset + ph.getPackHeaderSize();
|
||||||
if (l < 0 || l + 4 > bufsize)
|
if (l < 0 || l + 4 > bufsize)
|
||||||
throwCantUnpack("file corrupted");
|
throwCantUnpack("file corrupted");
|
||||||
overlay_offset = get_native32(buf+l);
|
overlay_offset = get_te32(buf+l);
|
||||||
if ((off_t)overlay_offset >= file_size)
|
if ((off_t)overlay_offset >= file_size)
|
||||||
throwCantUnpack("file corrupted");
|
throwCantUnpack("file corrupted");
|
||||||
|
|
||||||
@@ -531,15 +531,15 @@ void PackUnix::unpack(OutputFile *fo)
|
|||||||
Elf32_Ehdr ehdr;
|
Elf32_Ehdr ehdr;
|
||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
fi->readx(&ehdr, sizeof(ehdr));
|
fi->readx(&ehdr, sizeof(ehdr));
|
||||||
unsigned const e_entry = get_native32(&ehdr.e_entry);
|
unsigned const e_entry = get_te32(&ehdr.e_entry);
|
||||||
if (e_entry < 0x401180) { /* old style, 8-byte b_info */
|
if (e_entry < 0x401180) { /* old style, 8-byte b_info */
|
||||||
szb_info = 2*sizeof(unsigned);
|
szb_info = 2*sizeof(unsigned);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Elf32_Phdr phdr;
|
Elf32_Phdr phdr;
|
||||||
fi->seek(get_native32(&ehdr.e_phoff), SEEK_SET);
|
fi->seek(get_te32(&ehdr.e_phoff), SEEK_SET);
|
||||||
fi->readx(&phdr, sizeof(phdr));
|
fi->readx(&phdr, sizeof(phdr));
|
||||||
unsigned const p_vaddr = get_native32(&phdr.p_vaddr);
|
unsigned const p_vaddr = get_te32(&phdr.p_vaddr);
|
||||||
if (0x80==(e_entry - p_vaddr)) { /* 1.22 old style */
|
if (0x80==(e_entry - p_vaddr)) { /* 1.22 old style */
|
||||||
szb_info = 2*sizeof(unsigned);
|
szb_info = 2*sizeof(unsigned);
|
||||||
}
|
}
|
||||||
@@ -558,8 +558,8 @@ void PackUnix::unpack(OutputFile *fo)
|
|||||||
{
|
{
|
||||||
p_info hbuf;
|
p_info hbuf;
|
||||||
fi->readx(&hbuf, sizeof(hbuf));
|
fi->readx(&hbuf, sizeof(hbuf));
|
||||||
orig_file_size = get_native32(&hbuf.p_filesize);
|
orig_file_size = get_te32(&hbuf.p_filesize);
|
||||||
blocksize = get_native32(&hbuf.p_blocksize);
|
blocksize = get_te32(&hbuf.p_blocksize);
|
||||||
|
|
||||||
if (file_size > (off_t)orig_file_size || blocksize > orig_file_size)
|
if (file_size > (off_t)orig_file_size || blocksize > orig_file_size)
|
||||||
throwCantUnpack("file header corrupted");
|
throwCantUnpack("file header corrupted");
|
||||||
@@ -583,8 +583,8 @@ void PackUnix::unpack(OutputFile *fo)
|
|||||||
unsigned sz_unc, sz_cpr;
|
unsigned sz_unc, sz_cpr;
|
||||||
|
|
||||||
fi->readx(&bhdr, szb_info);
|
fi->readx(&bhdr, szb_info);
|
||||||
ph.u_len = sz_unc = get_native32(&bhdr.sz_unc);
|
ph.u_len = sz_unc = get_te32(&bhdr.sz_unc);
|
||||||
ph.c_len = sz_cpr = get_native32(&bhdr.sz_cpr);
|
ph.c_len = sz_cpr = get_te32(&bhdr.sz_cpr);
|
||||||
|
|
||||||
if (sz_unc == 0) // uncompressed size 0 -> EOF
|
if (sz_unc == 0) // uncompressed size 0 -> EOF
|
||||||
{
|
{
|
||||||
|
|||||||
+25
-54
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,12 +22,12 @@
|
|||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
<mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_UNIX_H
|
#ifndef __UPX_P_UNIX_H
|
||||||
#define __UPX_P_UNIX_H
|
#define __UPX_P_UNIX_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -64,15 +64,6 @@ protected:
|
|||||||
|
|
||||||
virtual void writePackHeader(OutputFile *fo);
|
virtual void writePackHeader(OutputFile *fo);
|
||||||
|
|
||||||
// in order too share as much code as possible we introduce
|
|
||||||
// an endian abstraction here
|
|
||||||
virtual acc_uint64l_t get_native64(const void *) const = 0;
|
|
||||||
virtual unsigned get_native32(const void *) const = 0;
|
|
||||||
virtual unsigned get_native16(const void *) const = 0;
|
|
||||||
virtual void set_native64(void *, acc_uint64l_t) const = 0;
|
|
||||||
virtual void set_native32(void *, unsigned) const = 0;
|
|
||||||
virtual void set_native16(void *, unsigned) const = 0;
|
|
||||||
|
|
||||||
virtual bool checkCompressionRatio(unsigned, unsigned) const;
|
virtual bool checkCompressionRatio(unsigned, unsigned) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -101,30 +92,28 @@ protected:
|
|||||||
unsigned b_len; // total length of b_info blocks
|
unsigned b_len; // total length of b_info blocks
|
||||||
|
|
||||||
// must agree with stub/linux.hh
|
// must agree with stub/linux.hh
|
||||||
struct b_info { // 12-byte header before each compressed block
|
__packed_struct(b_info) // 12-byte header before each compressed block
|
||||||
unsigned sz_unc; // uncompressed_size
|
unsigned sz_unc; // uncompressed_size
|
||||||
unsigned sz_cpr; // compressed_size
|
unsigned sz_cpr; // compressed_size
|
||||||
unsigned char b_method; // compression algorithm
|
unsigned char b_method; // compression algorithm
|
||||||
unsigned char b_ftid; // filter id
|
unsigned char b_ftid; // filter id
|
||||||
unsigned char b_cto8; // filter parameter
|
unsigned char b_cto8; // filter parameter
|
||||||
unsigned char b_unused;
|
unsigned char b_unused;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
struct l_info { // 12-byte trailer in header for loader
|
__packed_struct(l_info) // 12-byte trailer in header for loader
|
||||||
LE32 l_checksum;
|
LE32 l_checksum;
|
||||||
LE32 l_magic;
|
LE32 l_magic;
|
||||||
LE16 l_lsize;
|
LE16 l_lsize;
|
||||||
unsigned char l_version;
|
unsigned char l_version;
|
||||||
unsigned char l_format;
|
unsigned char l_format;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct p_info { // 12-byte packed program header
|
__packed_struct(p_info) // 12-byte packed program header
|
||||||
unsigned p_progid;
|
unsigned p_progid;
|
||||||
unsigned p_filesize;
|
unsigned p_filesize;
|
||||||
unsigned p_blocksize;
|
unsigned p_blocksize;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct l_info linfo;
|
struct l_info linfo;
|
||||||
|
|
||||||
@@ -142,39 +131,30 @@ class PackUnixBe32 : public PackUnix
|
|||||||
typedef PackUnix super;
|
typedef PackUnix super;
|
||||||
protected:
|
protected:
|
||||||
PackUnixBe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::be_policy; }
|
PackUnixBe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::be_policy; }
|
||||||
virtual acc_uint64l_t get_native64(const void *b) const { return get_be64(b); }
|
|
||||||
virtual unsigned get_native32(const void *b) const { return get_be32(b); }
|
|
||||||
virtual unsigned get_native16(const void *b) const { return get_be16(b); }
|
|
||||||
virtual void set_native64(void *b, acc_uint64l_t v) const { set_be64(b, v); }
|
|
||||||
virtual void set_native32(void *b, unsigned v) const { set_be32(b, v); }
|
|
||||||
virtual void set_native16(void *b, unsigned v) const { set_be16(b, v); }
|
|
||||||
|
|
||||||
// must agree with stub/linux.hh
|
// must agree with stub/linux.hh
|
||||||
struct b_info { // 12-byte header before each compressed block
|
__packed_struct(b_info) // 12-byte header before each compressed block
|
||||||
BE32 sz_unc; // uncompressed_size
|
BE32 sz_unc; // uncompressed_size
|
||||||
BE32 sz_cpr; // compressed_size
|
BE32 sz_cpr; // compressed_size
|
||||||
unsigned char b_method; // compression algorithm
|
unsigned char b_method; // compression algorithm
|
||||||
unsigned char b_ftid; // filter id
|
unsigned char b_ftid; // filter id
|
||||||
unsigned char b_cto8; // filter parameter
|
unsigned char b_cto8; // filter parameter
|
||||||
unsigned char b_unused;
|
unsigned char b_unused;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
struct l_info { // 12-byte trailer in header for loader
|
__packed_struct(l_info) // 12-byte trailer in header for loader
|
||||||
BE32 l_checksum;
|
BE32 l_checksum;
|
||||||
BE32 l_magic;
|
BE32 l_magic;
|
||||||
BE16 l_lsize;
|
BE16 l_lsize;
|
||||||
unsigned char l_version;
|
unsigned char l_version;
|
||||||
unsigned char l_format;
|
unsigned char l_format;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct p_info { // 12-byte packed program header
|
__packed_struct(p_info) // 12-byte packed program header
|
||||||
BE32 p_progid;
|
BE32 p_progid;
|
||||||
BE32 p_filesize;
|
BE32 p_filesize;
|
||||||
BE32 p_blocksize;
|
BE32 p_blocksize;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -183,39 +163,30 @@ class PackUnixLe32 : public PackUnix
|
|||||||
typedef PackUnix super;
|
typedef PackUnix super;
|
||||||
protected:
|
protected:
|
||||||
PackUnixLe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; }
|
PackUnixLe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; }
|
||||||
virtual acc_uint64l_t get_native64(const void *b) const { return get_le64(b); }
|
|
||||||
virtual unsigned get_native32(const void *b) const { return get_le32(b); }
|
|
||||||
virtual unsigned get_native16(const void *b) const { return get_le16(b); }
|
|
||||||
virtual void set_native64(void *b, acc_uint64l_t v) const { set_le64(b, v); }
|
|
||||||
virtual void set_native32(void *b, unsigned v) const { set_le32(b, v); }
|
|
||||||
virtual void set_native16(void *b, unsigned v) const { set_le16(b, v); }
|
|
||||||
|
|
||||||
// must agree with stub/linux.hh
|
// must agree with stub/linux.hh
|
||||||
struct b_info { // 12-byte header before each compressed block
|
__packed_struct(b_info) // 12-byte header before each compressed block
|
||||||
LE32 sz_unc; // uncompressed_size
|
LE32 sz_unc; // uncompressed_size
|
||||||
LE32 sz_cpr; // compressed_size
|
LE32 sz_cpr; // compressed_size
|
||||||
unsigned char b_method; // compression algorithm
|
unsigned char b_method; // compression algorithm
|
||||||
unsigned char b_ftid; // filter id
|
unsigned char b_ftid; // filter id
|
||||||
unsigned char b_cto8; // filter parameter
|
unsigned char b_cto8; // filter parameter
|
||||||
unsigned char b_unused;
|
unsigned char b_unused;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
struct l_info { // 12-byte trailer in header for loader
|
__packed_struct(l_info) // 12-byte trailer in header for loader
|
||||||
LE32 l_checksum;
|
LE32 l_checksum;
|
||||||
LE32 l_magic;
|
LE32 l_magic;
|
||||||
LE16 l_lsize;
|
LE16 l_lsize;
|
||||||
unsigned char l_version;
|
unsigned char l_version;
|
||||||
unsigned char l_format;
|
unsigned char l_format;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct p_info { // 12-byte packed program header
|
__packed_struct(p_info) // 12-byte packed program header
|
||||||
LE32 p_progid;
|
LE32 p_progid;
|
||||||
LE32 p_filesize;
|
LE32 p_filesize;
|
||||||
LE32 p_blocksize;
|
LE32 p_blocksize;
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+109
-106
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 2004-2007 John Reiser
|
Copyright (C) 2004-2010 John Reiser
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -22,11 +22,11 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
|
|
||||||
John Reiser
|
John Reiser
|
||||||
jreiser@users.sourceforge.net
|
<jreiser@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ PackVmlinuxBase<T>::PackVmlinuxBase(InputFile *f,
|
|||||||
n_ptload(0), phdri(NULL), shdri(NULL), shstrtab(NULL)
|
n_ptload(0), phdri(NULL), shdri(NULL), shstrtab(NULL)
|
||||||
{
|
{
|
||||||
ElfClass::compileTimeAssertions();
|
ElfClass::compileTimeAssertions();
|
||||||
bele = N_BELE_CTP::getRTP<BeLePolicy>();
|
bele = N_BELE_CTP::getRTP((const BeLePolicy*) NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
@@ -212,7 +212,7 @@ void PackVmlinuxBase<T>::pack(OutputFile *fo)
|
|||||||
{
|
{
|
||||||
unsigned fo_off = 0;
|
unsigned fo_off = 0;
|
||||||
Ehdr ehdro;
|
Ehdr ehdro;
|
||||||
U32 tmp_u32;
|
TE32 tmp_u32;
|
||||||
|
|
||||||
// NULL
|
// NULL
|
||||||
// .text(PT_LOADs) .note(1st page) .note(rest)
|
// .text(PT_LOADs) .note(1st page) .note(rest)
|
||||||
@@ -269,7 +269,7 @@ void PackVmlinuxBase<T>::pack(OutputFile *fo)
|
|||||||
|
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
// limit stack size needed for runtime decompression
|
// limit stack size needed for runtime decompression
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
|
|
||||||
unsigned ppc32_extra = 0;
|
unsigned ppc32_extra = 0;
|
||||||
if (Ehdr::EM_PPC==my_e_machine) {
|
if (Ehdr::EM_PPC==my_e_machine) {
|
||||||
@@ -301,7 +301,7 @@ void PackVmlinuxBase<T>::pack(OutputFile *fo)
|
|||||||
if (UPX_E_OK!=r || len_unc<=len_cpr) // FIXME: allow no compression
|
if (UPX_E_OK!=r || len_unc<=len_cpr) // FIXME: allow no compression
|
||||||
throwInternalError("Ehdr compression failed");
|
throwInternalError("Ehdr compression failed");
|
||||||
|
|
||||||
struct b_info { // 12-byte header before each compressed block
|
__packed_struct(b_info) // 12-byte header before each compressed block
|
||||||
unsigned sz_unc; // uncompressed_size
|
unsigned sz_unc; // uncompressed_size
|
||||||
unsigned sz_cpr; // compressed_size
|
unsigned sz_cpr; // compressed_size
|
||||||
unsigned char b_method; // compression algorithm
|
unsigned char b_method; // compression algorithm
|
||||||
@@ -309,8 +309,7 @@ void PackVmlinuxBase<T>::pack(OutputFile *fo)
|
|||||||
unsigned char b_cto8; // filter parameter
|
unsigned char b_cto8; // filter parameter
|
||||||
unsigned char b_unused; // FIXME: !=0 for partial-block unfilter
|
unsigned char b_unused; // FIXME: !=0 for partial-block unfilter
|
||||||
// unsigned f_offset, f_len; // only if partial-block unfilter
|
// unsigned f_offset, f_len; // only if partial-block unfilter
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
|
||||||
struct b_info hdr_info;
|
struct b_info hdr_info;
|
||||||
set_be32(&hdr_info.sz_unc, len_unc);
|
set_be32(&hdr_info.sz_unc, len_unc);
|
||||||
@@ -323,6 +322,7 @@ void PackVmlinuxBase<T>::pack(OutputFile *fo)
|
|||||||
unsigned const frag = (3& (0u-len_cpr));
|
unsigned const frag = (3& (0u-len_cpr));
|
||||||
ppc32_extra += sizeof(hdr_info) + len_cpr + frag;
|
ppc32_extra += sizeof(hdr_info) + len_cpr + frag;
|
||||||
fo_off += len_cpr + frag;
|
fo_off += len_cpr + frag;
|
||||||
|
memset(&cpr_hdr[len_cpr], 0, frag); // valgrind only
|
||||||
fo->write(cpr_hdr, len_cpr + frag);
|
fo->write(cpr_hdr, len_cpr + frag);
|
||||||
|
|
||||||
// Partial filter: .text and following contiguous SHF_EXECINSTR
|
// Partial filter: .text and following contiguous SHF_EXECINSTR
|
||||||
@@ -376,102 +376,102 @@ void PackVmlinuxBase<T>::pack(OutputFile *fo)
|
|||||||
|
|
||||||
#if 0 /*{ Documentation: changes to arch/powerpc/boot/main.c */
|
#if 0 /*{ Documentation: changes to arch/powerpc/boot/main.c */
|
||||||
struct b_info {
|
struct b_info {
|
||||||
unsigned sz_unc;
|
unsigned sz_unc;
|
||||||
unsigned sz_cpr;
|
unsigned sz_cpr;
|
||||||
unsigned char b_method;
|
unsigned char b_method;
|
||||||
unsigned char b_ftid;
|
unsigned char b_ftid;
|
||||||
unsigned char b_cto8;
|
unsigned char b_cto8;
|
||||||
unsigned char b_unused;
|
unsigned char b_unused;
|
||||||
};
|
};
|
||||||
typedef int (*upx_f_unc)( /* uncompress */
|
typedef int (*upx_f_unc)( /* uncompress */
|
||||||
unsigned char const *src, unsigned src_len,
|
unsigned char const *src, unsigned src_len,
|
||||||
unsigned char *dst, unsigned *dst_len,
|
unsigned char *dst, unsigned *dst_len,
|
||||||
int method
|
int method
|
||||||
);
|
);
|
||||||
typedef int (*upx_f_unf)( /* unfilter */
|
typedef int (*upx_f_unf)( /* unfilter */
|
||||||
unsigned char *buf,
|
unsigned char *buf,
|
||||||
unsigned len,
|
unsigned len,
|
||||||
unsigned cto8,
|
unsigned cto8,
|
||||||
unsigned ftid
|
unsigned ftid
|
||||||
);
|
);
|
||||||
|
|
||||||
unsigned char const *upx_expand( // return updated src [aligned, too]
|
unsigned char const *upx_expand( // return updated src [aligned, too]
|
||||||
unsigned char const *src,
|
unsigned char const *src,
|
||||||
unsigned char *dst,
|
unsigned char *dst,
|
||||||
unsigned *const dst_len,
|
unsigned *const dst_len,
|
||||||
upx_f_unc const f_unc
|
upx_f_unc const f_unc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (0==*dst_len) {
|
if (0==*dst_len) {
|
||||||
*dst_len = ((struct b_info const *)src)->sz_unc;
|
*dst_len = ((struct b_info const *)src)->sz_unc;
|
||||||
}
|
}
|
||||||
upx_f_unf const f_unf = (upx_f_unf)(sizeof(int) + (char *)f_unc);
|
upx_f_unf const f_unf = (upx_f_unf)(sizeof(int) + (char *)f_unc);
|
||||||
unsigned total_len = 0;
|
unsigned total_len = 0;
|
||||||
unsigned need = *dst_len;
|
unsigned need = *dst_len;
|
||||||
while (0 < need) {
|
while (0 < need) {
|
||||||
struct b_info const *const b_hdr = (struct b_info const *)src;
|
struct b_info const *const b_hdr = (struct b_info const *)src;
|
||||||
src = (unsigned char const *)(1+ b_hdr);
|
src = (unsigned char const *)(1+ b_hdr);
|
||||||
unsigned blk_len = b_hdr->sz_unc;
|
unsigned blk_len = b_hdr->sz_unc;
|
||||||
int const rv = (*f_unc)(src, b_hdr->sz_cpr, dst, &blk_len, b_hdr->b_method);
|
int const rv = (*f_unc)(src, b_hdr->sz_cpr, dst, &blk_len, b_hdr->b_method);
|
||||||
if (0!=rv) {
|
if (0!=rv) {
|
||||||
printf("decompress error %d\n\r", rv);
|
printf("decompress error %d\n\r", rv);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
if (b_hdr->b_ftid) {
|
if (b_hdr->b_ftid) {
|
||||||
(*f_unf)(dst, b_hdr->sz_unc, b_hdr->b_cto8, b_hdr->b_ftid);
|
(*f_unf)(dst, b_hdr->sz_unc, b_hdr->b_cto8, b_hdr->b_ftid);
|
||||||
}
|
}
|
||||||
src += b_hdr->sz_cpr;
|
src += b_hdr->sz_cpr;
|
||||||
src += (3& -(int)src); // 4-byte align
|
src += (3& -(int)src); // 4-byte align
|
||||||
dst += b_hdr->sz_unc;
|
dst += b_hdr->sz_unc;
|
||||||
total_len += b_hdr->sz_unc;
|
total_len += b_hdr->sz_unc;
|
||||||
need -= b_hdr->sz_unc;
|
need -= b_hdr->sz_unc;
|
||||||
}
|
}
|
||||||
*dst_len = total_len;
|
*dst_len = total_len;
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
void prep_kernel(unsigned long a1, unsigned long a2)
|
void prep_kernel(unsigned long a1, unsigned long a2)
|
||||||
{
|
{
|
||||||
upx_f_unc f_unc = (upx_f_unc)0;
|
upx_f_unc f_unc = (upx_f_unc)0;
|
||||||
|
|
||||||
vmlinuz.addr = (unsigned long)_vmlinux_start;
|
vmlinuz.addr = (unsigned long)_vmlinux_start;
|
||||||
vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
|
vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
|
||||||
|
|
||||||
if (0x55505821 == *(unsigned *)vmlinuz.addr) {
|
if (0x55505821 == *(unsigned *)vmlinuz.addr) {
|
||||||
/* was compressed by upx */
|
/* was compressed by upx */
|
||||||
/* Uncompress elfheader */
|
/* Uncompress elfheader */
|
||||||
unsigned const *const fwa = (unsigned *)vmlinuz.addr;
|
unsigned const *const fwa = (unsigned *)vmlinuz.addr;
|
||||||
f_unc = (upx_f_unc)((char *)&fwa[2] + fwa[1]);
|
f_unc = (upx_f_unc)((char *)&fwa[2] + fwa[1]);
|
||||||
unsigned dst_len = 0;
|
unsigned dst_len = 0;
|
||||||
unsigned char const *src = (unsigned char const *)&fwa[2];
|
unsigned char const *src = (unsigned char const *)&fwa[2];
|
||||||
src = upx_expand(src, (unsigned char *)elfheader, &dst_len, f_unc);
|
src = upx_expand(src, (unsigned char *)elfheader, &dst_len, f_unc);
|
||||||
unsigned const src_len = src - (unsigned char const *)&fwa[0];
|
unsigned const src_len = src - (unsigned char const *)&fwa[0];
|
||||||
vmlinuz.addr += src_len;
|
vmlinuz.addr += src_len;
|
||||||
vmlinuz.size -= src_len;
|
vmlinuz.size -= src_len;
|
||||||
} else {
|
} else {
|
||||||
memcpy(elfheader, (const void *)vmlinuz.addr,
|
memcpy(elfheader, (const void *)vmlinuz.addr,
|
||||||
sizeof(elfheader));
|
sizeof(elfheader));
|
||||||
}
|
}
|
||||||
=====
|
=====
|
||||||
/* Eventually gunzip the kernel */
|
/* Eventually gunzip the kernel */
|
||||||
if (f_unc) {
|
if (f_unc) {
|
||||||
/* was compressed by upx */
|
/* was compressed by upx */
|
||||||
printf("upx_expand (0x%lx <- 0x%lx:0x%0lx)...",
|
printf("upx_expand (0x%lx <- 0x%lx:0x%0lx)...",
|
||||||
vmlinux.addr, vmlinuz.addr, vmlinuz.addr+vmlinuz.size);
|
vmlinux.addr, vmlinuz.addr, vmlinuz.addr+vmlinuz.size);
|
||||||
unsigned dst_len = vmlinux.size - elfoffset;
|
unsigned dst_len = vmlinux.size - elfoffset;
|
||||||
upx_expand((unsigned char const *)vmlinuz.addr,
|
upx_expand((unsigned char const *)vmlinuz.addr,
|
||||||
(unsigned char *)vmlinux.addr, &dst_len, f_unc);
|
(unsigned char *)vmlinux.addr, &dst_len, f_unc);
|
||||||
printf("done 0x%lx bytes\n\r", len);
|
printf("done 0x%lx bytes\n\r", len);
|
||||||
} else {
|
} else {
|
||||||
memmove((void *)vmlinux.addr,(void *)vmlinuz.addr,
|
memmove((void *)vmlinux.addr,(void *)vmlinuz.addr,
|
||||||
vmlinuz.size);
|
vmlinuz.size);
|
||||||
/* Skip over the ELF header */
|
/* Skip over the ELF header */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("... skipping 0x%lx bytes of ELF header\n\r",
|
printf("... skipping 0x%lx bytes of ELF header\n\r",
|
||||||
elfoffset);
|
elfoffset);
|
||||||
#endif
|
#endif
|
||||||
vmlinux.addr += elfoffset;
|
vmlinux.addr += elfoffset;
|
||||||
}
|
}
|
||||||
=====
|
=====
|
||||||
}
|
}
|
||||||
#endif /*}*/
|
#endif /*}*/
|
||||||
@@ -628,7 +628,7 @@ void prep_kernel(unsigned long a1, unsigned long a2)
|
|||||||
|
|
||||||
fo->seek(0, SEEK_SET);
|
fo->seek(0, SEEK_SET);
|
||||||
fo->write(&ehdro, sizeof(ehdro));
|
fo->write(&ehdro, sizeof(ehdro));
|
||||||
fo->write(&shdro, sizeof(shdro));
|
fo->write(&shdro[0], sizeof(shdro));
|
||||||
if (Ehdr::EM_PPC==my_e_machine) {
|
if (Ehdr::EM_PPC==my_e_machine) {
|
||||||
fo->seek(sizeof(unsigned), SEEK_CUR);
|
fo->seek(sizeof(unsigned), SEEK_CUR);
|
||||||
set_be32(&ppc32_extra, ppc32_extra - 2*sizeof(unsigned) + txt_c_len);
|
set_be32(&ppc32_extra, ppc32_extra - 2*sizeof(unsigned) + txt_c_len);
|
||||||
@@ -709,7 +709,7 @@ int PackVmlinuxBase<T>::canUnpack()
|
|||||||
template <class T>
|
template <class T>
|
||||||
void PackVmlinuxBase<T>::unpack(OutputFile *fo)
|
void PackVmlinuxBase<T>::unpack(OutputFile *fo)
|
||||||
{
|
{
|
||||||
U32 word;
|
TE32 word;
|
||||||
PackHeader const ph_tmp(ph);
|
PackHeader const ph_tmp(ph);
|
||||||
|
|
||||||
fi->seek(p_note0->sh_offset, SEEK_SET);
|
fi->seek(p_note0->sh_offset, SEEK_SET);
|
||||||
@@ -837,7 +837,7 @@ const int *PackVmlinuxPPC32::getFilters() const
|
|||||||
|
|
||||||
bool PackVmlinuxI386::is_valid_e_entry(Addr e_entry)
|
bool PackVmlinuxI386::is_valid_e_entry(Addr e_entry)
|
||||||
{
|
{
|
||||||
return 0==(0x000fffff & e_entry); // entry on whole 1MB
|
return 0==(0x000fffff & e_entry); // entry on whole 1 MiB
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -987,11 +987,14 @@ void PackVmlinuxPPC32::buildLoader(const Filter *ft)
|
|||||||
addFilter32(ft->id);
|
addFilter32(ft->id);
|
||||||
}
|
}
|
||||||
addLoader("LINUX030", NULL);
|
addLoader("LINUX030", NULL);
|
||||||
if (ph.method == M_NRV2E_LE32) addLoader("NRV2E", NULL);
|
if (ph.method == M_NRV2E_LE32) addLoader("NRV2E,NRV_TAIL", NULL);
|
||||||
else if (ph.method == M_NRV2B_LE32) addLoader("NRV2B", NULL);
|
else if (ph.method == M_NRV2B_LE32) addLoader("NRV2B,NRV_TAIL", NULL);
|
||||||
else if (ph.method == M_NRV2D_LE32) addLoader("NRV2D", NULL);
|
else if (ph.method == M_NRV2D_LE32) addLoader("NRV2D,NRV_TAIL", NULL);
|
||||||
else if (M_IS_LZMA(ph.method)) addLoader("LZMA_ELF00,LZMA_DEC10,LZMA_DEC30", NULL);
|
else if (M_IS_LZMA(ph.method)) addLoader("LZMA_ELF00,LZMA_DEC10,LZMA_DEC30", NULL);
|
||||||
else throwBadLoader();
|
else throwBadLoader();
|
||||||
|
if (hasLoaderSection("CFLUSH"))
|
||||||
|
addLoader("CFLUSH");
|
||||||
|
|
||||||
addLoader("IDENTSTR,UPX1HEAD", NULL);
|
addLoader("IDENTSTR,UPX1HEAD", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1015,7 +1018,7 @@ unsigned PackVmlinuxI386::write_vmlinux_head(
|
|||||||
// COMPRESSED_LENGTH
|
// COMPRESSED_LENGTH
|
||||||
fo->write(&stub_i386_linux_kernel_vmlinux_head[0],
|
fo->write(&stub_i386_linux_kernel_vmlinux_head[0],
|
||||||
sizeof(stub_i386_linux_kernel_vmlinux_head)-(1+ 4) +1);
|
sizeof(stub_i386_linux_kernel_vmlinux_head)-(1+ 4) +1);
|
||||||
U32 tmp_u32; tmp_u32 = ph.c_len; fo->write(&tmp_u32, 4);
|
TE32 tmp_u32; tmp_u32 = ph.c_len; fo->write(&tmp_u32, 4);
|
||||||
|
|
||||||
stxt->sh_size += sizeof(stub_i386_linux_kernel_vmlinux_head);
|
stxt->sh_size += sizeof(stub_i386_linux_kernel_vmlinux_head);
|
||||||
|
|
||||||
@@ -1030,7 +1033,7 @@ unsigned PackVmlinuxAMD64::write_vmlinux_head(
|
|||||||
// COMPRESSED_LENGTH
|
// COMPRESSED_LENGTH
|
||||||
fo->write(&stub_amd64_linux_kernel_vmlinux_head[0],
|
fo->write(&stub_amd64_linux_kernel_vmlinux_head[0],
|
||||||
sizeof(stub_amd64_linux_kernel_vmlinux_head)-(1+ 4) +1);
|
sizeof(stub_amd64_linux_kernel_vmlinux_head)-(1+ 4) +1);
|
||||||
U32 tmp_u32; tmp_u32 = ph.c_len; fo->write(&tmp_u32, 4);
|
TE32 tmp_u32; tmp_u32 = ph.c_len; fo->write(&tmp_u32, 4);
|
||||||
printf(" Compressed length=0x%x\n", ph.c_len);
|
printf(" Compressed length=0x%x\n", ph.c_len);
|
||||||
printf("UnCompressed length=0x%x\n", ph.u_len);
|
printf("UnCompressed length=0x%x\n", ph.u_len);
|
||||||
|
|
||||||
@@ -1089,7 +1092,7 @@ unsigned PackVmlinuxARMEL::write_vmlinux_head(
|
|||||||
fo->write(&stub_arm_linux_kernel_vmlinux_head[0], 4);
|
fo->write(&stub_arm_linux_kernel_vmlinux_head[0], 4);
|
||||||
|
|
||||||
// Second word
|
// Second word
|
||||||
U32 tmp_u32;
|
TE32 tmp_u32;
|
||||||
unsigned const t = (0xff000000 &
|
unsigned const t = (0xff000000 &
|
||||||
BeLePolicy::get32(&stub_arm_linux_kernel_vmlinux_head[4]))
|
BeLePolicy::get32(&stub_arm_linux_kernel_vmlinux_head[4]))
|
||||||
| (0x00ffffff & (0u - 1 + ((3+ ph.c_len)>>2)));
|
| (0x00ffffff & (0u - 1 + ((3+ ph.c_len)>>2)));
|
||||||
@@ -1111,7 +1114,7 @@ unsigned PackVmlinuxARMEB::write_vmlinux_head(
|
|||||||
fo->write(&stub_armeb_linux_kernel_vmlinux_head[0], 4);
|
fo->write(&stub_armeb_linux_kernel_vmlinux_head[0], 4);
|
||||||
|
|
||||||
// Second word
|
// Second word
|
||||||
U32 tmp_u32;
|
TE32 tmp_u32;
|
||||||
unsigned const t = (0xff000000 &
|
unsigned const t = (0xff000000 &
|
||||||
BeLePolicy::get32(&stub_armeb_linux_kernel_vmlinux_head[4]))
|
BeLePolicy::get32(&stub_armeb_linux_kernel_vmlinux_head[4]))
|
||||||
| (0x00ffffff & (0u - 1 + ((3+ ph.c_len)>>2)));
|
| (0x00ffffff & (0u - 1 + ((3+ ph.c_len)>>2)));
|
||||||
@@ -1135,7 +1138,7 @@ unsigned PackVmlinuxPPC32::write_vmlinux_head(
|
|||||||
|
|
||||||
bool PackVmlinuxARMEL::has_valid_vmlinux_head()
|
bool PackVmlinuxARMEL::has_valid_vmlinux_head()
|
||||||
{
|
{
|
||||||
U32 buf[2];
|
TE32 buf[2];
|
||||||
fi->seek(p_text->sh_offset + sizeof(stub_arm_linux_kernel_vmlinux_head) -8, SEEK_SET);
|
fi->seek(p_text->sh_offset + sizeof(stub_arm_linux_kernel_vmlinux_head) -8, SEEK_SET);
|
||||||
fi->readx(buf, sizeof(buf));
|
fi->readx(buf, sizeof(buf));
|
||||||
//unsigned const word0 = buf[0];
|
//unsigned const word0 = buf[0];
|
||||||
@@ -1149,7 +1152,7 @@ bool PackVmlinuxARMEL::has_valid_vmlinux_head()
|
|||||||
|
|
||||||
bool PackVmlinuxARMEB::has_valid_vmlinux_head()
|
bool PackVmlinuxARMEB::has_valid_vmlinux_head()
|
||||||
{
|
{
|
||||||
U32 buf[2];
|
TE32 buf[2];
|
||||||
fi->seek(p_text->sh_offset + sizeof(stub_armeb_linux_kernel_vmlinux_head) -8, SEEK_SET);
|
fi->seek(p_text->sh_offset + sizeof(stub_armeb_linux_kernel_vmlinux_head) -8, SEEK_SET);
|
||||||
fi->readx(buf, sizeof(buf));
|
fi->readx(buf, sizeof(buf));
|
||||||
//unsigned const word0 = buf[0];
|
//unsigned const word0 = buf[0];
|
||||||
@@ -1163,7 +1166,7 @@ bool PackVmlinuxARMEB::has_valid_vmlinux_head()
|
|||||||
|
|
||||||
bool PackVmlinuxPPC32::has_valid_vmlinux_head()
|
bool PackVmlinuxPPC32::has_valid_vmlinux_head()
|
||||||
{
|
{
|
||||||
U32 buf[2];
|
TE32 buf[2];
|
||||||
fi->seek(p_text->sh_offset + sizeof(stub_powerpc_linux_kernel_vmlinux_head) -8, SEEK_SET);
|
fi->seek(p_text->sh_offset + sizeof(stub_powerpc_linux_kernel_vmlinux_head) -8, SEEK_SET);
|
||||||
fi->readx(buf, sizeof(buf));
|
fi->readx(buf, sizeof(buf));
|
||||||
//unsigned const word0 = buf[0];
|
//unsigned const word0 = buf[0];
|
||||||
@@ -1390,8 +1393,8 @@ bool PackVmlinuxAMD64::has_valid_vmlinux_head()
|
|||||||
// pushl $0
|
// pushl $0
|
||||||
// pushl $ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED
|
// pushl $ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED
|
||||||
// pushl $ PROT_EXEC | PROT_WRITE | PROT_READ
|
// pushl $ PROT_EXEC | PROT_WRITE | PROT_READ
|
||||||
// pushl $0x600000 # 6MB length
|
// pushl $0x600000 # 6 MiB length
|
||||||
// pushl $0x100000 # 1MB address
|
// pushl $0x100000 # 1 MiB address
|
||||||
// call mmap
|
// call mmap
|
||||||
// leal -0x9000(%esp),%esi # expect "lea 0x9000(%esi),%esp" later
|
// leal -0x9000(%esp),%esi # expect "lea 0x9000(%esi),%esp" later
|
||||||
///* Fall into .text of upx-compressed vmlinux. */
|
///* Fall into .text of upx-compressed vmlinux. */
|
||||||
@@ -1440,7 +1443,7 @@ const int *PackVmlinuxAMD64::getFilters() const
|
|||||||
|
|
||||||
bool PackVmlinuxAMD64::is_valid_e_entry(Addr e_entry)
|
bool PackVmlinuxAMD64::is_valid_e_entry(Addr e_entry)
|
||||||
{
|
{
|
||||||
return 0x200000<=e_entry; // 2MB
|
return 0x200000<=e_entry; // 2 MiB
|
||||||
}
|
}
|
||||||
|
|
||||||
Linker* PackVmlinuxAMD64::newLinker() const
|
Linker* PackVmlinuxAMD64::newLinker() const
|
||||||
|
|||||||
+8
-8
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_VMLINX_H
|
#ifndef __UPX_P_VMLINX_H
|
||||||
#define __UPX_P_VMLINX_H
|
#define __UPX_P_VMLINX_H 1
|
||||||
|
|
||||||
#include "p_elf.h"
|
#include "p_elf.h"
|
||||||
|
|
||||||
@@ -45,9 +45,9 @@ protected:
|
|||||||
typedef typename ElfClass::BeLePolicy BeLePolicy;
|
typedef typename ElfClass::BeLePolicy BeLePolicy;
|
||||||
typedef typename ElfClass::ElfITypes ElfITypes;
|
typedef typename ElfClass::ElfITypes ElfITypes;
|
||||||
// integral types
|
// integral types
|
||||||
typedef typename ElfClass::U16 U16;
|
typedef typename ElfClass::TE16 TE16;
|
||||||
typedef typename ElfClass::U32 U32;
|
typedef typename ElfClass::TE32 TE32;
|
||||||
typedef typename ElfClass::U64 U64;
|
typedef typename ElfClass::TE64 TE64;
|
||||||
typedef typename ElfITypes::Addr Addr;
|
typedef typename ElfITypes::Addr Addr;
|
||||||
// ELF types
|
// ELF types
|
||||||
typedef typename ElfClass::Ehdr Ehdr;
|
typedef typename ElfClass::Ehdr Ehdr;
|
||||||
|
|||||||
+598
-52
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,14 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
|
||||||
|
#include "p_elf.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
#include "packer.h"
|
#include "packer.h"
|
||||||
@@ -51,10 +52,11 @@ static const unsigned bzimage_offset = 0x100000;
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
PackVmlinuzI386::PackVmlinuzI386(InputFile *f) :
|
PackVmlinuzI386::PackVmlinuzI386(InputFile *f) :
|
||||||
super(f), physical_start(0x100000)
|
super(f), physical_start(0x100000), page_offset(0), config_physical_align(0)
|
||||||
|
, filter_len(0)
|
||||||
{
|
{
|
||||||
bele = &N_BELE_RTP::le_policy;
|
bele = &N_BELE_RTP::le_policy;
|
||||||
COMPILE_TIME_ASSERT(sizeof(boot_sect_t) == 0x218);
|
COMPILE_TIME_ASSERT(sizeof(boot_sect_t) == 0x250);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -73,6 +75,22 @@ const int *PackVmlinuzI386::getFilters() const
|
|||||||
return filters;
|
return filters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int *PackBvmlinuzI386::getFilters() const
|
||||||
|
{
|
||||||
|
// The destination buffer might be relocated at runtime.
|
||||||
|
static const int filters[] = {
|
||||||
|
0x49, 0x46,
|
||||||
|
FT_END };
|
||||||
|
return filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PackVmlinuzI386::getStrategy(Filter &/*ft*/)
|
||||||
|
{
|
||||||
|
// If user specified the filter, then use it (-2==filter_strategy).
|
||||||
|
// Else try the first two filters, and pick the better (2==filter_strategy).
|
||||||
|
return (opt->no_filter ? -3 : ((opt->filter > 0) ? -2 : 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PackVmlinuzI386::canPack()
|
bool PackVmlinuzI386::canPack()
|
||||||
{
|
{
|
||||||
@@ -86,8 +104,6 @@ bool PackVmlinuzI386::canPack()
|
|||||||
|
|
||||||
int PackVmlinuzI386::readFileHeader()
|
int PackVmlinuzI386::readFileHeader()
|
||||||
{
|
{
|
||||||
boot_sect_t h;
|
|
||||||
|
|
||||||
setup_size = 0;
|
setup_size = 0;
|
||||||
|
|
||||||
fi->readx(&h, sizeof(h));
|
fi->readx(&h, sizeof(h));
|
||||||
@@ -111,12 +127,16 @@ int PackVmlinuzI386::readFileHeader()
|
|||||||
else if (hdrs && (h.load_flags & 1) != 0)
|
else if (hdrs && (h.load_flags & 1) != 0)
|
||||||
{
|
{
|
||||||
format = UPX_F_BVMLINUZ_i386;
|
format = UPX_F_BVMLINUZ_i386;
|
||||||
// account for 16-bit h.sys_size, wrap around at 20 bits
|
|
||||||
sys_size &= (1 << 20) - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (16u * h.sys_size != sys_size)
|
if (0x204<=h.version) {
|
||||||
return 0;
|
if ((16u * h.sys_size) != sys_size)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else { // h.sys_size is only 2 bytes
|
||||||
|
if ((16u * (0xffff & h.sys_size)) != (~(~0u<<20) & sys_size))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: add more checks for a valid kernel
|
// FIXME: add more checks for a valid kernel
|
||||||
|
|
||||||
@@ -124,6 +144,11 @@ int PackVmlinuzI386::readFileHeader()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int is_pow2(unsigned const x)
|
||||||
|
{
|
||||||
|
return !(x & (x - 1));
|
||||||
|
}
|
||||||
|
|
||||||
// read full kernel into obuf[], gzip-decompress into ibuf[],
|
// read full kernel into obuf[], gzip-decompress into ibuf[],
|
||||||
// return decompressed size
|
// return decompressed size
|
||||||
int PackVmlinuzI386::decompressKernel()
|
int PackVmlinuzI386::decompressKernel()
|
||||||
@@ -133,32 +158,96 @@ int PackVmlinuzI386::decompressKernel()
|
|||||||
fi->seek(0, SEEK_SET);
|
fi->seek(0, SEEK_SET);
|
||||||
fi->readx(obuf, file_size);
|
fi->readx(obuf, file_size);
|
||||||
|
|
||||||
|
{
|
||||||
|
const upx_byte *base = NULL;
|
||||||
|
unsigned relocated = 0;
|
||||||
|
|
||||||
// See startup_32: in linux/arch/i386/boot/compressed/head.S
|
// See startup_32: in linux/arch/i386/boot/compressed/head.S
|
||||||
char const *p = (char const *)&obuf[setup_size];
|
const upx_byte *p = &obuf[setup_size];
|
||||||
for (int j= 0; j < 0x200; ++j, ++p) {
|
unsigned cpa_0 = 0;
|
||||||
|
unsigned cpa_1 = 0;
|
||||||
|
int j;
|
||||||
|
if (0x205<=h.version) {
|
||||||
|
cpa_0 = h.kernel_alignment;
|
||||||
|
cpa_1 = 0u - cpa_0;
|
||||||
|
} else
|
||||||
|
for ((p = &obuf[setup_size]), (j= 0); j < 0x200; ++j, ++p) {
|
||||||
|
if (0==memcmp("\x89\xeb\x81\xc3", p, 4)
|
||||||
|
&& 0==memcmp("\x81\xe3", 8+ p, 2)) {
|
||||||
|
// movl %ebp,%ebx
|
||||||
|
// addl $imm.w,%ebx
|
||||||
|
// andl $imm.w,%ebx
|
||||||
|
cpa_0 = 1+ get_te32( 4+ p);
|
||||||
|
cpa_1 = get_te32(10+ p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for ((p = &obuf[setup_size]), (j= 0); j < 0x200; ++j, ++p) {
|
||||||
|
if (0==memcmp("\x8d\x83", p, 2) // leal d32(%ebx),%eax
|
||||||
|
&& 0==memcmp("\xff\xe0", 6+ p, 2) // jmp *%eax
|
||||||
|
) {
|
||||||
|
relocated = get_te32(2+ p);
|
||||||
|
}
|
||||||
if (0==memcmp("\xE8\x00\x00\x00\x00\x5D", p, 6)) {
|
if (0==memcmp("\xE8\x00\x00\x00\x00\x5D", p, 6)) {
|
||||||
/* "call 1f; 1f: pop %ebp" determines actual execution address; */
|
// "call 1f; 1f: pop %ebp" determines actual execution address.
|
||||||
/* linux-2.6.21 (spring 2007) and later; upx stub needs work. */
|
// linux-2.6.21 (spring 2007) and later; upx stub needs work
|
||||||
throwCantPack("Relocatable kernel is not yet supported");
|
// unless LOAD_PHYSICAL_ADDR is known.
|
||||||
|
// Allowed code is: linux-2.6.23/arch/x86/head_32.S 2008-01-01
|
||||||
|
// call 1f
|
||||||
|
// 1: popl %ebp
|
||||||
|
// subl $1b, %ebp # 32-bit immediate
|
||||||
|
// movl $LOAD_PHYSICAL_ADDR, %ebx
|
||||||
|
//
|
||||||
|
if (0==memcmp("\x81\xed", 6+ p, 2) // subl $imm.w,%ebp
|
||||||
|
&& 0==memcmp("\xbb", 12+ p, 1) ) { // movl $imm.w,%ebx
|
||||||
|
physical_start = get_te32(13+ p);
|
||||||
|
} else
|
||||||
|
if (0==memcmp("\x81\xed", 6+ p, 2) // subl $imm.w,%ebp
|
||||||
|
&& is_pow2(cpa_0) && (0u-cpa_0)==cpa_1) {
|
||||||
|
base = (5+ p) - get_te32(8+ p);
|
||||||
|
config_physical_align = cpa_0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throwCantPack("Unrecognized relocatable kernel");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Find "ljmp $__BOOT_CS,$__PHYSICAL_START" if any.
|
// Find "ljmp $__BOOT_CS,$__PHYSICAL_START" if any.
|
||||||
if (0==memcmp("\xEA\x00\x00", p, 3) && 0==(0xf & p[3]) && 0==p[4]) {
|
if (0==memcmp("\xEA\x00\x00", p, 3) && 0==(0xf & p[3]) && 0==p[4]) {
|
||||||
/* whole megabyte < 16MB */
|
/* whole megabyte < 16 MiB */
|
||||||
physical_start = get_le32(1+ p);
|
physical_start = get_te32(1+ p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (base && relocated) {
|
||||||
|
p = base + relocated;
|
||||||
|
for (j = 0; j < 0x200; ++j, ++p) {
|
||||||
|
if (0==memcmp("\x01\x9c\x0b", p, 3) // addl %ebx,d32(%ebx,%ecx)
|
||||||
|
) {
|
||||||
|
page_offset = 0u - get_te32(3+ p);
|
||||||
|
}
|
||||||
|
if (0==memcmp("\x89\xeb", p, 2) // movl %ebp,%ebx
|
||||||
|
&& 0==memcmp("\x81\xeb", 2+ p, 2) // subl $imm32,%ebx
|
||||||
|
) {
|
||||||
|
physical_start = get_te32(4+ p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
checkAlreadyPacked(obuf + setup_size, UPX_MIN(file_size - setup_size, (off_t)1024));
|
checkAlreadyPacked(obuf + setup_size, UPX_MIN(file_size - setup_size, (off_t)1024));
|
||||||
|
|
||||||
for (int gzoff = setup_size; gzoff < file_size; gzoff++)
|
int gzoff = setup_size;
|
||||||
|
if (0x208<=h.version) {
|
||||||
|
gzoff += h.payload_offset;
|
||||||
|
}
|
||||||
|
for (; gzoff < file_size; gzoff++)
|
||||||
{
|
{
|
||||||
// find gzip header (2 bytes magic + 1 byte method "deflated")
|
// find gzip header (2 bytes magic + 1 byte method "deflated")
|
||||||
int off = find(obuf + gzoff, file_size - gzoff, "\x1F\x8B\x08", 3);
|
int off = find(obuf + gzoff, file_size - gzoff, "\x1F\x8B\x08", 3);
|
||||||
if (off < 0)
|
if (off < 0)
|
||||||
break;
|
break;
|
||||||
gzoff += off;
|
gzoff += off;
|
||||||
const int gzlen = file_size - gzoff;
|
const int gzlen = (h.version < 0x208) ? (file_size - gzoff) : h.payload_length;
|
||||||
if (gzlen < 256)
|
if (gzlen < 256)
|
||||||
break;
|
break;
|
||||||
// check gzip flag byte
|
// check gzip flag byte
|
||||||
@@ -207,6 +296,49 @@ int PackVmlinuzI386::decompressKernel()
|
|||||||
if (klen <= gzlen)
|
if (klen <= gzlen)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (0x208<=h.version && 0==memcmp("\177ELF", ibuf, 4)) {
|
||||||
|
// Full ELF in theory; for now, try to handle as .bin at physical_start.
|
||||||
|
// Check for PT_LOAD.p_paddr being ascending and adjacent.
|
||||||
|
Elf_LE32_Ehdr const *const ehdr = (Elf_LE32_Ehdr const *)(void const *)ibuf;
|
||||||
|
Elf_LE32_Phdr const *phdr = (Elf_LE32_Phdr const *)(ehdr->e_phoff + (char const *)ehdr);
|
||||||
|
Elf_LE32_Shdr const *shdr = (Elf_LE32_Shdr const *)(ehdr->e_shoff + (char const *)ehdr);
|
||||||
|
unsigned hi_paddr = 0, lo_paddr = 0;
|
||||||
|
unsigned delta_off = 0;
|
||||||
|
for (unsigned j=0; j < ehdr->e_phnum; ++j, ++phdr) {
|
||||||
|
if (phdr->PT_LOAD==phdr->p_type) {
|
||||||
|
unsigned step = (hi_paddr + phdr->p_align - 1) & ~(phdr->p_align - 1);
|
||||||
|
if (0==hi_paddr) { // first PT_LOAD
|
||||||
|
if (physical_start!=phdr->p_paddr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
delta_off = phdr->p_paddr - phdr->p_offset;
|
||||||
|
lo_paddr = phdr->p_paddr;
|
||||||
|
hi_paddr = phdr->p_filesz + phdr->p_paddr;
|
||||||
|
}
|
||||||
|
else if (step==phdr->p_paddr
|
||||||
|
&& delta_off==(phdr->p_paddr - phdr->p_offset)) {
|
||||||
|
hi_paddr = phdr->p_filesz + phdr->p_paddr;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0; // Not equivalent to a .bin. Too complex for now.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// FIXME: ascending order is only a convention; might need sorting.
|
||||||
|
for (unsigned j=1; j < ehdr->e_shnum; ++j) {
|
||||||
|
if (shdr->SHT_PROGBITS==shdr->sh_type) { // SHT_REL might be intermixed
|
||||||
|
if (shdr->SHF_EXECINSTR & shdr[j].sh_flags) {
|
||||||
|
filter_len += shdr[j].sh_size; // FIXME: include sh_addralign
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memmove(ibuf, (lo_paddr - delta_off) + ibuf, hi_paddr - lo_paddr); // FIXME: set_size
|
||||||
|
// FIXME: .bss ? Apparently handled by head.S
|
||||||
|
}
|
||||||
|
|
||||||
if (opt->force > 0)
|
if (opt->force > 0)
|
||||||
return klen;
|
return klen;
|
||||||
|
|
||||||
@@ -242,6 +374,15 @@ int PackVmlinuzI386::decompressKernel()
|
|||||||
&& 0x0F==ibuf[19] && 0xA2==ibuf[20] // cpuid
|
&& 0x0F==ibuf[19] && 0xA2==ibuf[20] // cpuid
|
||||||
) goto head_ok;
|
) goto head_ok;
|
||||||
|
|
||||||
|
// cmpw $0x207,0x206(%esi) Debian vmlinuz-2.6.24-12-generic
|
||||||
|
if (0==memcmp("\x66\x81\xbe\x06\x02\x00\x00\x07\x02", ibuf, 9)) goto head_ok;
|
||||||
|
|
||||||
|
// testb $0x40,0x211(%esi) Fedora vmlinuz-2.6.25-0.218.rc8.git7.fc9.i686
|
||||||
|
if (0==memcmp("\xf6\x86\x11\x02\x00\x00\x40", ibuf, 7)) goto head_ok;
|
||||||
|
|
||||||
|
// rex.W prefix for x86_64
|
||||||
|
if (0x48==ibuf[0]) throwCantPack("x86_64 bzImage is not yet supported");
|
||||||
|
|
||||||
throwCantPack("unrecognized kernel architecture; use option '-f' to force packing");
|
throwCantPack("unrecognized kernel architecture; use option '-f' to force packing");
|
||||||
head_ok:
|
head_ok:
|
||||||
|
|
||||||
@@ -290,7 +431,7 @@ void PackVmlinuzI386::buildLoader(const Filter *ft)
|
|||||||
// prepare loader
|
// prepare loader
|
||||||
initLoader(stub_i386_linux_kernel_vmlinuz, sizeof(stub_i386_linux_kernel_vmlinuz));
|
initLoader(stub_i386_linux_kernel_vmlinuz, sizeof(stub_i386_linux_kernel_vmlinuz));
|
||||||
addLoader("LINUZ000",
|
addLoader("LINUZ000",
|
||||||
ph.first_offset_found == 1 ? "LINUZ001" : "",
|
ph.first_offset_found == 1 ? "LINUZ010" : "",
|
||||||
ft->id ? "LZCALLT1" : "",
|
ft->id ? "LZCALLT1" : "",
|
||||||
"LZIMAGE0",
|
"LZIMAGE0",
|
||||||
getDecompressorSections(),
|
getDecompressorSections(),
|
||||||
@@ -318,8 +459,8 @@ void PackVmlinuzI386::pack(OutputFile *fo)
|
|||||||
// compress
|
// compress
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
// limit stack size needed for runtime decompression
|
// limit stack size needed for runtime decompression
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28 KiB stack
|
||||||
compressWithFilters(&ft, 512, &cconf);
|
compressWithFilters(&ft, 512, &cconf, getStrategy(ft));
|
||||||
|
|
||||||
const unsigned lsize = getLoaderSize();
|
const unsigned lsize = getLoaderSize();
|
||||||
|
|
||||||
@@ -336,6 +477,7 @@ void PackVmlinuzI386::pack(OutputFile *fo)
|
|||||||
|
|
||||||
boot_sect_t * const bs = (boot_sect_t *) ((unsigned char *) setup_buf);
|
boot_sect_t * const bs = (boot_sect_t *) ((unsigned char *) setup_buf);
|
||||||
bs->sys_size = ALIGN_UP(lsize + ph.c_len, 16u) / 16;
|
bs->sys_size = ALIGN_UP(lsize + ph.c_len, 16u) / 16;
|
||||||
|
bs->payload_length = ph.c_len;
|
||||||
|
|
||||||
fo->write(setup_buf, setup_buf.getSize());
|
fo->write(setup_buf, setup_buf.getSize());
|
||||||
fo->write(loader, lsize);
|
fo->write(loader, lsize);
|
||||||
@@ -363,24 +505,33 @@ void PackBvmlinuzI386::buildLoader(const Filter *ft)
|
|||||||
{
|
{
|
||||||
// prepare loader
|
// prepare loader
|
||||||
initLoader(stub_i386_linux_kernel_vmlinuz, sizeof(stub_i386_linux_kernel_vmlinuz));
|
initLoader(stub_i386_linux_kernel_vmlinuz, sizeof(stub_i386_linux_kernel_vmlinuz));
|
||||||
addLoader("LINUZ000",
|
if (0!=page_offset) { // relocatable kernel
|
||||||
ph.first_offset_found == 1 ? "LINUZ001" : "",
|
assert(0==ft->id || 0x40==(0xf0 & ft->id)); // others assume fixed buffer address
|
||||||
|
addLoader("LINUZ000,LINUZ001,LINUZVGA,LINUZ101,LINUZ110",
|
||||||
|
((0!=config_physical_align) ? "LINUZ120" : "LINUZ130"),
|
||||||
|
"LINUZ140,LZCUTPOI,LINUZ141",
|
||||||
|
(ft->id ? "LINUZ145" : ""),
|
||||||
|
(ph.first_offset_found == 1 ? "LINUZ010" : ""),
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
addLoader("LINUZ000,LINUZ001,LINUZVGA,LINUZ005",
|
||||||
|
ph.first_offset_found == 1 ? "LINUZ010" : "",
|
||||||
(0x40==(0xf0 & ft->id)) ? "LZCKLLT1" : (ft->id ? "LZCALLT1" : ""),
|
(0x40==(0xf0 & ft->id)) ? "LZCKLLT1" : (ft->id ? "LZCALLT1" : ""),
|
||||||
"LBZIMAGE,IDENTSTR",
|
"LBZIMAGE,IDENTSTR",
|
||||||
"+40", // align the stuff to 4 byte boundary
|
"+40", // align the stuff to 4 byte boundary
|
||||||
"UPX1HEAD", // 32 byte
|
"UPX1HEAD", // 32 byte
|
||||||
"LZCUTPOI",
|
"LZCUTPOI",
|
||||||
NULL);
|
NULL);
|
||||||
|
// fake alignment for the start of the decompressor
|
||||||
|
//linker->defineSymbol("LZCUTPOI", 0x1000);
|
||||||
|
}
|
||||||
|
|
||||||
// fake alignment for the start of the decompressor
|
addLoader(getDecompressorSections(), NULL);
|
||||||
linker->defineSymbol("LZCUTPOI", 0x1000);
|
|
||||||
|
|
||||||
addLoader(getDecompressorSections(),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
if (ft->id)
|
if (ft->id)
|
||||||
{
|
{
|
||||||
assert(ft->calls > 0);
|
assert(ft->calls > 0);
|
||||||
if (0x40==(0xf0 & ft->id)) {
|
if (0x40==(0xf0 & ft->id)) {
|
||||||
addLoader("LZCKLLT9", NULL);
|
addLoader("LZCKLLT9", NULL);
|
||||||
}
|
}
|
||||||
@@ -389,7 +540,27 @@ void PackBvmlinuzI386::buildLoader(const Filter *ft)
|
|||||||
}
|
}
|
||||||
addFilter32(ft->id);
|
addFilter32(ft->id);
|
||||||
}
|
}
|
||||||
addLoader("LINUZ990", NULL);
|
if (0!=page_offset) {
|
||||||
|
addLoader("LINUZ150,IDENTSTR,+40,UPX1HEAD", NULL);
|
||||||
|
unsigned const l_len = getLoaderSize();
|
||||||
|
unsigned const c_len = ALIGN_UP(ph.c_len, 4u);
|
||||||
|
unsigned const e_len = getLoaderSectionStart("LINUZ141") -
|
||||||
|
getLoaderSectionStart("LINUZ110");
|
||||||
|
linker->defineSymbol("compressed_length", c_len);
|
||||||
|
linker->defineSymbol("load_physical_address", physical_start); // FIXME
|
||||||
|
if (0!=config_physical_align) {
|
||||||
|
linker->defineSymbol("neg_config_physical_align", 0u - config_physical_align);
|
||||||
|
}
|
||||||
|
linker->defineSymbol("neg_length_mov", 0u - ALIGN_UP(c_len + l_len, 4u));
|
||||||
|
linker->defineSymbol("neg_page_offset", 0u - page_offset);
|
||||||
|
//linker->defineSymbol("physical_start", physical_start);
|
||||||
|
linker->defineSymbol("unc_length", ph.u_len);
|
||||||
|
linker->defineSymbol("dec_offset", ph.overlap_overhead + e_len);
|
||||||
|
linker->defineSymbol("unc_offset", ph.overlap_overhead + ph.u_len - c_len);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
addLoader("LINUZ990", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -399,13 +570,17 @@ void PackBvmlinuzI386::pack(OutputFile *fo)
|
|||||||
|
|
||||||
// prepare filter
|
// prepare filter
|
||||||
Filter ft(ph.level);
|
Filter ft(ph.level);
|
||||||
ft.buf_len = ph.u_len;
|
ft.buf_len = (filter_len ? filter_len : (ph.u_len * 3)/5);
|
||||||
ft.addvalue = physical_start; // saves 4 bytes in unfilter code
|
// May 2008: 3/5 is heuristic to cover most .text but avoid non-instructions.
|
||||||
|
// Otherwise "call trick" filter cannot find a free marker byte,
|
||||||
|
// especially when it searches over tables of data.
|
||||||
|
ft.addvalue = 0; // The destination buffer might be relocated at runtime.
|
||||||
|
|
||||||
upx_compress_config_t cconf; cconf.reset();
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
// limit stack size needed for runtime decompression
|
// LINUZ001 allows most of low memory as stack for Bvmlinuz
|
||||||
cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack
|
cconf.conf_lzma.max_num_probs = (0x90000 - 0x10000)>>1; // ushort: 512 KiB stack
|
||||||
compressWithFilters(&ft, 512, &cconf);
|
|
||||||
|
compressWithFilters(&ft, 512, &cconf, getStrategy(ft));
|
||||||
|
|
||||||
// align everything to dword boundary - it is easier to handle
|
// align everything to dword boundary - it is easier to handle
|
||||||
unsigned c_len = ph.c_len;
|
unsigned c_len = ph.c_len;
|
||||||
@@ -433,21 +608,25 @@ void PackBvmlinuzI386::pack(OutputFile *fo)
|
|||||||
const int e_len = getLoaderSectionStart("LZCUTPOI");
|
const int e_len = getLoaderSectionStart("LZCUTPOI");
|
||||||
assert(e_len > 0);
|
assert(e_len > 0);
|
||||||
|
|
||||||
const unsigned d_len4 = ALIGN_UP(lsize - e_len, 4u);
|
if (0==page_offset) { // not relocatable kernel
|
||||||
const unsigned decompr_pos = ALIGN_UP(ph.u_len + ph.overlap_overhead, 16u);
|
const unsigned d_len4 = ALIGN_UP(lsize - e_len, 4u);
|
||||||
const unsigned copy_size = c_len + d_len4;
|
const unsigned decompr_pos = ALIGN_UP(ph.u_len + ph.overlap_overhead, 16u);
|
||||||
const unsigned edi = decompr_pos + d_len4 - 4; // copy to
|
const unsigned copy_size = c_len + d_len4;
|
||||||
const unsigned esi = ALIGN_UP(c_len + lsize, 4u) - 4; // copy from
|
const unsigned edi = decompr_pos + d_len4 - 4; // copy to
|
||||||
|
const unsigned esi = ALIGN_UP(c_len + lsize, 4u) - 4; // copy from
|
||||||
|
|
||||||
linker->defineSymbol("decompressor", decompr_pos - bzimage_offset + physical_start);
|
linker->defineSymbol("decompressor", decompr_pos - bzimage_offset + physical_start);
|
||||||
linker->defineSymbol("src_for_decompressor", physical_start + decompr_pos - c_len);
|
linker->defineSymbol("src_for_decompressor", physical_start + decompr_pos - c_len);
|
||||||
linker->defineSymbol("words_to_copy", copy_size / 4);
|
linker->defineSymbol("words_to_copy", copy_size / 4);
|
||||||
linker->defineSymbol("copy_dest", physical_start + edi);
|
linker->defineSymbol("copy_dest", physical_start + edi);
|
||||||
linker->defineSymbol("copy_source", bzimage_offset + esi);
|
linker->defineSymbol("copy_source", bzimage_offset + esi);
|
||||||
|
}
|
||||||
|
|
||||||
defineFilterSymbols(&ft);
|
defineFilterSymbols(&ft);
|
||||||
defineDecompressorSymbols();
|
defineDecompressorSymbols();
|
||||||
linker->defineSymbol("original_entry", physical_start);
|
if (0==page_offset) {
|
||||||
|
linker->defineSymbol("original_entry", physical_start);
|
||||||
|
}
|
||||||
linker->defineSymbol("stack_offset", stack_offset_during_uncompression);
|
linker->defineSymbol("stack_offset", stack_offset_during_uncompression);
|
||||||
relocateLoader();
|
relocateLoader();
|
||||||
|
|
||||||
@@ -456,11 +635,21 @@ void PackBvmlinuzI386::pack(OutputFile *fo)
|
|||||||
patchPackHeader(loader, lsize);
|
patchPackHeader(loader, lsize);
|
||||||
|
|
||||||
boot_sect_t * const bs = (boot_sect_t *) ((unsigned char *) setup_buf);
|
boot_sect_t * const bs = (boot_sect_t *) ((unsigned char *) setup_buf);
|
||||||
bs->sys_size = (ALIGN_UP(lsize + c_len, 16u) / 16) & 0xffff;
|
bs->sys_size = (ALIGN_UP(lsize + c_len, 16u) / 16);
|
||||||
|
|
||||||
fo->write(setup_buf, setup_buf.getSize());
|
fo->write(setup_buf, setup_buf.getSize());
|
||||||
fo->write(loader, e_len);
|
|
||||||
|
unsigned const e_pfx = (0==page_offset) ? 0 : getLoaderSectionStart("LINUZ110");
|
||||||
|
if (0!=page_offset) {
|
||||||
|
fo->write(loader, e_pfx);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fo->write(loader, e_len);
|
||||||
|
}
|
||||||
fo->write(obuf, c_len);
|
fo->write(obuf, c_len);
|
||||||
|
if (0!=page_offset) {
|
||||||
|
fo->write(loader + e_pfx, e_len - e_pfx);
|
||||||
|
}
|
||||||
fo->write(loader + e_len, lsize - e_len);
|
fo->write(loader + e_len, lsize - e_len);
|
||||||
#if 0
|
#if 0
|
||||||
printf("%-13s: setup : %8ld bytes\n", getName(), (long) setup_buf.getSize());
|
printf("%-13s: setup : %8ld bytes\n", getName(), (long) setup_buf.getSize());
|
||||||
@@ -494,7 +683,7 @@ int PackVmlinuzI386::canUnpack()
|
|||||||
void PackVmlinuzI386::unpack(OutputFile *fo)
|
void PackVmlinuzI386::unpack(OutputFile *fo)
|
||||||
{
|
{
|
||||||
// no uncompression support for this format, so that
|
// no uncompression support for this format, so that
|
||||||
// it is possible to remove the original deflate code (>10KB)
|
// it is possible to remove the original deflate code (>10 KiB)
|
||||||
|
|
||||||
// FIXME: but we could write the uncompressed "vmlinux" image
|
// FIXME: but we could write the uncompressed "vmlinux" image
|
||||||
|
|
||||||
@@ -522,6 +711,363 @@ void PackVmlinuzI386::unpack(OutputFile *fo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PackVmlinuzARMEL::PackVmlinuzARMEL(InputFile *f) :
|
||||||
|
super(f), setup_size(0), filter_len(0)
|
||||||
|
{
|
||||||
|
bele = &N_BELE_RTP::le_policy;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int *PackVmlinuzARMEL::getCompressionMethods(int method, int level) const
|
||||||
|
{
|
||||||
|
return Packer::getDefaultCompressionMethods_8(method, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
const int *PackVmlinuzARMEL::getFilters() const
|
||||||
|
{
|
||||||
|
static const int f50[] = { 0x50, FT_END };
|
||||||
|
return f50;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PackVmlinuzARMEL::getStrategy(Filter &/*ft*/)
|
||||||
|
{
|
||||||
|
// If user specified the filter, then use it (-2==filter_strategy).
|
||||||
|
// Else try the first two filters, and pick the better (2==filter_strategy).
|
||||||
|
return (opt->no_filter ? -3 : ((opt->filter > 0) ? -2 : 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PackVmlinuzARMEL::canPack()
|
||||||
|
{
|
||||||
|
return readFileHeader() == getFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
int PackVmlinuzARMEL::readFileHeader()
|
||||||
|
{
|
||||||
|
unsigned int hdr[8];
|
||||||
|
|
||||||
|
fi->readx(hdr, sizeof(hdr));
|
||||||
|
for (int j=0; j < 8; ++j) {
|
||||||
|
if (0xe1a00000!=get_te32(&hdr[j])) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return UPX_F_VMLINUZ_ARMEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PackVmlinuzARMEL::decompressKernel()
|
||||||
|
{
|
||||||
|
// read whole kernel image
|
||||||
|
obuf.alloc(file_size);
|
||||||
|
fi->seek(0, SEEK_SET);
|
||||||
|
fi->readx(obuf, file_size);
|
||||||
|
|
||||||
|
//checkAlreadyPacked(obuf + setup_size, UPX_MIN(file_size - setup_size, (off_t)1024));
|
||||||
|
|
||||||
|
// Find head.S:
|
||||||
|
// bl decompress_kernel # 0xeb......
|
||||||
|
// b call_kernel # 0xea......
|
||||||
|
//LC0: .word LC0 # self!
|
||||||
|
unsigned decompress_kernel = 0;
|
||||||
|
unsigned caller1 = 0;
|
||||||
|
unsigned caller2 = 0;
|
||||||
|
unsigned got_start = 0;
|
||||||
|
unsigned got_end = 0;
|
||||||
|
for (unsigned j = 0; j < 0x400; j+=4) {
|
||||||
|
unsigned w;
|
||||||
|
if (j!=get_te32(j + obuf)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (0xea000000!=(0xff000000& get_te32(j - 4 + obuf))
|
||||||
|
|| 0xeb000000!=(0xff000000&(w= get_te32(j - 8 + obuf))) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
caller1 = j - 8;
|
||||||
|
decompress_kernel = ((0x00ffffff & w)<<2) + 8+ caller1;
|
||||||
|
for (unsigned k = 12; k<=128; k+=4) {
|
||||||
|
w = get_te32(j - k + obuf);
|
||||||
|
if (0xeb000000==(0xff000000 & w)
|
||||||
|
&& decompress_kernel==(((0x00ffffff & w)<<2) + 8+ j - k) ) {
|
||||||
|
caller2 = j - k;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
got_start = get_te32(5*4 + j + obuf);
|
||||||
|
got_end = get_te32(6*4 + j + obuf);
|
||||||
|
#if 0 /*{*/
|
||||||
|
printf("decompress_kernel=0x%x got_start=0x%x got_end=0x%x\n",
|
||||||
|
decompress_kernel, got_start, got_end);
|
||||||
|
#endif /*}*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (0==decompress_kernel) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find first subroutine that is called by decompress_kernel,
|
||||||
|
// which we will consider to be the start of the gunzip module
|
||||||
|
// and the end of the non-gunzip modules.
|
||||||
|
for (unsigned j = decompress_kernel; j < (unsigned)file_size; j+=4) {
|
||||||
|
unsigned w = get_te32(j + obuf);
|
||||||
|
if (0xeb800000==(0xff800000 & w)) {
|
||||||
|
setup_size = 8+ ((0xff000000 | w)<<2) + j;
|
||||||
|
// Move the GlobalOffsetTable.
|
||||||
|
for (unsigned k = got_start; k < got_end; k+=4) {
|
||||||
|
w = get_te32(k + obuf);
|
||||||
|
// FIXME: must relocate w
|
||||||
|
set_te32(k - got_start + setup_size + obuf, w);
|
||||||
|
}
|
||||||
|
setup_size += got_end - got_start;
|
||||||
|
set_te32(&obuf[caller1], 0xeb000000 |
|
||||||
|
(0x00ffffff & ((setup_size - (8+ caller1))>>2)) );
|
||||||
|
set_te32(&obuf[caller2], 0xeb000000 |
|
||||||
|
(0x00ffffff & ((setup_size - (8+ caller2))>>2)) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int gzoff = 0; gzoff < 0x4000; gzoff+=4) {
|
||||||
|
// find gzip header (2 bytes magic + 1 byte method "deflated")
|
||||||
|
int off = find(obuf + gzoff, file_size - gzoff, "\x1F\x8B\x08", 3);
|
||||||
|
if (off < 0 || 0!=(3u & off))
|
||||||
|
break; // not found, or not word-aligned
|
||||||
|
gzoff += off;
|
||||||
|
const int gzlen = file_size - gzoff;
|
||||||
|
if (gzlen < 256)
|
||||||
|
break;
|
||||||
|
// check gzip flag byte
|
||||||
|
unsigned char flags = obuf[gzoff + 3];
|
||||||
|
if ((flags & 0xe0) != 0) // reserved bits set
|
||||||
|
continue;
|
||||||
|
//printf("found gzip header at offset %d\n", gzoff);
|
||||||
|
|
||||||
|
// try to decompress
|
||||||
|
int klen;
|
||||||
|
int fd;
|
||||||
|
off_t fd_pos;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
klen = -1;
|
||||||
|
fd = -1;
|
||||||
|
fd_pos = -1;
|
||||||
|
// open
|
||||||
|
fi->seek(gzoff, SEEK_SET);
|
||||||
|
fd = dup(fi->getFd());
|
||||||
|
if (fd < 0)
|
||||||
|
break;
|
||||||
|
gzFile zf = gzdopen(fd, "rb");
|
||||||
|
if (zf == NULL)
|
||||||
|
break;
|
||||||
|
// estimate gzip-decompressed kernel size & alloc buffer
|
||||||
|
if (ibuf.getSize() == 0)
|
||||||
|
ibuf.alloc(gzlen * 3);
|
||||||
|
// decompress
|
||||||
|
klen = gzread(zf, ibuf, ibuf.getSize());
|
||||||
|
fd_pos = lseek(fd, 0, SEEK_CUR);
|
||||||
|
gzclose(zf);
|
||||||
|
fd = -1;
|
||||||
|
if (klen != (int)ibuf.getSize())
|
||||||
|
break;
|
||||||
|
// realloc and try again
|
||||||
|
unsigned const s = ibuf.getSize();
|
||||||
|
ibuf.dealloc();
|
||||||
|
ibuf.alloc(3 * s / 2);
|
||||||
|
}
|
||||||
|
if (fd >= 0)
|
||||||
|
(void) close(fd);
|
||||||
|
if (klen <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (klen <= gzlen)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (opt->force > 0)
|
||||||
|
return klen;
|
||||||
|
|
||||||
|
// some checks
|
||||||
|
if (fd_pos != file_size) {
|
||||||
|
//printf("fd_pos: %ld, file_size: %ld\n", (long)fd_pos, (long)file_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
//head_ok:
|
||||||
|
|
||||||
|
// FIXME: more checks for special magic bytes in ibuf ???
|
||||||
|
// FIXME: more checks for kernel architecture ???
|
||||||
|
|
||||||
|
return klen;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PackVmlinuzARMEL::readKernel()
|
||||||
|
{
|
||||||
|
int klen = decompressKernel();
|
||||||
|
if (klen <= 0)
|
||||||
|
throwCantPack("kernel decompression failed");
|
||||||
|
//OutputFile::dump("kernel.img", ibuf, klen);
|
||||||
|
|
||||||
|
// copy the setup boot code
|
||||||
|
setup_buf.alloc(setup_size);
|
||||||
|
memcpy(setup_buf, obuf, setup_size);
|
||||||
|
//OutputFile::dump("setup.img", setup_buf, setup_size);
|
||||||
|
|
||||||
|
obuf.dealloc();
|
||||||
|
obuf.allocForCompression(klen);
|
||||||
|
|
||||||
|
ph.u_len = klen;
|
||||||
|
ph.filter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Linker* PackVmlinuzARMEL::newLinker() const
|
||||||
|
{
|
||||||
|
return new ElfLinkerArmLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const
|
||||||
|
#include "stub/arm-linux.kernel.vmlinux.h"
|
||||||
|
static const
|
||||||
|
#include "stub/armel-linux.kernel.vmlinuz-head.h"
|
||||||
|
|
||||||
|
void PackVmlinuzARMEL::buildLoader(const Filter *ft)
|
||||||
|
{
|
||||||
|
// prepare loader; same as vmlinux (with 'x')
|
||||||
|
initLoader(stub_arm_linux_kernel_vmlinux, sizeof(stub_arm_linux_kernel_vmlinux));
|
||||||
|
addLoader("LINUX000", NULL);
|
||||||
|
if (ft->id) {
|
||||||
|
assert(ft->calls > 0);
|
||||||
|
addLoader("LINUX010", NULL);
|
||||||
|
}
|
||||||
|
addLoader("LINUX020", NULL);
|
||||||
|
if (ft->id) {
|
||||||
|
addFilter32(ft->id);
|
||||||
|
}
|
||||||
|
addLoader("LINUX030", NULL);
|
||||||
|
if (ph.method == M_NRV2E_8) addLoader("NRV2E", NULL);
|
||||||
|
else if (ph.method == M_NRV2B_8) addLoader("NRV2B", NULL);
|
||||||
|
else if (ph.method == M_NRV2D_8) addLoader("NRV2D", NULL);
|
||||||
|
else if (M_IS_LZMA(ph.method)) addLoader("LZMA_ELF00",
|
||||||
|
(opt->small ? "LZMA_DEC10" : "LZMA_DEC20"), "LZMA_DEC30", NULL);
|
||||||
|
else throwBadLoader();
|
||||||
|
addLoader("IDENTSTR,UPX1HEAD", NULL);
|
||||||
|
|
||||||
|
// To debug (2008-09-14):
|
||||||
|
// Build gdb-6.8-21.fc9.src.rpm; ./configure --target=arm-none-elf; make
|
||||||
|
// Contains the fix for http://bugzilla.redhat.com/show_bug.cgi?id=436037
|
||||||
|
// Install qemu-0.9.1-6.fc9.i386.rpm
|
||||||
|
// qemu-system-arm -s -S -kernel <file> -nographic
|
||||||
|
// (gdb) target remote localhost:1234
|
||||||
|
// A very small boot loader runs at pc=0x0; the kernel is at 0x10000 (64KiB).
|
||||||
|
}
|
||||||
|
|
||||||
|
void PackVmlinuzARMEL::defineDecompressorSymbols()
|
||||||
|
{
|
||||||
|
super::defineDecompressorSymbols();
|
||||||
|
linker->defineSymbol( "COMPRESSED_LENGTH", ph.c_len);
|
||||||
|
linker->defineSymbol("UNCOMPRESSED_LENGTH", ph.u_len);
|
||||||
|
linker->defineSymbol("METHOD", ph.method);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned PackVmlinuzARMEL::write_vmlinuz_head(OutputFile *const fo)
|
||||||
|
{ // First word from vmlinuz-head.S
|
||||||
|
fo->write(&stub_armel_linux_kernel_vmlinuz_head[0], 4);
|
||||||
|
|
||||||
|
// Second word
|
||||||
|
LE32 tmp_u32;
|
||||||
|
unsigned const t = (0xff000000 &
|
||||||
|
get_te32(&stub_armel_linux_kernel_vmlinuz_head[4]))
|
||||||
|
| (0x00ffffff & (0u - 1 + ((3+ ph.c_len)>>2)));
|
||||||
|
tmp_u32 = t;
|
||||||
|
fo->write((void const *)&tmp_u32, 4);
|
||||||
|
|
||||||
|
return sizeof(stub_armel_linux_kernel_vmlinuz_head);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PackVmlinuzARMEL::pack(OutputFile *fo)
|
||||||
|
{
|
||||||
|
readKernel();
|
||||||
|
|
||||||
|
// prepare filter
|
||||||
|
Filter ft(ph.level);
|
||||||
|
ft.buf_len = ph.u_len;
|
||||||
|
ft.addvalue = 0;
|
||||||
|
|
||||||
|
// compress
|
||||||
|
upx_compress_config_t cconf; cconf.reset();
|
||||||
|
// limit stack size needed for runtime decompression
|
||||||
|
cconf.conf_lzma.max_num_probs = 1846 + (768 << 5); // ushort: 52,844 byte stack
|
||||||
|
compressWithFilters(&ft, 512, &cconf, getStrategy(ft));
|
||||||
|
|
||||||
|
const unsigned lsize = getLoaderSize();
|
||||||
|
|
||||||
|
defineDecompressorSymbols();
|
||||||
|
defineFilterSymbols(&ft);
|
||||||
|
relocateLoader();
|
||||||
|
|
||||||
|
MemBuffer loader(lsize);
|
||||||
|
memcpy(loader, getLoader(), lsize);
|
||||||
|
patchPackHeader(loader, lsize);
|
||||||
|
|
||||||
|
// boot_sect_t * const bs = (boot_sect_t *) ((unsigned char *) setup_buf);
|
||||||
|
// bs->sys_size = ALIGN_UP(lsize + ph.c_len, 16u) / 16;
|
||||||
|
// bs->payload_length = ph.c_len;
|
||||||
|
|
||||||
|
fo->write(setup_buf, setup_buf.getSize());
|
||||||
|
write_vmlinuz_head(fo);
|
||||||
|
fo->write(obuf, ph.c_len);
|
||||||
|
unsigned const zero = 0;
|
||||||
|
fo->write((void const *)&zero, 3u & (0u - ph.c_len));
|
||||||
|
fo->write(loader, lsize);
|
||||||
|
#if 0
|
||||||
|
printf("%-13s: setup : %8ld bytes\n", getName(), (long) setup_buf.getSize());
|
||||||
|
printf("%-13s: loader : %8ld bytes\n", getName(), (long) lsize);
|
||||||
|
printf("%-13s: compressed : %8ld bytes\n", getName(), (long) ph.c_len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// verify
|
||||||
|
verifyOverlappingDecompression();
|
||||||
|
|
||||||
|
// finally check the compression ratio
|
||||||
|
if (!checkFinalCompressionRatio(fo))
|
||||||
|
throwNotCompressible();
|
||||||
|
}
|
||||||
|
|
||||||
|
int PackVmlinuzARMEL::canUnpack()
|
||||||
|
{
|
||||||
|
if (readFileHeader() != getFormat())
|
||||||
|
return false;
|
||||||
|
fi->seek(setup_size, SEEK_SET);
|
||||||
|
return readPackHeader(1024) ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PackVmlinuzARMEL::unpack(OutputFile *fo)
|
||||||
|
{
|
||||||
|
// no uncompression support for this format, so that
|
||||||
|
// it is possible to remove the original deflate code (>10 KiB)
|
||||||
|
|
||||||
|
// FIXME: but we could write the uncompressed "vmlinux" image
|
||||||
|
|
||||||
|
ibuf.alloc(ph.c_len);
|
||||||
|
obuf.allocForUncompression(ph.u_len);
|
||||||
|
|
||||||
|
fi->seek(setup_size + ph.buf_offset + ph.getPackHeaderSize(), SEEK_SET);
|
||||||
|
fi->readx(ibuf, ph.c_len);
|
||||||
|
|
||||||
|
// decompress
|
||||||
|
decompress(ibuf, obuf);
|
||||||
|
|
||||||
|
// unfilter
|
||||||
|
Filter ft(ph.level);
|
||||||
|
ft.init(ph.filter, 0);
|
||||||
|
ft.cto = (unsigned char) ph.filter_cto;
|
||||||
|
ft.unfilter(obuf, ph.u_len);
|
||||||
|
|
||||||
|
// write decompressed file
|
||||||
|
if (fo)
|
||||||
|
{
|
||||||
|
throwCantUnpack("build a new kernel instead :-)");
|
||||||
|
//fo->write(obuf, ph.u_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
vi:ts=4:et
|
vi:ts=4:et
|
||||||
*/
|
*/
|
||||||
|
|||||||
+69
-13
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_VMLINZ_H
|
#ifndef __UPX_P_VMLINZ_H
|
||||||
#define __UPX_P_VMLINZ_H
|
#define __UPX_P_VMLINZ_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@@ -45,6 +45,7 @@ public:
|
|||||||
virtual const char *getFullName(const options_t *) const { return "i386-linux.kernel.vmlinuz"; }
|
virtual const char *getFullName(const options_t *) const { return "i386-linux.kernel.vmlinuz"; }
|
||||||
virtual const int *getCompressionMethods(int method, int level) const;
|
virtual const int *getCompressionMethods(int method, int level) const;
|
||||||
virtual const int *getFilters() const;
|
virtual const int *getFilters() const;
|
||||||
|
virtual int getStrategy(Filter &);
|
||||||
|
|
||||||
virtual void pack(OutputFile *fo);
|
virtual void pack(OutputFile *fo);
|
||||||
virtual void unpack(OutputFile *fo);
|
virtual void unpack(OutputFile *fo);
|
||||||
@@ -63,13 +64,12 @@ protected:
|
|||||||
// virtual upx_byte *getLoader() const;
|
// virtual upx_byte *getLoader() const;
|
||||||
// virtual int getLoaderSize() const;
|
// virtual int getLoaderSize() const;
|
||||||
|
|
||||||
struct boot_sect_t
|
__packed_struct(boot_sect_t)
|
||||||
{
|
|
||||||
char _[0x1f1];
|
char _[0x1f1];
|
||||||
unsigned char setup_sects;
|
unsigned char setup_sects;
|
||||||
char __[2];
|
char __[2];
|
||||||
LE16 sys_size;
|
LE32 sys_size;
|
||||||
char ___[8];
|
char ___[6];
|
||||||
LE16 boot_flag; // 0xAA55
|
LE16 boot_flag; // 0xAA55
|
||||||
// 0x200
|
// 0x200
|
||||||
char ____[2];
|
char ____[2];
|
||||||
@@ -79,15 +79,24 @@ protected:
|
|||||||
unsigned char load_flags;
|
unsigned char load_flags;
|
||||||
char ______[2];
|
char ______[2];
|
||||||
LE32 code32_start;
|
LE32 code32_start;
|
||||||
|
char _7[0x230 - (0x214 + 4)];
|
||||||
|
LE32 kernel_alignment;
|
||||||
|
char relocatable_kernel;
|
||||||
|
char _8[0x248 - (0x234 + 1)];
|
||||||
|
LE32 payload_offset;
|
||||||
|
LE32 payload_length;
|
||||||
// some more uninteresting fields here ...
|
// some more uninteresting fields here ...
|
||||||
// see /usr/src/linux/Documentation/i386/zero-page.txt
|
// see /usr/src/linux/Documentation/i386/boot.txt
|
||||||
}
|
__packed_struct_end()
|
||||||
__attribute_packed;
|
|
||||||
|
boot_sect_t h;
|
||||||
|
|
||||||
MemBuffer setup_buf;
|
MemBuffer setup_buf;
|
||||||
int setup_size;
|
int setup_size;
|
||||||
unsigned physical_start;
|
unsigned physical_start;
|
||||||
|
unsigned page_offset;
|
||||||
|
unsigned config_physical_align;
|
||||||
|
unsigned filter_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -103,6 +112,7 @@ public:
|
|||||||
virtual int getFormat() const { return UPX_F_BVMLINUZ_i386; }
|
virtual int getFormat() const { return UPX_F_BVMLINUZ_i386; }
|
||||||
virtual const char *getName() const { return "bvmlinuz/386"; }
|
virtual const char *getName() const { return "bvmlinuz/386"; }
|
||||||
virtual const char *getFullName(const options_t *) const { return "i386-linux.kernel.bvmlinuz"; }
|
virtual const char *getFullName(const options_t *) const { return "i386-linux.kernel.bvmlinuz"; }
|
||||||
|
virtual const int *getFilters() const;
|
||||||
|
|
||||||
virtual void pack(OutputFile *fo);
|
virtual void pack(OutputFile *fo);
|
||||||
|
|
||||||
@@ -139,6 +149,52 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
// vmlinuz/armel (gzip compressed Linux kernel image)
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
class PackVmlinuzARMEL : public Packer
|
||||||
|
{
|
||||||
|
typedef Packer super;
|
||||||
|
public:
|
||||||
|
PackVmlinuzARMEL(InputFile *f);
|
||||||
|
virtual int getVersion() const { return 13; }
|
||||||
|
virtual int getFormat() const { return UPX_F_VMLINUZ_ARMEL; }
|
||||||
|
virtual const char *getName() const { return "vmlinuz/armel"; }
|
||||||
|
virtual const char *getFullName(const options_t *) const { return "armel-linux.kernel.vmlinuz"; }
|
||||||
|
virtual const int *getCompressionMethods(int method, int level) const;
|
||||||
|
virtual const int *getFilters() const;
|
||||||
|
virtual int getStrategy(Filter &);
|
||||||
|
|
||||||
|
virtual void pack(OutputFile *fo);
|
||||||
|
virtual void unpack(OutputFile *fo);
|
||||||
|
|
||||||
|
virtual bool canPack();
|
||||||
|
virtual int canUnpack();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual int readFileHeader();
|
||||||
|
virtual int decompressKernel();
|
||||||
|
virtual void readKernel();
|
||||||
|
|
||||||
|
virtual void buildLoader(const Filter *ft);
|
||||||
|
virtual unsigned write_vmlinuz_head(OutputFile *const fo);
|
||||||
|
virtual void defineDecompressorSymbols();
|
||||||
|
virtual Linker* newLinker() const;
|
||||||
|
|
||||||
|
// virtual upx_byte *getLoader() const;
|
||||||
|
// virtual int getLoaderSize() const;
|
||||||
|
|
||||||
|
|
||||||
|
MemBuffer setup_buf;
|
||||||
|
int setup_size;
|
||||||
|
// unsigned physical_start;
|
||||||
|
// unsigned page_offset;
|
||||||
|
// unsigned config_physical_align;
|
||||||
|
unsigned filter_len;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
#endif /* already included */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_VXD_H
|
#ifndef __UPX_P_VXD_H
|
||||||
#define __UPX_P_VXD_H
|
#define __UPX_P_VXD_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
+4
-4
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This file is part of the UPX executable compressor.
|
This file is part of the UPX executable compressor.
|
||||||
|
|
||||||
Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2007 Laszlo Molnar
|
Copyright (C) 1996-2010 Laszlo Molnar
|
||||||
All Rights Reserved.
|
All Rights Reserved.
|
||||||
|
|
||||||
UPX and the UCL library are free software; you can redistribute them
|
UPX and the UCL library are free software; you can redistribute them
|
||||||
@@ -21,13 +21,13 @@
|
|||||||
If not, write to the Free Software Foundation, Inc.,
|
If not, write to the Free Software Foundation, Inc.,
|
||||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@users.sourceforge.net
|
<markus@oberhumer.com> <ml1050@users.sourceforge.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __UPX_P_W16NE_H
|
#ifndef __UPX_P_W16NE_H
|
||||||
#define __UPX_P_W16NE_H
|
#define __UPX_P_W16NE_H 1
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user