i386 conversion stub conversion; nrv2b_d32_2.ash etc.

This commit is contained in:
John Reiser
2006-07-12 11:15:14 -07:00
parent e39b7ffe30
commit 0b8825fecb
41 changed files with 32992 additions and 11048 deletions
+141 -15
View File
@@ -346,6 +346,42 @@ unsigned char *SimpleLinker::getLoader(int *llen)
} }
/*************************************************************************
//
**************************************************************************/
ElfLinker::Section::Section(const char *n, const void *i, unsigned s) :
name(strdup(n)), output(NULL), size(s), offset(0), next(NULL)
{
assert(name);
input = malloc(s + 1);
assert(input);
memcpy(input, i, s);
}
ElfLinker::Section::~Section()
{
free(name);
free(input);
}
ElfLinker::Symbol::Symbol(const char *n, Section *s, unsigned o) :
name(strdup(n)), section(s), offset(o)
{
assert(name);
}
ElfLinker::Symbol::~Symbol()
{
free(name);
}
ElfLinker::Relocation::Relocation(Section *s, unsigned o, const char *t,
Symbol *v, unsigned a) :
section(s), offset(o), type(t), value(v), add(a)
{}
void ElfLinker::preprocessSections(char *start, const char *end) void ElfLinker::preprocessSections(char *start, const char *end)
{ {
nsections = 0; nsections = 0;
@@ -390,10 +426,9 @@ void ElfLinker::preprocessSymbols(char *start, const char *end)
char *s = strstr(start, symbol); char *s = strstr(start, symbol);
s[strlen(symbol)] = 0; s[strlen(symbol)] = 0;
assert(nsymbols < TABLESIZE(symbols));
if (strcmp(section, "*UND*") == 0) if (strcmp(section, "*UND*") == 0)
offset = 0xdeaddead; offset = 0xdeaddead;
symbols[nsymbols++] = Symbol(s, findSection(section), offset); addSymbol(s, section, offset);
//printf("symbol %s preprocessed o=%x\n", s, offset); //printf("symbol %s preprocessed o=%x\n", s, offset);
} }
@@ -433,9 +468,7 @@ void ElfLinker::preprocessRelocations(char *start, const char *end)
sscanf(p + 3, "%x", &add); sscanf(p + 3, "%x", &add);
} }
assert(nrelocations < TABLESIZE(relocations)); addRelocation(section->name, offset, t, symbol, add);
relocations[nrelocations++] = Relocation(section, offset, t,
findSymbol(symbol), add);
//printf("relocation %s %x preprocessed\n", section->name, offset); //printf("relocation %s %x preprocessed\n", section->name, offset);
} }
@@ -447,8 +480,8 @@ void ElfLinker::preprocessRelocations(char *start, const char *end)
ElfLinker::Section *ElfLinker::findSection(const char *name) ElfLinker::Section *ElfLinker::findSection(const char *name)
{ {
for (unsigned ic = 0; ic < nsections; ic++) for (unsigned ic = 0; ic < nsections; ic++)
if (strcmp(sections[ic].name, name) == 0) if (strcmp(sections[ic]->name, name) == 0)
return sections + ic; return sections[ic];
printf("unknown section %s\n", name); printf("unknown section %s\n", name);
abort(); abort();
@@ -458,21 +491,54 @@ ElfLinker::Section *ElfLinker::findSection(const char *name)
ElfLinker::Symbol *ElfLinker::findSymbol(const char *name) ElfLinker::Symbol *ElfLinker::findSymbol(const char *name)
{ {
for (unsigned ic = 0; ic < nsymbols; ic++) for (unsigned ic = 0; ic < nsymbols; ic++)
if (strcmp(symbols[ic].name, name) == 0) if (strcmp(symbols[ic]->name, name) == 0)
return symbols + ic; return symbols[ic];
printf("unknown symbol %s\n", name); printf("unknown symbol %s\n", name);
abort(); abort();
return NULL; return NULL;
} }
ElfLinker::ElfLinker() : input(NULL), output(NULL), head(NULL), tail(NULL) void ElfLinker::addSymbol(const char *name, const char *section,
unsigned offset)
{
symbols = static_cast<Symbol **>(realloc(symbols, (nsymbols + 1)
* sizeof(Symbol *)));
assert(symbols);
symbols[nsymbols++] = new Symbol(name, findSection(section), offset);
}
void ElfLinker::addRelocation(const char *section, unsigned off,
const char *type, const char *symbol,
unsigned add)
{
relocations = static_cast<Relocation **>(realloc(relocations,
(nrelocations + 1)
* sizeof(Relocation *)));
assert(relocations);
relocations[nrelocations++] = new Relocation(findSection(section), off,
type, findSymbol(symbol), add);
}
ElfLinker::ElfLinker() : input(NULL), output(NULL), head(NULL), tail(NULL),
sections(NULL), symbols(NULL), relocations(NULL)
{} {}
ElfLinker::~ElfLinker() ElfLinker::~ElfLinker()
{ {
delete [] input; delete [] input;
delete [] output; delete [] output;
unsigned ic;
for (ic = 0; ic < nsections; ic++)
delete sections[ic];
free(sections);
for (ic = 0; ic < nsymbols; ic++)
delete symbols[ic];
free(symbols);
for (ic = 0; ic < nrelocations; ic++)
delete relocations[ic];
free(relocations);
} }
void ElfLinker::init(const void *pdata, int plen, int) void ElfLinker::init(const void *pdata, int plen, int)
@@ -504,8 +570,8 @@ void ElfLinker::init(const void *pdata, int plen, int)
void ElfLinker::setLoaderAlignOffset(int phase) void ElfLinker::setLoaderAlignOffset(int phase)
{ {
// FIXME: do not use this yet //assert(phase & 0);
assert(phase & 0); printf("\nFIXME: ElfLinker::setLoaderAlignOffset %d\n", phase);
} }
int ElfLinker::addSection(const char *sname) int ElfLinker::addSection(const char *sname)
@@ -562,8 +628,10 @@ int ElfLinker::addSection(const char *sname)
void ElfLinker::addSection(const char *sname, const void *sdata, int slen) void ElfLinker::addSection(const char *sname, const void *sdata, int slen)
{ {
assert(!frozen); assert(!frozen);
assert(nsections < TABLESIZE(sections)); sections = static_cast<Section **>(realloc(sections, (nsections + 1)
sections[nsections++] = Section(sname, sdata, slen); * sizeof(Section *)));
assert(sections);
sections[nsections++] = new Section(sname, sdata, slen);
} }
void ElfLinker::freeze() void ElfLinker::freeze()
@@ -598,7 +666,7 @@ void ElfLinker::relocate()
for (unsigned ic = 0; ic < nrelocations; ic++) for (unsigned ic = 0; ic < nrelocations; ic++)
{ {
Relocation *rel = relocations + ic; Relocation *rel = relocations[ic];
if (rel->section->output == NULL) if (rel->section->output == NULL)
continue; continue;
if (rel->value->section->output == NULL) if (rel->value->section->output == NULL)
@@ -675,6 +743,16 @@ void ElfLinkerX86::align(unsigned len)
alignWithByte(len, 0x90); alignWithByte(len, 0x90);
} }
void ElfLinkerAMD64::align(unsigned len)
{
alignWithByte(len, 0x90);
}
void ElfLinkerPpc32::align(unsigned len)
{
alignWithByte(len, 0);
}
void ElfLinkerX86::relocate1(Relocation *rel, upx_byte *location, void ElfLinkerX86::relocate1(Relocation *rel, upx_byte *location,
unsigned value, const char *type) unsigned value, const char *type)
{ {
@@ -698,6 +776,54 @@ void ElfLinkerX86::relocate1(Relocation *rel, upx_byte *location,
super::relocate1(rel, location, value, type); super::relocate1(rel, location, value, type);
} }
void ElfLinkerAMD64::relocate1(Relocation *rel, upx_byte *location,
unsigned value, const char *type)
{
if (strncmp(type, "R_X86_64_", 9))
return super::relocate1(rel, location, value, type);
type += 9;
if (strncmp(type, "PC", 2) == 0)
{
value -= rel->section->offset + rel->offset;
type += 2;
}
if (strcmp(type, "8") == 0)
*location += value;
else if (strcmp(type, "16") == 0)
set_le16(location, get_le16(location) + value);
else if (strcmp(type, "32") == 0)
set_le32(location, get_le32(location) + value);
else
super::relocate1(rel, location, value, type);
}
void ElfLinkerPpc32::relocate1(Relocation *rel, upx_byte *location,
unsigned value, const char *type)
{
if (strncmp(type, "R_PPC_", 6))
return super::relocate1(rel, location, value, type);
type += 6;
if (strncmp(type, "REL", 3) == 0)
{
value -= rel->section->offset + rel->offset;
type += 3;
}
// FIXME: more relocs
if (strcmp(type, "8") == 0)
*location += value;
else if (strcmp(type, "16") == 0)
set_le16(location, get_le16(location) + value);
else if (strcmp(type, "32") == 0)
set_le32(location, get_le32(location) + value);
else
super::relocate1(rel, location, value, type);
}
void ElfLinkerArmLE::relocate1(Relocation *rel, upx_byte *location, void ElfLinkerArmLE::relocate1(Relocation *rel, upx_byte *location,
unsigned value, const char *type) unsigned value, const char *type)
{ {
+71 -45
View File
@@ -151,52 +151,18 @@ typedef TSimpleLinker<NBELE::BEPolicy> SimpleBELinker;
typedef TSimpleLinker<NBELE::LEPolicy> SimpleLELinker; typedef TSimpleLinker<NBELE::LEPolicy> SimpleLELinker;
class ElfLinker : public Linker /*************************************************************************
// ElfLinker
**************************************************************************/
class ElfLinker : public Linker, private nocopy
{ {
typedef Linker super; typedef Linker super;
protected: protected:
struct Section struct Section;
{ struct Symbol;
const char *name; struct Relocation;
const void *input;
upx_byte *output;
unsigned size;
unsigned offset;
Section *next;
Section(){}
Section(const char *n, const void *i, unsigned s) :
name(n), input(i), output(NULL), size(s), offset(0), next(NULL)
{}
};
struct Symbol
{
const char *name;
Section *section;
unsigned offset;
Symbol(){}
Symbol(const char *n, Section *s, unsigned o) :
name(n), section(s), offset(o)
{}
};
struct Relocation
{
Section *section;
unsigned offset;
const char *type;
Symbol *value;
unsigned add; // used in .rela relocations
Relocation(){}
Relocation(Section *s, unsigned o, const char *t,
Symbol *v, unsigned a) :
section(s), offset(o), type(t), value(v), add(a)
{}
};
upx_byte *input; upx_byte *input;
int inputlen; int inputlen;
@@ -206,9 +172,9 @@ protected:
Section *head; Section *head;
Section *tail; Section *tail;
Section sections[550]; Section **sections;
Symbol symbols[1000]; Symbol **symbols;
Relocation relocations[2000]; Relocation **relocations;
unsigned nsections; unsigned nsections;
unsigned nsymbols; unsigned nsymbols;
@@ -220,6 +186,10 @@ protected:
Section *findSection(const char *name); Section *findSection(const char *name);
Symbol *findSymbol(const char *name); Symbol *findSymbol(const char *name);
void addSymbol(const char *name, const char *section, unsigned offset);
void addRelocation(const char *section, unsigned off, const char *type,
const char *symbol, unsigned add);
public: public:
ElfLinker(); ElfLinker();
@@ -248,6 +218,42 @@ protected:
unsigned value, const char *type); unsigned value, const char *type);
}; };
struct ElfLinker::Section : private nocopy
{
char *name;
void *input;
upx_byte *output;
unsigned size;
unsigned offset;
Section *next;
Section(const char *n, const void *i, unsigned s);
~Section();
};
struct ElfLinker::Symbol : private nocopy
{
char *name;
Section *section;
unsigned offset;
Symbol(const char *n, Section *s, unsigned o);
~Symbol();
};
struct ElfLinker::Relocation : private nocopy
{
Section *section;
unsigned offset;
const char *type;
Symbol *value;
unsigned add; // used in .rela relocations
Relocation(Section *s, unsigned o, const char *t,
Symbol *v, unsigned a);
};
class ElfLinkerX86 : public ElfLinker class ElfLinkerX86 : public ElfLinker
{ {
typedef ElfLinker super; typedef ElfLinker super;
@@ -258,6 +264,26 @@ protected:
unsigned value, const char *type); unsigned value, const char *type);
}; };
class ElfLinkerAMD64 : public ElfLinker
{
typedef ElfLinker super;
protected:
virtual void align(unsigned len);
virtual void relocate1(Relocation *, upx_byte *location,
unsigned value, const char *type);
};
class ElfLinkerPpc32 : public ElfLinker
{
typedef ElfLinker super;
protected:
virtual void align(unsigned len);
virtual void relocate1(Relocation *, upx_byte *location,
unsigned value, const char *type);
};
class ElfLinkerArmLE : public ElfLinker class ElfLinkerArmLE : public ElfLinker
{ {
typedef ElfLinker super; typedef ElfLinker super;
+41 -7
View File
@@ -148,11 +148,26 @@ PackLinuxElf::PackLinuxElf(InputFile *f)
sz_phdrs(0), sz_elf_hdrs(0), sz_phdrs(0), sz_elf_hdrs(0),
e_machine(0), ei_class(0), ei_data(0), ei_osabi(0) e_machine(0), ei_class(0), ei_data(0), ei_osabi(0)
{ {
delete[] file_image;
} }
PackLinuxElf::~PackLinuxElf() PackLinuxElf::~PackLinuxElf()
{ {
delete[] file_image;
}
Linker *PackLinuxElf::newLinker() const
{
return new ElfLinker;
}
void
PackLinuxElf::addStubEntrySections(
upx_byte const *const proto,
unsigned const szproto
)
{
linker->addSection("ELFMAINX", proto, szproto);
addLoader("ELFMAINX", NULL);
} }
PackLinuxElf32::PackLinuxElf32(InputFile *f) PackLinuxElf32::PackLinuxElf32(InputFile *f)
@@ -176,6 +191,11 @@ PackLinuxElf64::~PackLinuxElf64()
delete[] phdri; delete[] phdri;
} }
Linker* PackLinuxElf64amd::newLinker() const
{
return new ElfLinkerAMD64;
}
int const * int const *
PackLinuxElf::getCompressionMethods(int method, int level) const PackLinuxElf::getCompressionMethods(int method, int level) const
{ {
@@ -361,7 +381,7 @@ PackLinuxElf32x86::buildLinuxLoader(
// This adds the definition to the "library", to be used later. // This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr); linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
delete [] cprLoader; // FIXME: memory leak delete [] cprLoader;
int const n_mru = ft->n_mru; // FIXME: belongs to filter? packerf? int const n_mru = ft->n_mru; // FIXME: belongs to filter? packerf?
@@ -448,7 +468,9 @@ PackLinuxElf32x86::buildLinuxLoader(
// PackHeader and overlay_offset at the end of the output file, // PackHeader and overlay_offset at the end of the output file,
// after the compressed data. // after the compressed data.
return getLoaderSize(); unsigned const lsize = getLoaderSize();
linker->relocate();
return lsize;
} }
int int
@@ -502,9 +524,8 @@ PackLinuxElf32::buildLinuxLoader(
//int const GAP = 128; // must match stub/l_mac_ppc.S //int const GAP = 128; // must match stub/l_mac_ppc.S
//segcmdo.vmsize += sz_unc - sz_cpr + GAP + 64; //segcmdo.vmsize += sz_unc - sz_cpr + GAP + 64;
linker->addSection("ELFMAINX", proto, szproto); addStubEntrySections(proto, szproto);
addLoader("ELFMAINX", NULL);
addLoader("FOLDEXEC", NULL); addLoader("FOLDEXEC", NULL);
freezeLoader(); freezeLoader();
return getLoaderSize(); return getLoaderSize();
@@ -558,14 +579,22 @@ PackLinuxElf64::buildLinuxLoader(
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr); linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
delete [] cprLoader; delete [] cprLoader;
linker->addSection("ELFMAINX", proto, szproto); addStubEntrySections(proto, szproto);
addLoader("ELFMAINX", NULL);
addLoader("FOLDEXEC", NULL); addLoader("FOLDEXEC", NULL);
freezeLoader(); freezeLoader();
return getLoaderSize(); return getLoaderSize();
} }
void
PackLinuxElf64amd::addStubEntrySections(
upx_byte const *const /*proto*/,
unsigned const /*szproto*/
)
{
// FIXME
}
static const static const
#include "stub/i386-linux.elf-entry.h" #include "stub/i386-linux.elf-entry.h"
static const static const
@@ -1986,6 +2015,11 @@ PackLinuxElf32x86::~PackLinuxElf32x86()
{ {
} }
Linker* PackLinuxElf32x86::newLinker() const
{
return new ElfLinkerX86;
}
PackBSDElf32x86::PackBSDElf32x86(InputFile *f) : super(f) PackBSDElf32x86::PackBSDElf32x86(InputFile *f) : super(f)
{ {
e_machine = Elf32_Ehdr::EM_386; e_machine = Elf32_Ehdr::EM_386;
+5
View File
@@ -54,11 +54,13 @@ protected:
//virtual void pack3(OutputFile *, Filter &) = 0; // append loader //virtual void pack3(OutputFile *, Filter &) = 0; // append loader
virtual void pack4(OutputFile *, Filter &) = 0; // append pack header virtual void pack4(OutputFile *, Filter &) = 0; // append pack header
virtual Linker* newLinker() const;
virtual void generateElfHdr( virtual void generateElfHdr(
OutputFile *, OutputFile *,
void const *proto, void const *proto,
unsigned const brka unsigned const brka
) = 0; ) = 0;
virtual void addStubEntrySections(upx_byte const *, unsigned);
virtual void unpack(OutputFile *fo) = 0; virtual void unpack(OutputFile *fo) = 0;
protected: protected:
@@ -285,6 +287,8 @@ protected:
virtual void pack3(OutputFile *, Filter &); // append loader virtual void pack3(OutputFile *, Filter &); // append loader
virtual const int *getCompressionMethods(int method, int level) const; virtual const int *getCompressionMethods(int method, int level) const;
virtual int buildLoader(const Filter *); virtual int buildLoader(const Filter *);
virtual Linker* newLinker() const;
virtual void addStubEntrySections(upx_byte const *, unsigned);
}; };
/************************************************************************* /*************************************************************************
@@ -326,6 +330,7 @@ protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual int buildLoader(const Filter *); virtual int buildLoader(const Filter *);
virtual Linker* newLinker() const;
virtual int buildLinuxLoader( virtual int buildLinuxLoader(
upx_byte const *const proto, // assembly-only sections upx_byte const *const proto, // assembly-only sections
unsigned const szproto, unsigned const szproto,
+32 -22
View File
@@ -332,9 +332,11 @@ tc.i386-bsd.elf.objdump = $(call tc,m-objdump)
tc.i386-bsd.elf.objstrip = $(call tc,objcopy) -R .comment -R .note tc.i386-bsd.elf.objstrip = $(call tc,objcopy) -R .comment -R .note
i386-bsd.elf-entry.h : $(srcdir)/src/$$T.asm i386-bsd.elf-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) $< -o tmp/$T.tmp1 $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2 $(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin $(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=bsd_i386elf_loader tmp/$T.bin $@ $(call tc,bin2h) --ident=bsd_i386elf_loader tmp/$T.bin $@
i386-bsd.elf-fold.h : tmp/$$T.o tmp/i386-bsd.elf-main.o $(srcdir)/src/$$T.lds i386-bsd.elf-fold.h : tmp/$$T.o tmp/i386-bsd.elf-main.o $(srcdir)/src/$$T.lds
@@ -345,10 +347,10 @@ i386-bsd.elf-fold.h : tmp/$$T.o tmp/i386-bsd.elf-main.o $(srcdir)/src/$$T.lds
$(call tc,bin2h) --ident=bsd_i386elf_fold tmp/$T.bin $@ $(call tc,bin2h) --ident=bsd_i386elf_fold tmp/$T.bin $@
tmp/i386-bsd.elf-fold.o : $(srcdir)/src/$$T.asm tmp/i386-bsd.elf-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@ $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@ $(call tc,objstrip) $@
tmp/i386-bsd.elf-main.o : $(srcdir)/src/$$T.c tmp/i386-bsd.elf-main.o : $(srcdir)/src/$$T.c
$(call tc,gcc) -c $< -o $@ $(call tc,gcc) -c $< -o $@
$(call tc,objstrip) $@ $(call tc,objstrip) $@
@@ -380,7 +382,7 @@ i386-openbsd.elf-fold.h : tmp/$$T.o tmp/i386-openbsd.elf-main.o $(srcdir)/src/i3
$(call tc,bin2h) --ident=openbsd_i386elf_fold tmp/$T.bin $@ $(call tc,bin2h) --ident=openbsd_i386elf_fold tmp/$T.bin $@
tmp/i386-openbsd.elf-fold.o : $(srcdir)/src/$$T.asm tmp/i386-openbsd.elf-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@ $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@ $(call tc,objstrip) $@
tmp/i386-openbsd.elf-main.o : $(srcdir)/src/$$T.c tmp/i386-openbsd.elf-main.o : $(srcdir)/src/$$T.c
@@ -459,9 +461,11 @@ tc.i386-linux.elf.objdump = $(call tc,m-objdump)
tc.i386-linux.elf.objstrip = $(call tc,objcopy) -R .comment -R .note tc.i386-linux.elf.objstrip = $(call tc,objcopy) -R .comment -R .note
i386-linux.elf-entry.h : $(srcdir)/src/$$T.asm i386-linux.elf-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) $< -o tmp/$T.tmp1 $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2 $(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin $(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_i386elf_loader tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386elf_loader tmp/$T.bin $@
i386-linux.elf-fold.h : tmp/$$T.o tmp/i386-linux.elf-main.o $(srcdir)/src/$$T.lds i386-linux.elf-fold.h : tmp/$$T.o tmp/i386-linux.elf-main.o $(srcdir)/src/$$T.lds
@@ -472,7 +476,7 @@ i386-linux.elf-fold.h : tmp/$$T.o tmp/i386-linux.elf-main.o $(srcdir)/src/$$T.ld
$(call tc,bin2h) --ident=linux_i386elf_fold tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386elf_fold tmp/$T.bin $@
tmp/i386-linux.elf-fold.o : $(srcdir)/src/$$T.asm tmp/i386-linux.elf-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@ $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@ $(call tc,objstrip) $@
tmp/i386-linux.elf-main.o : $(srcdir)/src/$$T.c tmp/i386-linux.elf-main.o : $(srcdir)/src/$$T.c
@@ -487,9 +491,11 @@ tmp/i386-linux.elf-main.o : $(srcdir)/src/$$T.c
# note: tc_list settings are inherited from i386-linux.elf # note: tc_list settings are inherited from i386-linux.elf
i386-linux.elf.execve-entry.h : $(srcdir)/src/$$T.asm i386-linux.elf.execve-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) --MMD=$@ $< -o tmp/$T.tmp1 $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2 $(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin $(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_i386exec_loader tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386exec_loader tmp/$T.bin $@
i386-linux.elf.execve-fold.h : tmp/$$T.o tmp/i386-linux.elf.execve-main.o tmp/i386-linux.elf.execve-upx_itoa.o $(srcdir)/src/$$T.lds i386-linux.elf.execve-fold.h : tmp/$$T.o tmp/i386-linux.elf.execve-main.o tmp/i386-linux.elf.execve-upx_itoa.o $(srcdir)/src/$$T.lds
@@ -500,7 +506,7 @@ i386-linux.elf.execve-fold.h : tmp/$$T.o tmp/i386-linux.elf.execve-main.o tmp/i3
$(call tc,bin2h) --ident=linux_i386exec_fold tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386exec_fold tmp/$T.bin $@
tmp/i386-linux.elf.execve-fold.o : $(srcdir)/src/$$T.asm tmp/i386-linux.elf.execve-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@ $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@ $(call tc,objstrip) $@
tmp/i386-linux.elf.execve-main.o : $(srcdir)/src/$$T.c tmp/i386-linux.elf.execve-main.o : $(srcdir)/src/$$T.c
@@ -519,9 +525,11 @@ tmp/i386-linux.elf.execve-upx_itoa.o: $(srcdir)/src/$$T.asm
# note: tc_list settings are inherited from i386-linux.elf # note: tc_list settings are inherited from i386-linux.elf
i386-linux.elf.interp-entry.h : $(srcdir)/src/$$T.asm i386-linux.elf.interp-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) --MMD=$@ $< -o tmp/$T.tmp1 $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2 $(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin $(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_i386pti_loader tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386pti_loader tmp/$T.bin $@
i386-linux.elf.interp-fold.h : tmp/$$T.o tmp/i386-linux.elf.interp-main.o $(srcdir)/src/$$T.lds i386-linux.elf.interp-fold.h : tmp/$$T.o tmp/i386-linux.elf.interp-main.o $(srcdir)/src/$$T.lds
@@ -532,7 +540,7 @@ i386-linux.elf.interp-fold.h : tmp/$$T.o tmp/i386-linux.elf.interp-main.o $(srcd
$(call tc,bin2h) --ident=linux_i386pti_fold tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386pti_fold tmp/$T.bin $@
tmp/i386-linux.elf.interp-fold.o : $(srcdir)/src/$$T.asm tmp/i386-linux.elf.interp-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@ $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@ $(call tc,objstrip) $@
tmp/i386-linux.elf.interp-main.o : $(srcdir)/src/$$T.c tmp/i386-linux.elf.interp-main.o : $(srcdir)/src/$$T.c
@@ -547,9 +555,11 @@ tmp/i386-linux.elf.interp-main.o : $(srcdir)/src/$$T.c
# note: tc_list settings are inherited from i386-linux.elf # note: tc_list settings are inherited from i386-linux.elf
i386-linux.elf.shell-entry.h : $(srcdir)/src/$$T.asm i386-linux.elf.shell-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) --MMD=$@ $< -o tmp/$T.tmp1 $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2 $(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin $(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_i386sh_loader tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386sh_loader tmp/$T.bin $@
i386-linux.elf.shell-fold.h : tmp/$$T.o tmp/i386-linux.elf.shell-main.o $(srcdir)/src/$$T.lds i386-linux.elf.shell-fold.h : tmp/$$T.o tmp/i386-linux.elf.shell-main.o $(srcdir)/src/$$T.lds
@@ -560,7 +570,7 @@ i386-linux.elf.shell-fold.h : tmp/$$T.o tmp/i386-linux.elf.shell-main.o $(srcdir
$(call tc,bin2h) --ident=linux_i386sh_fold tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_i386sh_fold tmp/$T.bin $@
tmp/i386-linux.elf.shell-fold.o : $(srcdir)/src/$$T.asm tmp/i386-linux.elf.shell-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@ $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@ $(call tc,objstrip) $@
tmp/i386-linux.elf.shell-main.o : $(srcdir)/src/$$T.c tmp/i386-linux.elf.shell-main.o : $(srcdir)/src/$$T.c
File diff suppressed because it is too large Load Diff
+2154 -898
View File
File diff suppressed because it is too large Load Diff
+2214 -958
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+96 -97
View File
@@ -1,4 +1,4 @@
/* i386-linux.elf.interp-fold.h -- created from i386-linux.elf.interp-fold.bin, 1531 (0x5fb) bytes /* i386-linux.elf.interp-fold.h -- created from i386-linux.elf.interp-fold.bin, 1519 (0x5ef) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -27,105 +27,104 @@
*/ */
#define LINUX_I386PTI_FOLD_SIZE 1531 #define LINUX_I386PTI_FOLD_SIZE 1519
#define LINUX_I386PTI_FOLD_ADLER32 0x54fe990e #define LINUX_I386PTI_FOLD_ADLER32 0xe82498de
#define LINUX_I386PTI_FOLD_CRC32 0xa290f522 #define LINUX_I386PTI_FOLD_CRC32 0xd7e223de
unsigned char linux_i386pti_fold[1531] = { unsigned char linux_i386pti_fold[1519] = {
127, 69, 76, 70, 1, 1, 1, 0, 76,105,110,117,120, 0, 0, 0, /* 0x 0 */ 127, 69, 76, 70, 1, 1, 1, 0, 76,105,110,117,120, 0, 0, 0, /* 0x 0 */
2, 0, 3, 0, 1, 0, 0, 0,128, 0, 1, 0, 52, 0, 0, 0, /* 0x 10 */ 2, 0, 3, 0, 1, 0, 0, 0,116, 0, 1, 0, 52, 0, 0, 0, /* 0x 10 */
0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 32, 0, 2, 0, 0, 0, /* 0x 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 32, 0, 2, 0, 0, 0, /* 0x 20 */
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 0x 30 */ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 0x 30 */
0, 0, 1, 0,251, 5, 0, 0,252, 5, 0, 0, 5, 0, 0, 0, /* 0x 40 */ 0, 0, 1, 0,239, 5, 0, 0,240, 5, 0, 0, 5, 0, 0, 0, /* 0x 40 */
0, 16, 0, 0, 1, 0, 0, 0,251, 5, 0, 0, 0, 0, 0, 0, /* 0x 50 */ 0, 16, 0, 0, 1, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, /* 0x 50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 60 */
0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */ 0, 16, 0, 0, 93, 89, 88,141,124,132, 4, 80, 41,192,175,117, /* 0x 70 */
93, 89, 88,141,124,132, 4, 80, 41,192,175,117,253,175,137,254, /* 0x 80 */ 253,175,137,254,139, 6,131,248, 3,116, 8,131,198, 8,131,248, /* 0x 80 */
139, 6,131,248, 3,116, 8,131,198, 8,131,248, 0,117,241,139, /* 0x 90 */ 0,117,241,139, 94, 4, 83,129,236, 0, 10, 0, 0,137,226, 81, /* 0x 90 */
94, 4, 83,129,236, 0, 10, 0, 0,137,226, 81,141, 67, 88,139, /* 0x a0 */ 141, 67, 88,139,115, 24, 41,198,139, 24,139, 72, 4,131,193, 12, /* 0x a0 */
115, 24, 41,198,139, 24,139, 72, 4,131,193, 12, 96,232, 62, 4, /* 0x b0 */ 96,232, 62, 4, 0, 0,129,196, 36, 10, 0, 0, 91, 80,139, 75, /* 0x b0 */
0, 0,129,196, 36, 10, 0, 0, 91, 80,139, 75, 20,139, 91, 8, /* 0x c0 */ 20,139, 91, 8,184, 91, 0, 0, 0,205,128, 41,192, 41,201, 41, /* 0x c0 */
184, 91, 0, 0, 0,205,128, 41,192, 41,201, 41,210, 41,219, 41, /* 0x d0 */ 210, 41,219, 41,237, 41,246, 41,255,195, 83,141, 92, 36, 8,106, /* 0x d0 */
237, 41,246, 41,255,195, 83,141, 92, 36, 8,106, 90, 88,205,128, /* 0x e0 */ 90, 88,205,128, 91,195, 0, 0, 87, 86,137,206, 83,137,195, 57, /* 0x e0 */
91,195, 0, 0, 87, 86,137,206, 83,137,195, 57, 8,139,120, 4, /* 0x f0 */ 8,139,120, 4,115, 10,106,127, 91,106, 1, 88,205,128,235,254, /* 0x f0 */
115, 10,106,127, 91,106, 1, 88,205,128,235,254,133,201,116, 8, /* 0x 100 */ 133,201,116, 8,138, 7, 71,136, 2, 66,226,248, 1,115, 4, 41, /* 0x 100 */
138, 7, 71,136, 2, 66,226,248, 1,115, 4, 41, 51, 91, 94, 95, /* 0x 110 */ 51, 91, 94, 95,195, 85,137,229, 87, 86,137,198, 83,137,211,131, /* 0x 110 */
195, 85,137,229, 87, 86,137,198, 83,137,211,131,236, 20,139,125, /* 0x 120 */ 236, 20,139,125, 12,131, 58, 0, 15,132,185, 0, 0, 0,141, 85, /* 0x 120 */
12,131, 58, 0, 15,132,185, 0, 0, 0,141, 85,228,185, 12, 0, /* 0x 130 */ 228,185, 12, 0, 0, 0,137,240,232,171,255,255,255,139, 69,228, /* 0x 130 */
0, 0,137,240,232,171,255,255,255,139, 69,228,139, 77,232,133, /* 0x 140 */ 139, 77,232,133,192,117, 19,129,249, 85, 80, 88, 33,117, 15,131, /* 0x 140 */
192,117, 19,129,249, 85, 80, 88, 33,117, 15,131, 62, 0, 15,132, /* 0x 150 */ 62, 0, 15,132,143, 0, 0, 0,235, 4,133,201,117, 10,106,127, /* 0x 150 */
143, 0, 0, 0,235, 4,133,201,117, 10,106,127, 91,106, 1, 88, /* 0x 160 */ 91,106, 1, 88,205,128,235,254, 57,193,119,242, 59, 3,119,238, /* 0x 160 */
205,128,235,254, 57,193,119,242, 59, 3,119,238, 57,193,115, 86, /* 0x 170 */ 57,193,115, 86,137, 69,224, 15,182, 69,236, 80,255, 85, 8, 90, /* 0x 170 */
137, 69,224, 15,182, 69,236, 80,255, 85, 8, 90,141, 85,224,255, /* 0x 180 */ 141, 85,224,255,117,236, 82,255,115, 4,255,117,232,255,118, 4, /* 0x 180 */
117,236, 82,255,115, 4,255,117,232,255,118, 4,255, 16,131,196, /* 0x 190 */ 255, 16,131,196, 20,133,192,117,197,139, 69,228, 57, 69,224,117, /* 0x 190 */
20,133,192,117,197,139, 69,228, 57, 69,224,117,189,138, 69,237, /* 0x 1a0 */ 189,138, 69,237,132,192,116, 24, 15,182,192, 80,255,215, 15,182, /* 0x 1a0 */
132,192,116, 24, 15,182,192, 80,255,215, 15,182, 85,238,137, 20, /* 0x 1b0 */ 85,238,137, 20, 36,255,117,224,255,115, 4,255, 16,131,196, 12, /* 0x 1b0 */
36,255,117,224,255,115, 4,255, 16,131,196, 12,139, 69,232, 1, /* 0x 1c0 */ 139, 69,232, 1, 70, 4, 41, 6,235, 10,139, 83, 4,137,240,232, /* 0x 1c0 */
70, 4, 41, 6,235, 10,139, 83, 4,137,240,232, 20,255,255,255, /* 0x 1d0 */ 20,255,255,255,139, 85,228,139, 3, 1, 83, 4, 41,208,133,192, /* 0x 1d0 */
139, 85,228,139, 3, 1, 83, 4, 41,208,133,192,137, 3,233, 65, /* 0x 1e0 */ 137, 3,233, 65,255,255,255,141,101,244, 91, 94, 95,201,195,133, /* 0x 1e0 */
255,255,255,141,101,244, 91, 94, 95,201,195,133,210,137,209,116, /* 0x 1f0 */ 210,137,209,116, 6,198, 0, 0, 64,226,250,195,133,192, 83,137, /* 0x 1f0 */
6,198, 0, 0, 64,226,250,195,133,192, 83,137,211,116, 29,168, /* 0x 200 */ 211,116, 29,168, 1,117, 25,139, 16, 57,218,116, 7, 74,117, 11, /* 0x 200 */
1,117, 25,139, 16, 57,218,116, 7, 74,117, 11,133,219,116, 7, /* 0x 210 */ 133,219,116, 7,137, 24,137, 72, 4,235, 5,131,192, 8,235,231, /* 0x 210 */
137, 24,137, 72, 4,235, 5,131,192, 8,235,231, 91,195, 85,137, /* 0x 220 */ 91,195, 85,137,229, 87, 86, 83,131,236, 84,137, 69,228,139, 69, /* 0x 220 */
229, 87, 86, 83,131,236, 84,137, 69,228,139, 69, 8,137, 85,224, /* 0x 230 */ 8,137, 85,224,139, 77, 16,137, 69,220, 3, 64, 28,139, 93,220, /* 0x 230 */
139, 77, 16,137, 69,220, 3, 64, 28,139, 93,220,137, 77,212,139, /* 0x 240 */ 137, 77,212,139, 85, 12,137, 69,208, 49,192,102,131,123, 16, 3, /* 0x 240 */
85, 12,137, 69,208, 49,192,102,131,123, 16, 3,137, 85,216, 15, /* 0x 250 */ 137, 85,216, 15,183, 75, 44,139, 85,208, 15,149,192,131,206,255, /* 0x 250 */
183, 75, 44,139, 85,208, 15,149,192,131,206,255,193,224, 4,131, /* 0x 260 */ 193,224, 4,131,192, 34, 49,219,137, 69,184,137,200, 49,255, 72, /* 0x 260 */
192, 34, 49,219,137, 69,184,137,200, 49,255, 72,120, 31,131, 58, /* 0x 270 */ 120, 31,131, 58, 1,117, 21,139, 66, 8, 57,240,115, 5,137,198, /* 0x 270 */
1,117, 21,139, 66, 8, 57,240,115, 5,137,198,139,122, 16, 3, /* 0x 280 */ 139,122, 16, 3, 66, 20, 57,195,115, 2,137,195,131,194, 32,226, /* 0x 280 */
66, 20, 57,195,115, 2,137,195,131,194, 32,226,225,137,240,129, /* 0x 290 */ 225,137,240,129,230, 0,240,255,255,106, 0, 41,243,106, 0, 37, /* 0x 290 */
230, 0,240,255,255,106, 0, 41,243,106, 0, 37,255, 15, 0, 0, /* 0x 2a0 */ 255, 15, 0, 0,137,117,188,141,179,255, 15, 0, 0,255,117,184, /* 0x 2a0 */
137,117,188,141,179,255, 15, 0, 0,255,117,184,129,230, 0,240, /* 0x 2b0 */ 129,230, 0,240,255,255,106, 7, 86,255,117,188,141,188, 7,255, /* 0x 2b0 */
255,255,106, 7, 86,255,117,188,141,188, 7,255, 15, 0, 0,232, /* 0x 2c0 */ 15, 0, 0,232, 18,254,255,255,129,231, 0,240,255,255,137,194, /* 0x 2c0 */
18,254,255,255,129,231, 0,240,255,255,137,194,137,195, 1,242, /* 0x 2d0 */ 137,195, 1,242, 41,254,131,196, 24,137, 69,172,137, 85,240, 1, /* 0x 2d0 */
41,254,131,196, 24,137, 69,172,137, 85,240, 1,251,137,241,106, /* 0x 2e0 */ 251,137,241,106, 91, 88,205,128,139, 69,220,199, 69,196, 0, 0, /* 0x 2e0 */
91, 88,205,128,139, 69,220,199, 69,196, 0, 0, 0, 0,139, 93, /* 0x 2f0 */ 0, 0,139, 93,172, 43, 93,188,102,131,120, 44, 0,137, 93,204, /* 0x 2f0 */
172, 43, 93,188,102,131,120, 44, 0,137, 93,204, 15,132,180, 1, /* 0x 300 */ 15,132,180, 1, 0, 0,139, 85,208,139, 2,131,248, 6,117, 24, /* 0x 300 */
0, 0,139, 85,208,139, 2,131,248, 6,117, 24,139, 77,204, 3, /* 0x 310 */ 139, 77,204, 3, 74, 8,186, 3, 0, 0, 0,139, 69,212,232,217, /* 0x 310 */
74, 8,186, 3, 0, 0, 0,139, 69,212,232,217,254,255,255,233, /* 0x 320 */ 254,255,255,233,123, 1, 0, 0, 72, 15,133,116, 1, 0, 0,139, /* 0x 320 */
123, 1, 0, 0, 72, 15,133,116, 1, 0, 0,139, 93,208,199, 69, /* 0x 330 */ 93,208,199, 69,192, 64, 98, 81,115,139, 75, 24,139, 67, 8,131, /* 0x 330 */
192, 64, 98, 81,115,139, 75, 24,139, 67, 8,131,225, 7,139, 83, /* 0x 340 */ 225, 7,139, 83, 16,193,225, 2,137, 69,236,211,109,192,137,193, /* 0x 340 */
16,193,225, 2,137, 69,236,211,109,192,137,193, 3, 75, 20,137, /* 0x 350 */ 3, 75, 20,137,195,129,227,255, 15, 0, 0,137, 85,232,141, 60, /* 0x 350 */
195,129,227,255, 15, 0, 0,137, 85,232,141, 60, 26,139, 85,204, /* 0x 360 */ 26,139, 85,204, 41,216,131,101,192, 7, 1,209,141, 52, 16,137, /* 0x 360 */
41,216,131,101,192, 7, 1,209,141, 52, 16,137, 77,176,139, 77, /* 0x 370 */ 77,176,139, 77,208,139, 65, 4, 41,216,131,125,216, 1, 80,255, /* 0x 370 */
208,139, 65, 4, 41,216,131,125,216, 1, 80,255,117,228, 25,192, /* 0x 380 */ 117,228, 25,192,131,224,224,131,192, 50,131,125,216, 0, 80,137, /* 0x 380 */
131,224,224,131,192, 50,131,125,216, 0, 80,137,248,106, 3,116, /* 0x 390 */ 248,106, 3,116, 3,141, 71, 3, 80, 86,232, 59,253,255,255,131, /* 0x 390 */
3,141, 71, 3, 80, 86,232, 59,253,255,255,131,196, 24, 57,198, /* 0x 3a0 */ 196, 24, 57,198, 15,133,170, 0, 0, 0,131,125,216, 0,116, 19, /* 0x 3a0 */
15,133,170, 0, 0, 0,131,125,216, 0,116, 19,255,117,224,255, /* 0x 3b0 */ 255,117,224,255,117,228,139, 69,216,141, 85,232,232, 84,253,255, /* 0x 3b0 */
117,228,139, 69,216,141, 85,232,232, 84,253,255,255, 89, 88,137, /* 0x 3c0 */ 255, 89, 88,137,218,137,251,137,240,247,219,232, 31,254,255,255, /* 0x 3c0 */
218,137,251,137,240,247,219,232, 31,254,255,255,129,227,255, 15, /* 0x 3d0 */ 129,227,255, 15, 0, 0,141, 4, 62,137,218,137, 93,180,232, 12, /* 0x 3d0 */
0, 0,141, 4, 62,137,218,137, 93,180,232, 12,254,255,255,131, /* 0x 3e0 */ 254,255,255,131,125,216, 0,116, 91,139, 69,208,131, 56, 1,117, /* 0x 3e0 */
125,216, 0,116, 91,139, 69,208,131, 56, 1,117, 83,246, 64, 24, /* 0x 3f0 */ 83,246, 64, 24, 1,116, 77,139, 93,208,137,194,139, 64, 20, 59, /* 0x 3f0 */
1,116, 77,139, 93,208,137,194,139, 64, 20, 59, 67, 16,139, 82, /* 0x 400 */ 67, 16,139, 82, 8,141, 12, 16,117, 14,137,200,247,216, 37,255, /* 0x 400 */
8,141, 12, 16,117, 14,137,200,247,216, 37,255, 15, 0, 0,131, /* 0x 410 */ 15, 0, 0,131,248, 3,119, 12,139, 69,208,141, 74, 12,131,120, /* 0x 410 */
248, 3,119, 12,139, 69,208,141, 74, 12,131,120, 4, 0,117, 15, /* 0x 420 */ 4, 0,117, 15,139, 1, 61,205,128, 97,195,116, 6,199, 1,205, /* 0x 420 */
139, 1, 61,205,128, 97,195,116, 6,199, 1,205,128, 97,195,133, /* 0x 430 */ 128, 97,195,133,201,116, 13,139, 69,212, 49,210,131,224,254,232, /* 0x 430 */
201,116, 13,139, 69,212, 49,210,131,224,254,232,184,253,255,255, /* 0x 440 */ 184,253,255,255,137,243,137,249,139, 85,192,106,125, 88,205,128, /* 0x 440 */
137,243,137,249,139, 85,192,106,125, 88,205,128,133,192,116, 10, /* 0x 450 */ 133,192,116, 10,106,127, 91,106, 1, 88,205,128,235,254,139, 85, /* 0x 450 */
106,127, 91,106, 1, 88,205,128,235,254,139, 85,180,141, 4, 23, /* 0x 460 */ 180,141, 4, 23,141, 28, 6, 59, 93,176,115, 30,106, 0,106, 0, /* 0x 460 */
141, 28, 6, 59, 93,176,115, 30,106, 0,106, 0,106, 50,255,117, /* 0x 470 */ 106, 50,255,117,192, 41, 93,176,255,117,176, 83,232, 89,252,255, /* 0x 470 */
192, 41, 93,176,255,117,176, 83,232, 89,252,255,255,131,196, 24, /* 0x 480 */ 255,131,196, 24, 57,195,116, 27,235,202,131,125,216, 0,116, 19, /* 0x 480 */
57,195,116, 27,235,202,131,125,216, 0,116, 19,141, 79, 3,129, /* 0x 490 */ 141, 79, 3,129,225,255, 15, 0, 0,131,249, 3,119, 5,106, 91, /* 0x 490 */
225,255, 15, 0, 0,131,249, 3,119, 5,106, 91, 88,205,128,139, /* 0x 4a0 */ 88,205,128,139, 77,220,255, 69,196, 15,183, 65, 44,131, 69,208, /* 0x 4a0 */
77,220,255, 69,196, 15,183, 65, 44,131, 69,208, 32, 57, 69,196, /* 0x 4b0 */ 32, 57, 69,196, 15,140, 76,254,255,255,131,125,216, 0,117, 14, /* 0x 4b0 */
15,140, 76,254,255,255,131,125,216, 0,117, 14,139, 93,228,106, /* 0x 4c0 */ 139, 93,228,106, 6, 88,205,128,133,192,116, 20,235,134,139, 69, /* 0x 4c0 */
6, 88,205,128,133,192,116, 20,235,134,139, 69,220,102,131,120, /* 0x 4d0 */ 220,102,131,120, 16, 3,116, 8,139, 93,240,106, 45, 88,205,128, /* 0x 4d0 */
16, 3,116, 8,139, 93,240,106, 45, 88,205,128,139, 85,220,139, /* 0x 4e0 */ 139, 85,220,139, 82, 24, 1, 85,204,139, 69,204,141,101,244, 91, /* 0x 4e0 */
82, 24, 1, 85,204,139, 69,204,141,101,244, 91, 94, 95,201,195, /* 0x 4f0 */ 94, 95,201,195, 85,137,229, 87, 86, 83,131,236, 16,141, 85, 24, /* 0x 4f0 */
85,137,229, 87, 86, 83,131,236, 16,141, 85, 24,139,125, 20,255, /* 0x 500 */ 139,125, 20,255,117, 40,141, 71, 52,139, 93, 8,255,117, 16,137, /* 0x 500 */
117, 40,141, 71, 52,139, 93, 8,255,117, 16,137, 69,240,139,117, /* 0x 510 */ 69,240,139,117, 32,141, 69, 32,232,248,251,255,255,139, 85,240, /* 0x 510 */
32,141, 69, 32,232,248,251,255,255,139, 85,240,139, 69, 12,139, /* 0x 520 */ 139, 69, 12,139, 74, 8,186, 3, 0, 0, 0,137, 69, 32,137,216, /* 0x 520 */
74, 8,186, 3, 0, 0, 0,137, 69, 32,137,216,131,193, 52, 41, /* 0x 530 */ 131,193, 52, 41,117, 36,232,193,252,255,255, 15,183, 79, 42,137, /* 0x 530 */
117, 36,232,193,252,255,255, 15,183, 79, 42,137,216,186, 4, 0, /* 0x 540 */ 216,186, 4, 0, 0, 0,232,177,252,255,255, 15,183, 79, 44,137, /* 0x 540 */
0, 0,232,177,252,255,255, 15,183, 79, 44,137,216,186, 5, 0, /* 0x 550 */ 216,186, 5, 0, 0, 0,232,161,252,255,255,139, 79, 24,137,216, /* 0x 550 */
0, 0,232,161,252,255,255,139, 79, 24,137,216,186, 9, 0, 0, /* 0x 560 */ 186, 9, 0, 0, 0,232,146,252,255,255,141, 69, 32, 83,139, 85, /* 0x 560 */
0,232,146,252,255,255,141, 69, 32, 83,139, 85, 40, 80,139, 69, /* 0x 570 */ 40, 80,139, 69, 16, 87,232,167,252,255,255,102,139, 79, 44,131, /* 0x 570 */
16, 87,232,167,252,255,255,102,139, 79, 44,131,196, 20, 49,210, /* 0x 580 */ 196, 20, 49,210,102,133,201,137,195,116, 90,139, 69,240,131, 56, /* 0x 580 */
102,133,201,137,195,116, 90,139, 69,240,131, 56, 3,117, 70, 49, /* 0x 590 */ 3,117, 70, 49,201,139, 88, 8,137,202,106, 5, 88,205,128,133, /* 0x 590 */
201,139, 88, 8,137,202,106, 5, 88,205,128,133,192,137,198,120, /* 0x 5a0 */ 192,137,198,120, 21,186, 0, 2, 0, 0,137,195,137,249,106, 3, /* 0x 5a0 */
21,186, 0, 2, 0, 0,137,195,137,249,106, 3, 88,205,128, 61, /* 0x 5b0 */ 88,205,128, 61, 0, 2, 0, 0,116, 10,106,127, 91,106, 1, 88, /* 0x 5b0 */
0, 2, 0, 0,116, 10,106,127, 91,106, 1, 88,205,128,235,254, /* 0x 5c0 */ 205,128,235,254,106, 0, 49,210,106, 0,137,240, 87,232, 80,252, /* 0x 5c0 */
106, 0, 49,210,106, 0,137,240, 87,232, 80,252,255,255,131,196, /* 0x 5d0 */ 255,255,131,196, 12,137,195,235, 12, 66, 15,183,193,131, 69,240, /* 0x 5d0 */
12,137,195,235, 12, 66, 15,183,193,131, 69,240, 32, 57,194,124, /* 0x 5e0 */ 32, 57,194,124,166,141,101,244,137,216, 91, 94, 95,201,195 /* 0x 5e0 */
166,141,101,244,137,216, 91, 94, 95,201,195 /* 0x 5f0 */
}; };
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -28,8 +28,8 @@
#define LINUX_I386SH_FOLD_SIZE 1194 #define LINUX_I386SH_FOLD_SIZE 1194
#define LINUX_I386SH_FOLD_ADLER32 0x63b3f90a #define LINUX_I386SH_FOLD_ADLER32 0xbb9cf7de
#define LINUX_I386SH_FOLD_CRC32 0xe2bc019d #define LINUX_I386SH_FOLD_CRC32 0xd5a101a8
unsigned char linux_i386sh_fold[1194] = { unsigned char linux_i386sh_fold[1194] = {
127, 69, 76, 70, 1, 1, 1, 0, 76,105,110,117,120, 0, 0, 0, /* 0x 0 */ 127, 69, 76, 70, 1, 1, 1, 0, 76,105,110,117,120, 0, 0, 0, /* 0x 0 */
@@ -42,8 +42,8 @@ unsigned char linux_i386sh_fold[1194] = {
0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */ 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */
137,230,129,236, 80, 1, 0, 0,137,231,173,171,133,192,117,250, /* 0x 80 */ 137,230,129,236, 80, 1, 0, 0,137,231,173,171,133,192,117,250, /* 0x 80 */
173,171,133,192,117,250, 87, 64,106, 82, 89,243,171, 72,171,171, /* 0x 90 */ 173,171,133,192,117,250, 87, 64,106, 82, 89,243,171, 72,171,171, /* 0x 90 */
95,173,133,192,145,173,116, 15,131,249, 42,115,244,137, 76,207, /* 0x a0 */ 95,173,133,192,145,173,116, 15,131,249, 42,115,244,137, 76, 57, /* 0x a0 */
248,137, 68,207,252,235,234,129,236, 0, 10, 0, 0,147,139, 10, /* 0x b0 */ 248,137, 68, 57,252,235,234,129,236, 0, 10, 0, 0,147,139, 10, /* 0x b0 */
139, 90, 4,137,198, 96,232,123, 2, 0, 0, 89, 80, 97,129,196, /* 0x c0 */ 139, 90, 4,137,198, 96,232,123, 2, 0, 0, 89, 80, 97,129,196, /* 0x c0 */
0, 10, 0, 0, 89, 90, 82, 65, 86,131,238, 3,102,199, 6, 45, /* 0x d0 */ 0, 10, 0, 0, 89, 90, 82, 65, 86,131,238, 3,102,199, 6, 45, /* 0x d0 */
99, 65, 86, 65, 82, 81, 87,141,188, 36, 0,245,255,255, 96,137, /* 0x e0 */ 99, 65, 86, 65, 82, 81, 87,141,188, 36, 0,245,255,255, 96,137, /* 0x e0 */
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2713 -1457
View File
File diff suppressed because it is too large Load Diff
+158
View File
@@ -0,0 +1,158 @@
/*
; lzma_d.ash -- 32-bit assembly
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 2006-2006 Markus Franz Xaver Johannes Oberhumer
; All Rights Reserved.
;
; UPX and the UCL library are free software; you can redistribute them
; and/or modify them under the terms of the GNU General Public License as
; published by the Free Software Foundation; either version 2 of
; the License, 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; see the file COPYING.
; If not, write to the Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; Markus F.X.J. Oberhumer
; <markus@oberhumer.com>
; http://www.oberhumer.com/opensource/upx/
;
; ------------- DECOMPRESSION -------------
; Input:
; esi - source
; edi - dest
; cld
; Output:
; eax - 0
; ecx - 0
*/
// CPU 386
//
// init
section LZMA_DEC00
// ebx = alloca('UPXa');
mov ebp, esp // save stack
lea ebx, [esp + UPXa]
xor eax, eax
.clearstack1:
push eax
cmp esp, ebx
jnz .clearstack1
inc esi // skip 2 bytes for properties
inc esi
push ebx // &outSizeProcessed
push UPXb // outSize
push edi // out
add ebx, 4
push ebx // &inSizeProcessed
push UPXc // inSize
push esi // in
add ebx, 4
push ebx // &CLzmaDecoderState
push eax // dummy for call
// hardwired LzmaDecodeProperties()
mov dword ptr [ebx], offset UPXd // lc, lp, pb, dummy
section LZMA_ELF00
#define LZMA_BASE_SIZE 1846
#define LZMA_LIT_SIZE 768
#ifndef O_OUTS // ELF defines them, others do not care
#define O_OUTS 0
#define O_INS 0
#endif
mov ebp, esp // save stack
mov edx,[O_INS + ebp] // inSize
lodsb // first byte, replaces LzmaDecodeProperties()
dec edx
mov cl,al // cl= ((lit_context_bits + lit_pos_bits)<<3) | pos_bits
and al,7 // al= pos_bits
shr cl,3 // cl= lit_context_bits + lit_pos_bits
mov ebx, -LZMA_LIT_SIZE
shl ebx,cl
// inSizeProcessed, outSizeProcessed, *_bits, CLzmaDecoderState
lea ebx,[0 -(2*4 +4) - 2*LZMA_BASE_SIZE + 2*ebx + esp]
and ebx, (~0<<5) // 32-byte align
.elf_clearstack1:
push 0
cmp esp,ebx
jne .elf_clearstack1
push ebx // &outSizeProcessed
add ebx, 4
mov ecx,[O_OUTS + ebp] // &outSize
push dword [ecx] // outSize
push edi // out
push ebx // &inSizeProcessed
add ebx, 4
mov [2+ ebx],al // store pos_bits
lodsb // second byte, replaces LzmaDecodeProperties()
dec edx
mov cl,al // cl= (lit_pos_bits<<4) | lit_context_bits
and al,0xf
mov [ ebx],al // store lit_context_bits
shr cl,4
mov [1+ ebx],cl // store lit_pos_bits
push edx // inSize -2
push esi // in
push ebx // &CLzmaDecoderState
push eax // return address slot (dummy CALL)
section LZMA_DEC10
#include "lzma_d_cs_2.ash"
section LZMA_DEC20
#include "lzma_d_cf_2.ash"
//
// cleanup
section LZMA_DEC30
add esi, [ebx - 4] // inSizeProcessed
add edi, [ebx - 8] // outSizeProcessed
xor eax, eax
lea ecx, [esp - 256]
mov esp, ebp // restore stack
.clearstack2:
push eax
cmp esp, ecx
jnz .clearstack2
mov esp, ebp // restore stack
xor ecx, ecx
// vi:ts=8:et
+169
View File
@@ -0,0 +1,169 @@
db 85, 87, 86, 83,131,236,124,139,148, 36,144, 0, 0, 0,199, 68 // 0x0000
db 36,116, 0, 0, 0, 0,198, 68, 36,115, 0,139,172, 36,156, 0 // 0x0010
db 0, 0,141, 66, 4,137, 68, 36,120,184, 1, 0, 0, 0, 15,182 // 0x0020
db 74, 2,137,195,211,227,137,217, 73,137, 76, 36,108, 15,182, 74 // 0x0030
db 1,211,224, 72,137, 68, 36,104,139,132, 36,168, 0, 0, 0, 15 // 0x0040
db 182, 50,199, 69, 0, 0, 0, 0, 0,199, 68, 36, 96, 0, 0, 0 // 0x0050
db 0,199, 0, 0, 0, 0, 0,184, 0, 3, 0, 0,137,116, 36,100 // 0x0060
db 199, 68, 36, 92, 1, 0, 0, 0,199, 68, 36, 88, 1, 0, 0, 0 // 0x0070
db 199, 68, 36, 84, 1, 0, 0, 0,199, 68, 36, 80, 1, 0, 0, 0 // 0x0080
db 15,182, 74, 1, 1,241,211,224,141,136, 54, 7, 0, 0, 57, 76 // 0x0090
db 36,116,115, 14,139, 68, 36,120,102,199, 0, 0, 4,131,192, 2 // 0x00a0
db 226,246,139,156, 36,148, 0, 0, 0, 49,255,199, 68, 36, 72,255 // 0x00b0
db 255,255,255,137,218, 3,148, 36,152, 0, 0, 0,137, 84, 36, 76 // 0x00c0
db 49,210, 59, 92, 36, 76, 15,132,124, 9, 0, 0, 15,182, 3,193 // 0x00d0
db 231, 8, 66, 67, 9,199,131,250, 4,126,231,139,140, 36,164, 0 // 0x00e0
db 0, 0, 57, 76, 36,116, 15,131,100, 9, 0, 0,139,116, 36,116 // 0x00f0
db 35,116, 36,108,139, 68, 36, 96,139, 84, 36,120,193,224, 4,137 // 0x0100
db 116, 36, 68, 1,240,129,124, 36, 72,255,255,255, 0,141, 44, 66 // 0x0110
db 119, 24, 59, 92, 36, 76, 15,132, 44, 9, 0, 0,193,100, 36, 72 // 0x0120
db 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72,102,139 // 0x0130
db 85, 0,193,232, 11, 15,183,202, 15,175,193, 57,199, 15,131,221 // 0x0140
db 1, 0, 0,137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,138, 76 // 0x0150
db 36,100,193,248, 5,190, 1, 0, 0, 0,141, 4, 2, 15,182, 84 // 0x0160
db 36,115,102,137, 69, 0,139, 68, 36,116, 35, 68, 36,104,139,108 // 0x0170
db 36,120,211,224,185, 8, 0, 0, 0, 43, 76, 36,100,211,250, 1 // 0x0180
db 208,105,192, 0, 6, 0, 0,131,124, 36, 96, 6,141,132, 5,108 // 0x0190
db 14, 0, 0,137, 68, 36, 20, 15,142,202, 0, 0, 0,139, 68, 36 // 0x01a0
db 116, 43, 68, 36, 92,139,148, 36,160, 0, 0, 0, 15,182, 4, 2 // 0x01b0
db 137, 68, 36, 64,209,100, 36, 64,139, 76, 36, 64,141, 20, 54,139 // 0x01c0
db 108, 36, 20,129,225, 0, 1, 0, 0,129,124, 36, 72,255,255,255 // 0x01d0
db 0,141, 68, 77, 0,137, 76, 36, 60,141, 44, 16,119, 24, 59, 92 // 0x01e0
db 36, 76, 15,132, 96, 8, 0, 0,193,100, 36, 72, 8, 15,182, 3 // 0x01f0
db 193,231, 8, 67, 9,199,139, 68, 36, 72,102,139,141, 0, 2, 0 // 0x0200
db 0,193,232, 11, 15,183,241, 15,175,198, 57,199,115, 35,137, 68 // 0x0210
db 36, 72,184, 0, 8, 0, 0, 41,240,137,214,193,248, 5,131,124 // 0x0220
db 36, 60, 0,141, 4, 1,102,137,133, 0, 2, 0, 0,116, 34,235 // 0x0230
db 46, 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5 // 0x0240
db 102, 41,193,131,124, 36, 60, 0,102,137,141, 0, 2, 0, 0,116 // 0x0250
db 14,129,254,255, 0, 0, 0, 15,142, 87,255,255,255,235,121,129 // 0x0260
db 254,255, 0, 0, 0,127,113,141, 20, 54,139,108, 36, 20, 1,213 // 0x0270
db 129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132 // 0x0280
db 196, 7, 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67 // 0x0290
db 9,199,139, 68, 36, 72,102,139, 77, 0,193,232, 11, 15,183,241 // 0x02a0
db 15,175,198, 57,199,115, 25,137, 68, 36, 72,184, 0, 8, 0, 0 // 0x02b0
db 41,240,137,214,193,248, 5,141, 4, 1,102,137, 69, 0,235,159 // 0x02c0
db 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5,102 // 0x02d0
db 41,193,102,137, 77, 0,235,135,139, 84, 36,116,137,240,139,140 // 0x02e0
db 36,160, 0, 0, 0,136, 68, 36,115,136, 4, 10, 66,131,124, 36 // 0x02f0
db 96, 3,137, 84, 36,116,127, 13,199, 68, 36, 96, 0, 0, 0, 0 // 0x0300
db 233, 27, 7, 0, 0,131,124, 36, 96, 9,127, 10,131,108, 36, 96 // 0x0310
db 3,233, 10, 7, 0, 0,131,108, 36, 96, 6,233, 0, 7, 0, 0 // 0x0320
db 139, 76, 36, 72, 41,199,139,116, 36, 96, 41,193,137,208,102,193 // 0x0330
db 232, 5,102, 41,194,129,249,255,255,255, 0,102,137, 85, 0,139 // 0x0340
db 108, 36,120,141,116,117, 0,137,116, 36, 56,119, 22, 59, 92, 36 // 0x0350
db 76, 15,132,241, 6, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x0360
db 67, 9,199,139,108, 36, 56,137,200,193,232, 11,102,139,149,128 // 0x0370
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 82,137,198,184 // 0x0380
db 0, 8, 0, 0, 41,232,139,108, 36, 88,193,248, 5,139, 76, 36 // 0x0390
db 84,141, 4, 2,139, 84, 36, 56,137, 76, 36, 80,139, 76, 36,120 // 0x03a0
db 102,137,130,128, 1, 0, 0,139, 68, 36, 92,137,108, 36, 84,137 // 0x03b0
db 68, 36, 88, 49,192,131,124, 36, 96, 6, 15,159,192,129,193,100 // 0x03c0
db 6, 0, 0,141, 4, 64,137, 68, 36, 96,233,116, 2, 0, 0,137 // 0x03d0
db 206, 41,199, 41,198,137,208,102,193,232, 5,139, 76, 36, 56,102 // 0x03e0
db 41,194,129,254,255,255,255, 0,102,137,145,128, 1, 0, 0,119 // 0x03f0
db 22, 59, 92, 36, 76, 15,132, 77, 6, 0, 0, 15,182, 3,193,231 // 0x0400
db 8,193,230, 8, 67, 9,199,139,108, 36, 56,137,242,193,234, 11 // 0x0410
db 102,139,141,152, 1, 0, 0, 15,183,193, 15,175,208, 57,215, 15 // 0x0420
db 131,227, 0, 0, 0,189, 0, 8, 0, 0,137,214, 41,197,199, 68 // 0x0430
db 36, 52, 0, 8, 0, 0,137,232,193,248, 5,141, 4, 1,139, 76 // 0x0440
db 36, 56,102,137,129,152, 1, 0, 0,139, 68, 36, 96,139, 76, 36 // 0x0450
db 68,193,224, 5, 3, 68, 36,120,129,250,255,255,255, 0,141, 44 // 0x0460
db 72,119, 22, 59, 92, 36, 76, 15,132,219, 5, 0, 0, 15,182, 3 // 0x0470
db 193,231, 8,193,230, 8, 67, 9,199,102,139,149,224, 1, 0, 0 // 0x0480
db 137,240,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 96, 41 // 0x0490
db 76, 36, 52,193,124, 36, 52, 5,139,116, 36, 52,137, 68, 36, 72 // 0x04a0
db 131,124, 36,116, 0,141, 4, 50,102,137,133,224, 1, 0, 0, 15 // 0x04b0
db 132,147, 5, 0, 0, 49,192,131,124, 36, 96, 6,139,172, 36,160 // 0x04c0
db 0, 0, 0,139, 84, 36,116, 15,159,192,141, 68, 0, 9,137, 68 // 0x04d0
db 36, 96,139, 68, 36,116, 43, 68, 36, 92,138, 68, 5, 0,136, 68 // 0x04e0
db 36,115,136, 4, 42, 66,137, 84, 36,116,233, 49, 5, 0, 0, 41 // 0x04f0
db 198, 41,199,137,208,102,193,232, 5,102, 41,194,102,137,149,224 // 0x0500
db 1, 0, 0,233, 31, 1, 0, 0,137,200, 41,214,102,193,232, 5 // 0x0510
db 139,108, 36, 56,102, 41,193, 41,215,129,254,255,255,255, 0,102 // 0x0520
db 137,141,152, 1, 0, 0,119, 22, 59, 92, 36, 76, 15,132, 22, 5 // 0x0530
db 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199,139, 76 // 0x0540
db 36, 56,137,240,193,232, 11,102,139,145,176, 1, 0, 0, 15,183 // 0x0550
db 202, 15,175,193, 57,199,115, 35,137,198,184, 0, 8, 0, 0, 41 // 0x0560
db 200,139,108, 36, 56,193,248, 5,141, 4, 2,102,137,133,176, 1 // 0x0570
db 0, 0,139, 68, 36, 88,233,160, 0, 0, 0,137,241, 41,199, 41 // 0x0580
db 193,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56,129,249 // 0x0590
db 255,255,255, 0,102,137,144,176, 1, 0, 0,119, 22, 59, 92, 36 // 0x05a0
db 76, 15,132,161, 4, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x05b0
db 67, 9,199,139,116, 36, 56,137,200,193,232, 11,102,139,150,200 // 0x05c0
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 32,137,198,184 // 0x05d0
db 0, 8, 0, 0, 41,232,139,108, 36, 56,193,248, 5,141, 4, 2 // 0x05e0
db 102,137,133,200, 1, 0, 0,139, 68, 36, 84,235, 38,137,206, 41 // 0x05f0
db 199, 41,198,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56 // 0x0600
db 102,137,144,200, 1, 0, 0,139, 84, 36, 84,139, 68, 36, 80,137 // 0x0610
db 84, 36, 80,139, 76, 36, 88,137, 76, 36, 84,139,108, 36, 92,137 // 0x0620
db 68, 36, 92,137,108, 36, 88, 49,192,131,124, 36, 96, 6,139, 76 // 0x0630
db 36,120, 15,159,192,129,193,104, 10, 0, 0,141, 68, 64, 8,137 // 0x0640
db 68, 36, 96,129,254,255,255,255, 0,119, 22, 59, 92, 36, 76, 15 // 0x0650
db 132,243, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9 // 0x0660
db 199,102,139, 17,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x0670
db 199,115, 47,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x0680
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 0, 0, 0, 0,141, 4 // 0x0690
db 2,102,137, 1,139, 68, 36, 68,141, 76, 1, 4,137, 76, 36, 16 // 0x06a0
db 235,114, 41,198, 41,199,137,208,102,193,232, 5,102, 41,194,129 // 0x06b0
db 254,255,255,255, 0,102,137, 17,119, 22, 59, 92, 36, 76, 15,132 // 0x06c0
db 132, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199 // 0x06d0
db 102,139, 81, 2,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x06e0
db 199,115, 59,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x06f0
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 8, 0, 0, 0,141, 4 // 0x0700
db 2,139, 84, 36, 68,102,137, 65, 2,141,140, 17, 4, 1, 0, 0 // 0x0710
db 137, 76, 36, 16,199, 68, 36, 48, 3, 0, 0, 0,235, 47, 41,198 // 0x0720
db 41,199,137,208,137,116, 36, 72,102,193,232, 5,199, 68, 36, 44 // 0x0730
db 16, 0, 0, 0,102, 41,194,199, 68, 36, 48, 8, 0, 0, 0,102 // 0x0740
db 137, 81, 2,129,193, 4, 2, 0, 0,137, 76, 36, 16,139, 76, 36 // 0x0750
db 48,186, 1, 0, 0, 0,137, 76, 36, 40,141, 44, 18,139,116, 36 // 0x0760
db 16, 1,238,129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36 // 0x0770
db 76, 15,132,209, 2, 0, 0,193,100, 36, 72, 8, 15,182, 3,193 // 0x0780
db 231, 8, 67, 9,199,139, 68, 36, 72,102,139, 22,193,232, 11, 15 // 0x0790
db 183,202, 15,175,193, 57,199,115, 24,137, 68, 36, 72,184, 0, 8 // 0x07a0
db 0, 0, 41,200,193,248, 5,141, 4, 2,137,234,102,137, 6,235 // 0x07b0
db 21, 41, 68, 36, 72, 41,199,137,208,102,193,232, 5,102, 41,194 // 0x07c0
db 102,137, 22,141, 85, 1,139,116, 36, 40, 78,137,116, 36, 40,117 // 0x07d0
db 137,138, 76, 36, 48,184, 1, 0, 0, 0,211,224, 41,194, 3, 84 // 0x07e0
db 36, 44,131,124, 36, 96, 3,137, 84, 36, 12, 15,143,231, 1, 0 // 0x07f0
db 0,131, 68, 36, 96, 7,131,250, 3,137,208,126, 5,184, 3, 0 // 0x0800
db 0, 0,139,116, 36,120,193,224, 7,199, 68, 36, 36, 6, 0, 0 // 0x0810
db 0,141,132, 6, 96, 3, 0, 0,137, 68, 36, 8,184, 1, 0, 0 // 0x0820
db 0,141, 44, 0,139,116, 36, 8, 1,238,129,124, 36, 72,255,255 // 0x0830
db 255, 0,119, 24, 59, 92, 36, 76, 15,132, 10, 2, 0, 0,193,100 // 0x0840
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0850
db 102,139, 22,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 24 // 0x0860
db 137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4 // 0x0870
db 2,102,137, 6,137,232,235, 21, 41, 68, 36, 72, 41,199,137,208 // 0x0880
db 102,193,232, 5,102, 41,194,141, 69, 1,102,137, 22,139,108, 36 // 0x0890
db 36, 77,137,108, 36, 36,117,137,141, 80,192,131,250, 3,137, 20 // 0x08a0
db 36, 15,142, 39, 1, 0, 0,137,208,137,214,209,248,131,230, 1 // 0x08b0
db 141, 72,255,131,206, 2,131,250, 13,137, 76, 36, 32,127, 28,139 // 0x08c0
db 108, 36,120,211,230, 1,210,137, 52, 36,141, 68,117, 0, 41,208 // 0x08d0
db 5, 94, 5, 0, 0,137, 68, 36, 4,235, 86,141, 80,251,129,124 // 0x08e0
db 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132, 86, 1 // 0x08f0
db 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199 // 0x0900
db 209,108, 36, 72, 1,246, 59,124, 36, 72,114, 7, 43,124, 36, 72 // 0x0910
db 131,206, 1, 74,117,200,139, 68, 36,120,193,230, 4,137, 52, 36 // 0x0920
db 5, 68, 6, 0, 0,199, 68, 36, 32, 4, 0, 0, 0,137, 68, 36 // 0x0930
db 4,199, 68, 36, 28, 1, 0, 0, 0,184, 1, 0, 0, 0,139,108 // 0x0940
db 36, 4, 1,192,137, 68, 36, 24, 1,197,129,124, 36, 72,255,255 // 0x0950
db 255, 0,119, 24, 59, 92, 36, 76, 15,132,234, 0, 0, 0,193,100 // 0x0960
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0970
db 102,139, 85, 0,193,232, 11, 15,183,242, 15,175,198, 57,199,115 // 0x0980
db 27,137, 68, 36, 72,184, 0, 8, 0, 0, 41,240,193,248, 5,141 // 0x0990
db 4, 2,102,137, 69, 0,139, 68, 36, 24,235, 31, 41, 68, 36, 72 // 0x09a0
db 41,199,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 24,102 // 0x09b0
db 137, 85, 0,139, 84, 36, 28, 64, 9, 20, 36,139, 76, 36, 32,209 // 0x09c0
db 100, 36, 28, 73,137, 76, 36, 32, 15,133,112,255,255,255,139, 52 // 0x09d0
db 36, 70,137,116, 36, 92,116, 89,139, 76, 36, 12,139,108, 36,116 // 0x09e0
db 131,193, 2, 57,108, 36, 92,119, 95,139,132, 36,160, 0, 0, 0 // 0x09f0
db 137,234, 43, 68, 36, 92, 3,148, 36,160, 0, 0, 0,141, 52, 40 // 0x0a00
db 138, 6, 70,136, 68, 36,115,136, 2, 66,255, 68, 36,116, 73,116 // 0x0a10
db 15,139,172, 36,164, 0, 0, 0, 57,108, 36,116,114,226,235, 17 // 0x0a20
db 139,132, 36,164, 0, 0, 0, 57, 68, 36,116, 15,130,187,246,255 // 0x0a30
db 255,129,124, 36, 72,255,255,255, 0,119, 21, 59, 92, 36, 76,184 // 0x0a40
db 1, 0, 0, 0,116, 41,235, 7,184, 1, 0, 0, 0,235, 32, 67 // 0x0a50
db 43,156, 36,148, 0, 0, 0, 49,192,139,148, 36,156, 0, 0, 0 // 0x0a60
db 139, 76, 36,116,137, 26,139,156, 36,168, 0, 0, 0,137, 11,131 // 0x0a70
db 196,124, 91, 94, 95, 93 // 0x0a80
+169
View File
@@ -0,0 +1,169 @@
db 85, 87, 86, 83,131,236,124,139,148, 36,144, 0, 0, 0,199, 68 // 0x0000
db 36,116, 0, 0, 0, 0,198, 68, 36,115, 0,139,172, 36,156, 0 // 0x0010
db 0, 0,141, 66, 4,137, 68, 36,120,184, 1, 0, 0, 0, 15,182 // 0x0020
db 74, 2,137,195,211,227,137,217, 73,137, 76, 36,108, 15,182, 74 // 0x0030
db 1,211,224, 72,137, 68, 36,104,139,132, 36,168, 0, 0, 0, 15 // 0x0040
db 182, 50,199, 69, 0, 0, 0, 0, 0,199, 68, 36, 96, 0, 0, 0 // 0x0050
db 0,199, 0, 0, 0, 0, 0,184, 0, 3, 0, 0,137,116, 36,100 // 0x0060
db 199, 68, 36, 92, 1, 0, 0, 0,199, 68, 36, 88, 1, 0, 0, 0 // 0x0070
db 199, 68, 36, 84, 1, 0, 0, 0,199, 68, 36, 80, 1, 0, 0, 0 // 0x0080
db 15,182, 74, 1, 1,241,211,224,141,136, 54, 7, 0, 0, 57, 76 // 0x0090
db 36,116,115, 14,139, 68, 36,120,102,199, 0, 0, 4,131,192, 2 // 0x00a0
db 226,246,139,156, 36,148, 0, 0, 0, 49,255,199, 68, 36, 72,255 // 0x00b0
db 255,255,255,137,218, 3,148, 36,152, 0, 0, 0,137, 84, 36, 76 // 0x00c0
db 49,210, 59, 92, 36, 76, 15,132,124, 9, 0, 0, 15,182, 3,193 // 0x00d0
db 231, 8, 66, 67, 9,199,131,250, 4,126,231,139,140, 36,164, 0 // 0x00e0
db 0, 0, 57, 76, 36,116, 15,131,100, 9, 0, 0,139,116, 36,116 // 0x00f0
db 35,116, 36,108,139, 68, 36, 96,139, 84, 36,120,193,224, 4,137 // 0x0100
db 116, 36, 68, 1,240,129,124, 36, 72,255,255,255, 0,141, 44, 66 // 0x0110
db 119, 24, 59, 92, 36, 76, 15,132, 44, 9, 0, 0,193,100, 36, 72 // 0x0120
db 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72,102,139 // 0x0130
db 85, 0,193,232, 11, 15,183,202, 15,175,193, 57,199, 15,131,221 // 0x0140
db 1, 0, 0,137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,138, 76 // 0x0150
db 36,100,193,248, 5,190, 1, 0, 0, 0,141, 4, 2, 15,182, 84 // 0x0160
db 36,115,102,137, 69, 0,139, 68, 36,116, 35, 68, 36,104,139,108 // 0x0170
db 36,120,211,224,185, 8, 0, 0, 0, 43, 76, 36,100,211,250, 1 // 0x0180
db 208,105,192, 0, 6, 0, 0,131,124, 36, 96, 6,141,132, 5,108 // 0x0190
db 14, 0, 0,137, 68, 36, 20, 15,142,202, 0, 0, 0,139, 68, 36 // 0x01a0
db 116, 43, 68, 36, 92,139,148, 36,160, 0, 0, 0, 15,182, 4, 2 // 0x01b0
db 137, 68, 36, 64,209,100, 36, 64,139, 76, 36, 64,141, 20, 54,139 // 0x01c0
db 108, 36, 20,129,225, 0, 1, 0, 0,129,124, 36, 72,255,255,255 // 0x01d0
db 0,141, 68, 77, 0,137, 76, 36, 60,141, 44, 16,119, 24, 59, 92 // 0x01e0
db 36, 76, 15,132, 96, 8, 0, 0,193,100, 36, 72, 8, 15,182, 3 // 0x01f0
db 193,231, 8, 67, 9,199,139, 68, 36, 72,102,139,141, 0, 2, 0 // 0x0200
db 0,193,232, 11, 15,183,241, 15,175,198, 57,199,115, 35,137, 68 // 0x0210
db 36, 72,184, 0, 8, 0, 0, 41,240,137,214,193,248, 5,131,124 // 0x0220
db 36, 60, 0,141, 4, 1,102,137,133, 0, 2, 0, 0,116, 34,235 // 0x0230
db 46, 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5 // 0x0240
db 102, 41,193,131,124, 36, 60, 0,102,137,141, 0, 2, 0, 0,116 // 0x0250
db 14,129,254,255, 0, 0, 0, 15,142, 87,255,255,255,235,121,129 // 0x0260
db 254,255, 0, 0, 0,127,113,141, 20, 54,139,108, 36, 20, 1,213 // 0x0270
db 129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132 // 0x0280
db 196, 7, 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67 // 0x0290
db 9,199,139, 68, 36, 72,102,139, 77, 0,193,232, 11, 15,183,241 // 0x02a0
db 15,175,198, 57,199,115, 25,137, 68, 36, 72,184, 0, 8, 0, 0 // 0x02b0
db 41,240,137,214,193,248, 5,141, 4, 1,102,137, 69, 0,235,159 // 0x02c0
db 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5,102 // 0x02d0
db 41,193,102,137, 77, 0,235,135,139, 84, 36,116,137,240,139,140 // 0x02e0
db 36,160, 0, 0, 0,136, 68, 36,115,136, 4, 10, 66,131,124, 36 // 0x02f0
db 96, 3,137, 84, 36,116,127, 13,199, 68, 36, 96, 0, 0, 0, 0 // 0x0300
db 233, 27, 7, 0, 0,131,124, 36, 96, 9,127, 10,131,108, 36, 96 // 0x0310
db 3,233, 10, 7, 0, 0,131,108, 36, 96, 6,233, 0, 7, 0, 0 // 0x0320
db 139, 76, 36, 72, 41,199,139,116, 36, 96, 41,193,137,208,102,193 // 0x0330
db 232, 5,102, 41,194,129,249,255,255,255, 0,102,137, 85, 0,139 // 0x0340
db 108, 36,120,141,116,117, 0,137,116, 36, 56,119, 22, 59, 92, 36 // 0x0350
db 76, 15,132,241, 6, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x0360
db 67, 9,199,139,108, 36, 56,137,200,193,232, 11,102,139,149,128 // 0x0370
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 82,137,198,184 // 0x0380
db 0, 8, 0, 0, 41,232,139,108, 36, 88,193,248, 5,139, 76, 36 // 0x0390
db 84,141, 4, 2,139, 84, 36, 56,137, 76, 36, 80,139, 76, 36,120 // 0x03a0
db 102,137,130,128, 1, 0, 0,139, 68, 36, 92,137,108, 36, 84,137 // 0x03b0
db 68, 36, 88, 49,192,131,124, 36, 96, 6, 15,159,192,129,193,100 // 0x03c0
db 6, 0, 0,141, 4, 64,137, 68, 36, 96,233,116, 2, 0, 0,137 // 0x03d0
db 206, 41,199, 41,198,137,208,102,193,232, 5,139, 76, 36, 56,102 // 0x03e0
db 41,194,129,254,255,255,255, 0,102,137,145,128, 1, 0, 0,119 // 0x03f0
db 22, 59, 92, 36, 76, 15,132, 77, 6, 0, 0, 15,182, 3,193,231 // 0x0400
db 8,193,230, 8, 67, 9,199,139,108, 36, 56,137,242,193,234, 11 // 0x0410
db 102,139,141,152, 1, 0, 0, 15,183,193, 15,175,208, 57,215, 15 // 0x0420
db 131,227, 0, 0, 0,189, 0, 8, 0, 0,137,214, 41,197,199, 68 // 0x0430
db 36, 52, 0, 8, 0, 0,137,232,193,248, 5,141, 4, 1,139, 76 // 0x0440
db 36, 56,102,137,129,152, 1, 0, 0,139, 68, 36, 96,139, 76, 36 // 0x0450
db 68,193,224, 5, 3, 68, 36,120,129,250,255,255,255, 0,141, 44 // 0x0460
db 72,119, 22, 59, 92, 36, 76, 15,132,219, 5, 0, 0, 15,182, 3 // 0x0470
db 193,231, 8,193,230, 8, 67, 9,199,102,139,149,224, 1, 0, 0 // 0x0480
db 137,240,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 96, 41 // 0x0490
db 76, 36, 52,193,124, 36, 52, 5,139,116, 36, 52,137, 68, 36, 72 // 0x04a0
db 131,124, 36,116, 0,141, 4, 50,102,137,133,224, 1, 0, 0, 15 // 0x04b0
db 132,147, 5, 0, 0, 49,192,131,124, 36, 96, 6,139,172, 36,160 // 0x04c0
db 0, 0, 0,139, 84, 36,116, 15,159,192,141, 68, 0, 9,137, 68 // 0x04d0
db 36, 96,139, 68, 36,116, 43, 68, 36, 92,138, 68, 5, 0,136, 68 // 0x04e0
db 36,115,136, 4, 42, 66,137, 84, 36,116,233, 49, 5, 0, 0, 41 // 0x04f0
db 198, 41,199,137,208,102,193,232, 5,102, 41,194,102,137,149,224 // 0x0500
db 1, 0, 0,233, 31, 1, 0, 0,137,200, 41,214,102,193,232, 5 // 0x0510
db 139,108, 36, 56,102, 41,193, 41,215,129,254,255,255,255, 0,102 // 0x0520
db 137,141,152, 1, 0, 0,119, 22, 59, 92, 36, 76, 15,132, 22, 5 // 0x0530
db 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199,139, 76 // 0x0540
db 36, 56,137,240,193,232, 11,102,139,145,176, 1, 0, 0, 15,183 // 0x0550
db 202, 15,175,193, 57,199,115, 35,137,198,184, 0, 8, 0, 0, 41 // 0x0560
db 200,139,108, 36, 56,193,248, 5,141, 4, 2,102,137,133,176, 1 // 0x0570
db 0, 0,139, 68, 36, 88,233,160, 0, 0, 0,137,241, 41,199, 41 // 0x0580
db 193,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56,129,249 // 0x0590
db 255,255,255, 0,102,137,144,176, 1, 0, 0,119, 22, 59, 92, 36 // 0x05a0
db 76, 15,132,161, 4, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x05b0
db 67, 9,199,139,116, 36, 56,137,200,193,232, 11,102,139,150,200 // 0x05c0
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 32,137,198,184 // 0x05d0
db 0, 8, 0, 0, 41,232,139,108, 36, 56,193,248, 5,141, 4, 2 // 0x05e0
db 102,137,133,200, 1, 0, 0,139, 68, 36, 84,235, 38,137,206, 41 // 0x05f0
db 199, 41,198,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56 // 0x0600
db 102,137,144,200, 1, 0, 0,139, 84, 36, 84,139, 68, 36, 80,137 // 0x0610
db 84, 36, 80,139, 76, 36, 88,137, 76, 36, 84,139,108, 36, 92,137 // 0x0620
db 68, 36, 92,137,108, 36, 88, 49,192,131,124, 36, 96, 6,139, 76 // 0x0630
db 36,120, 15,159,192,129,193,104, 10, 0, 0,141, 68, 64, 8,137 // 0x0640
db 68, 36, 96,129,254,255,255,255, 0,119, 22, 59, 92, 36, 76, 15 // 0x0650
db 132,243, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9 // 0x0660
db 199,102,139, 17,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x0670
db 199,115, 47,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x0680
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 0, 0, 0, 0,141, 4 // 0x0690
db 2,102,137, 1,139, 68, 36, 68,141, 76, 1, 4,137, 76, 36, 16 // 0x06a0
db 235,114, 41,198, 41,199,137,208,102,193,232, 5,102, 41,194,129 // 0x06b0
db 254,255,255,255, 0,102,137, 17,119, 22, 59, 92, 36, 76, 15,132 // 0x06c0
db 132, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199 // 0x06d0
db 102,139, 81, 2,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x06e0
db 199,115, 59,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x06f0
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 8, 0, 0, 0,141, 4 // 0x0700
db 2,139, 84, 36, 68,102,137, 65, 2,141,140, 17, 4, 1, 0, 0 // 0x0710
db 137, 76, 36, 16,199, 68, 36, 48, 3, 0, 0, 0,235, 47, 41,198 // 0x0720
db 41,199,137,208,137,116, 36, 72,102,193,232, 5,199, 68, 36, 44 // 0x0730
db 16, 0, 0, 0,102, 41,194,199, 68, 36, 48, 8, 0, 0, 0,102 // 0x0740
db 137, 81, 2,129,193, 4, 2, 0, 0,137, 76, 36, 16,139, 76, 36 // 0x0750
db 48,186, 1, 0, 0, 0,137, 76, 36, 40,141, 44, 18,139,116, 36 // 0x0760
db 16, 1,238,129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36 // 0x0770
db 76, 15,132,209, 2, 0, 0,193,100, 36, 72, 8, 15,182, 3,193 // 0x0780
db 231, 8, 67, 9,199,139, 68, 36, 72,102,139, 22,193,232, 11, 15 // 0x0790
db 183,202, 15,175,193, 57,199,115, 24,137, 68, 36, 72,184, 0, 8 // 0x07a0
db 0, 0, 41,200,193,248, 5,141, 4, 2,137,234,102,137, 6,235 // 0x07b0
db 21, 41, 68, 36, 72, 41,199,137,208,102,193,232, 5,102, 41,194 // 0x07c0
db 102,137, 22,141, 85, 1,139,116, 36, 40, 78,137,116, 36, 40,117 // 0x07d0
db 137,138, 76, 36, 48,184, 1, 0, 0, 0,211,224, 41,194, 3, 84 // 0x07e0
db 36, 44,131,124, 36, 96, 3,137, 84, 36, 12, 15,143,231, 1, 0 // 0x07f0
db 0,131, 68, 36, 96, 7,131,250, 3,137,208,126, 5,184, 3, 0 // 0x0800
db 0, 0,139,116, 36,120,193,224, 7,199, 68, 36, 36, 6, 0, 0 // 0x0810
db 0,141,132, 6, 96, 3, 0, 0,137, 68, 36, 8,184, 1, 0, 0 // 0x0820
db 0,141, 44, 0,139,116, 36, 8, 1,238,129,124, 36, 72,255,255 // 0x0830
db 255, 0,119, 24, 59, 92, 36, 76, 15,132, 10, 2, 0, 0,193,100 // 0x0840
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0850
db 102,139, 22,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 24 // 0x0860
db 137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4 // 0x0870
db 2,102,137, 6,137,232,235, 21, 41, 68, 36, 72, 41,199,137,208 // 0x0880
db 102,193,232, 5,102, 41,194,141, 69, 1,102,137, 22,139,108, 36 // 0x0890
db 36, 77,137,108, 36, 36,117,137,141, 80,192,131,250, 3,137, 20 // 0x08a0
db 36, 15,142, 39, 1, 0, 0,137,208,137,214,209,248,131,230, 1 // 0x08b0
db 141, 72,255,131,206, 2,131,250, 13,137, 76, 36, 32,127, 28,139 // 0x08c0
db 108, 36,120,211,230, 1,210,137, 52, 36,141, 68,117, 0, 41,208 // 0x08d0
db 5, 94, 5, 0, 0,137, 68, 36, 4,235, 86,141, 80,251,129,124 // 0x08e0
db 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132, 86, 1 // 0x08f0
db 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199 // 0x0900
db 209,108, 36, 72, 1,246, 59,124, 36, 72,114, 7, 43,124, 36, 72 // 0x0910
db 131,206, 1, 74,117,200,139, 68, 36,120,193,230, 4,137, 52, 36 // 0x0920
db 5, 68, 6, 0, 0,199, 68, 36, 32, 4, 0, 0, 0,137, 68, 36 // 0x0930
db 4,199, 68, 36, 28, 1, 0, 0, 0,184, 1, 0, 0, 0,139,108 // 0x0940
db 36, 4, 1,192,137, 68, 36, 24, 1,197,129,124, 36, 72,255,255 // 0x0950
db 255, 0,119, 24, 59, 92, 36, 76, 15,132,234, 0, 0, 0,193,100 // 0x0960
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0970
db 102,139, 85, 0,193,232, 11, 15,183,242, 15,175,198, 57,199,115 // 0x0980
db 27,137, 68, 36, 72,184, 0, 8, 0, 0, 41,240,193,248, 5,141 // 0x0990
db 4, 2,102,137, 69, 0,139, 68, 36, 24,235, 31, 41, 68, 36, 72 // 0x09a0
db 41,199,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 24,102 // 0x09b0
db 137, 85, 0,139, 84, 36, 28, 64, 9, 20, 36,139, 76, 36, 32,209 // 0x09c0
db 100, 36, 28, 73,137, 76, 36, 32, 15,133,112,255,255,255,139, 52 // 0x09d0
db 36, 70,137,116, 36, 92,116, 89,139, 76, 36, 12,139,108, 36,116 // 0x09e0
db 131,193, 2, 57,108, 36, 92,119, 95,139,132, 36,160, 0, 0, 0 // 0x09f0
db 137,234, 43, 68, 36, 92, 3,148, 36,160, 0, 0, 0,141, 52, 40 // 0x0a00
db 138, 6, 70,136, 68, 36,115,136, 2, 66,255, 68, 36,116, 73,116 // 0x0a10
db 15,139,172, 36,164, 0, 0, 0, 57,108, 36,116,114,226,235, 17 // 0x0a20
db 139,132, 36,164, 0, 0, 0, 57, 68, 36,116, 15,130,187,246,255 // 0x0a30
db 255,129,124, 36, 72,255,255,255, 0,119, 21, 59, 92, 36, 76,184 // 0x0a40
db 1, 0, 0, 0,116, 41,235, 7,184, 1, 0, 0, 0,235, 32, 67 // 0x0a50
db 43,156, 36,148, 0, 0, 0, 49,192,139,148, 36,156, 0, 0, 0 // 0x0a60
db 139, 76, 36,116,137, 26,139,156, 36,168, 0, 0, 0,137, 11,131 // 0x0a70
db 196,124, 91, 94, 95, 93 // 0x0a80
+192
View File
@@ -0,0 +1,192 @@
/*
; n2b_d32.ash -- ucl_nrv2b_decompress_le32 in 32-bit assembly
;
; This file is part of the UCL data compression library.
;
; Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
; All Rights Reserved.
;
; The UCL library 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 of
; the License, or (at your option) any later version.
;
; The UCL library 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 the UCL library; see the file COPYING.
; If not, write to the Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; Markus F.X.J. Oberhumer
; <markus@oberhumer.com>
; http://www.oberhumer.com/opensource/ucl/
;
; ------------- DECOMPRESSION -------------
; Input:
; esi - source
; edi - dest
; ebp - -1
; cld
; Output:
; eax - 0
; ecx - 0
*/
// CPU 386
.macro getbit_n2b one
.ifc \one, 1
add ebx, ebx
jnz 1f
.endif
mov ebx, [esi]
sub esi, byte -4
adc ebx, ebx
1:
.endm
#undef getbit
#define getbit getbit_n2b
section N2BSMA10
jmps dcl1_n2b
decompr_literals_n2b:
movsb
section N2BFAS10
jmps dcl1_n2b
.balign 8
section N2BFAS11
decompr_literalb_n2b:
mov al, [esi]
inc esi
mov [edi], al
inc edi
section N2BDEC10
decompr_loop_n2b:
add ebx, ebx
jnz dcl2_n2b
dcl1_n2b:
getbit 32
dcl2_n2b:
section N2BSMA20
jc decompr_literals_n2b
xor eax, eax
inc eax
section N2BFAS20
#ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif
jc decompr_literalb_n2b
mov eax, 1
section N2BDEC20
loop1_n2b:
getbit 1
adc eax, eax
section N2BSMA30
getbit 1
jnc loop1_n2b
section N2BFAS30
add ebx, ebx
jnc loop1_n2b
jnz loopend1_n2b
getbit 32
jnc loop1_n2b
loopend1_n2b:
section N2BDEC30
xor ecx, ecx
sub eax, 3
jb decompr_ebpeax_n2b
shl eax, 8
mov al, [esi]
inc esi
xor eax, -1
jz decompr_end_n2b
mov ebp, eax
decompr_ebpeax_n2b:
getbit 1
adc ecx, ecx
getbit 1
adc ecx, ecx
jnz decompr_got_mlen_n2b
inc ecx
loop2_n2b:
getbit 1
adc ecx, ecx
section N2BSMA40
getbit 1
jnc loop2_n2b
section N2BFAS40
add ebx, ebx
jnc loop2_n2b
jnz loopend2_n2b
getbit 32
jnc loop2_n2b
loopend2_n2b:
section N2BDUMM1
section N2BSMA50
inc ecx
inc ecx
section N2BFAS50
add ecx, 2
section N2BDEC50
decompr_got_mlen_n2b:
cmp ebp, -0xd00
adc ecx, 1
section N2BSMA60
#ifndef UPX102
push esi
#else
mov edx, esi
#endif
lea esi, [edi+ebp]
rep
movsb
#ifndef UPX102
pop esi
#else
mov esi, edx
#endif
jmp decompr_loop_n2b
section N2BFAS60
lea edx, [edi+ebp]
cmp ebp, -4
#ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif
jbe decompr_copy4_n2b
loop3_n2b:
mov al, [edx]
inc edx
mov [edi], al
inc edi
dec ecx
jnz loop3_n2b
jmp decompr_loop_n2b
section N2BFAS61
.balign 4
decompr_copy4_n2b:
mov eax, [edx]
add edx, 4
mov [edi], eax
add edi, 4
sub ecx, 4
ja decompr_copy4_n2b
add edi, ecx
jmp decompr_loop_n2b
section N2BDEC60
decompr_end_n2b:
section NRV2BEND
// vi:ts=8:et
+201
View File
@@ -0,0 +1,201 @@
/*
; n2d_d32.ash -- ucl_nrv2d_decompress_le32 in 32-bit assembly
;
; This file is part of the UCL data compression library.
;
; Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
; All Rights Reserved.
;
; The UCL library 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 of
; the License, or (at your option) any later version.
;
; The UCL library 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 the UCL library; see the file COPYING.
; If not, write to the Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; Markus F.X.J. Oberhumer
; <markus@oberhumer.com>
; http://www.oberhumer.com/opensource/ucl/
;
; ------------- DECOMPRESSION -------------
; Input:
; esi - source
; edi - dest
; ebp - -1
; cld
; Output:
; eax - 0
; ecx - 0
*/
// CPU 386
.macro getbit_n2d one
.ifc \one, 1
add ebx, ebx
jnz 1f
.endif
mov ebx, [esi]
sub esi, -4
adc ebx, ebx
1:
.endm
#undef getbit
#define getbit getbit_n2d
section N2DSMA10
jmps dcl1_n2d
decompr_literals_n2d:
movsb
section N2DFAS10
jmps dcl1_n2d
.balign 8
section N2DFAS11
decompr_literalb_n2d:
mov al, [esi]
inc esi
mov [edi], al
inc edi
section N2DDEC10
decompr_loop_n2d:
add ebx, ebx
jnz dcl2_n2d
dcl1_n2d:
getbit 32
dcl2_n2d:
section N2DSMA20
jc decompr_literals_n2d
xor eax, eax
inc eax
section N2DFAS20
#ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif
jc decompr_literalb_n2d
mov eax, 1
section N2DDEC20
loop1_n2d:
getbit 1
adc eax, eax
section N2DSMA30
getbit 1
jc loopend1_n2d
section N2DFAS30
add ebx, ebx
jnc loopcontinue1_n2d
jnz loopend1_n2d
getbit 32
jc loopend1_n2d
loopcontinue1_n2d:
section N2DDEC30
dec eax
getbit 1
adc eax, eax
jmps loop1_n2d
loopend1_n2d:
xor ecx, ecx
sub eax, 3
jb decompr_prev_dist_n2d
shl eax, 8
mov al, [esi]
inc esi
xor eax, -1
jz decompr_end_n2d
sar eax, 1 // shift low-bit into carry
mov ebp, eax
jmps decompr_ebpeax_n2d
decompr_prev_dist_n2d:
getbit 1
decompr_ebpeax_n2d:
adc ecx, ecx
getbit 1
adc ecx, ecx
jnz decompr_got_mlen_n2d
inc ecx
loop2_n2d:
getbit 1
adc ecx, ecx
section N2DSMA40
getbit 1
jnc loop2_n2d
section N2DFAS40
add ebx, ebx
jnc loop2_n2d
jnz loopend2_n2d
getbit 32
jnc loop2_n2d
loopend2_n2d:
section N2DDUMM1
section N2DSMA50
inc ecx
inc ecx
section N2DFAS50
add ecx, 2
section N2DDEC50
decompr_got_mlen_n2d:
cmp ebp, -0x500
adc ecx, 1
section N2DSMA60
#ifndef UPX102
push esi
#else
mov edx, esi
#endif
lea esi, [edi+ebp]
rep
movsb
#ifndef UPX102
pop esi
#else
mov esi, edx
#endif
jmp decompr_loop_n2d
section N2DFAS60
lea edx, [edi+ebp]
cmp ebp, -4
#ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif
jbe decompr_copy4_n2d
loop3_n2d:
mov al, [edx]
inc edx
mov [edi], al
inc edi
dec ecx
jnz loop3_n2d
jmp decompr_loop_n2d
section N2DFAS61
.balign 4
decompr_copy4_n2d:
mov eax, [edx]
add edx, 4
mov [edi], eax
add edi, 4
sub ecx, 4
ja decompr_copy4_n2d
add edi, ecx
jmp decompr_loop_n2d
section N2DDEC60
decompr_end_n2d:
section NRV2DEND
// vi:ts=8:et
+110 -115
View File
@@ -1,3 +1,4 @@
/*
; i386-BSD.elf-entry.asm -- BSD program entry point & decompressor (Elf binary) ; i386-BSD.elf-entry.asm -- BSD program entry point & decompressor (Elf binary)
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -28,24 +29,21 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
BITS 32 // CPU 386
SECTION .text
CPU 386
%define jmps jmp short
%define jmpn jmp near
; /************************************************************************* ; /*************************************************************************
; // program entry point ; // program entry point
; // see glibc/sysdeps/i386/elf/start.S ; // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/ ; **************************************************************************/
GLOBAL _start section LEXEC000
;__LEXEC000__ _start: .globl _start
_start: //// int3
;;;; int3 /*
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above. ;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date. ;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as ;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@@ -62,51 +60,52 @@ _start:
;; end ;; end
;; Step through the code; remember that <Enter> repeats the previous command. ;; Step through the code; remember that <Enter> repeats the previous command.
;; ;;
call main ; push address of decompress subroutine */
call main // push address of decompress subroutine
decompress: decompress:
; /************************************************************************* // /*************************************************************************
; // C callable decompressor // // C callable decompressor
; **************************************************************************/ // **************************************************************************/
; /* Offsets to parameters, allowing for {push + pusha + call} */ // /* Offsets to parameters, allowing for {push + pusha + call} */
%define O_INP (4+ 8*4 +1*4) #define O_INP (4+ 8*4 +1*4)
%define O_INS (4+ 8*4 +2*4) #define O_INS (4+ 8*4 +2*4)
%define O_OUTP (4+ 8*4 +3*4) #define O_OUTP (4+ 8*4 +3*4)
%define O_OUTS (4+ 8*4 +4*4) #define O_OUTS (4+ 8*4 +4*4)
%define O_PARAM (4+ 8*4 +5*4) #define O_PARAM (4+ 8*4 +5*4)
%define INP dword [esp+O_INP] #define INP dword [esp+O_INP]
%define INS dword [esp+O_INS] #define INS dword [esp+O_INS]
%define OUTP dword [esp+O_OUTP] #define OUTP dword [esp+O_OUTP]
%define OUTS dword [esp+O_OUTS] #define OUTS dword [esp+O_OUTS]
%define PARM dword [esp+O_PARAM] #define PARM dword [esp+O_PARAM]
;__LEXEC009__ section LEXEC009
;; empty section for commonality with l_lx_exec86.asm // empty section for commonality with l_lx_exec86.asm
;__LEXEC010__ section LEXEC010
pusha pusha
push byte '?' ; cto8 (sign extension does not matter) push '?' // cto8 (sign extension does not matter)
; cld // cld
mov esi, INP mov esi, INP
mov edi, OUTP mov edi, OUTP
or ebp, byte -1 or ebp, -1
;;; align 8 // align 8
%include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
%include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
%include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
%include "arch/i386/lzma_d.ash" #define db .byte
%include "arch/i386/macros.ash" #include "arch/i386/lzma_d_2.ash"
cjt32 0 cjt32 0
;__LEXEC015__ section LEXEC015
; eax is 0 from decompressor code // eax is 0 from decompressor code
;xor eax, eax ; return code //xor eax, eax ; return code
; check compressed size // check compressed size
mov edx, INP mov edx, INP
add edx, INS add edx, INS
cmp esi, edx cmp esi, edx
@@ -114,12 +113,12 @@ decompress:
dec eax dec eax
.ok: .ok:
; write back the uncompressed size // write back the uncompressed size
sub edi, OUTP sub edi, OUTP
mov edx, OUTS mov edx, OUTS
mov [edx], edi mov [edx], edi
pop edx ; cto8 pop edx // cto8
mov [7*4 + esp], eax mov [7*4 + esp], eax
popa popa
@@ -127,109 +126,105 @@ decompress:
ctojr32 ctojr32
ckt32 edi, dl ckt32 edi, dl
;__LEXEC017__ section LEXEC017
popa popa
ret ret
;__LEXEC020__ section LEXEC020
%define PAGE_SIZE ( 1<<12) #define PAGE_SIZE ( 1<<12)
%define MAP_FIXED 0x10 #define MAP_FIXED 0x10
%define MAP_PRIVATE 0x02 #define MAP_PRIVATE 0x02
%define MAP_ANONYMOUS 0x1000 #define MAP_ANONYMOUS 0x1000
%define PROT_READ 1 #define PROT_READ 1
%define PROT_WRITE 2 #define PROT_WRITE 2
%define PROT_EXEC 4 #define PROT_EXEC 4
%define __NR_mmap 197 #define __NR_mmap 197
%define __NR_syscall 198 #define __NR_syscall 198
%define szElf32_Ehdr 0x34 #define szElf32_Ehdr 0x34
%define p_memsz 5*4 #define p_memsz 5*4
%define __NR_write 4 #define __NR_write 4
%define __NR_exit 1 #define __NR_exit 1
fail_mmap: fail_mmap:
push byte L71 - L70 push L71 - L70
call L71 call L71
L70: L70:
db "PROT_EXEC|PROT_WRITE failed.",10 .ascii "PROT_EXEC|PROT_WRITE failed.\n"
L71: L71:
push byte 2 ; fd stderr push 2 // fd stderr
push eax ; fake ret.addr push eax // fake ret.addr
push byte __NR_write push __NR_write
pop eax pop eax
int 0x80 int 0x80
die: die:
push byte 127 ; only low 7 bits matter! push 127 // only low 7 bits matter!
push eax ; fake ret.addr push eax // fake ret.addr
push byte __NR_exit push __NR_exit
pop eax ; write to stderr could fail, leaving eax as -EBADF etc. pop eax // write to stderr could fail, leaving eax as -EBADF etc.
int 0x80 int 0x80
; Decompress the rest of this loader, and jump to it // Decompress the rest of this loader, and jump to it
unfold: unfold:
pop esi ; &{ b_info:{sz_unc, sz_cpr, 4{byte}}, compressed_data...} pop esi // &{ b_info:{sz_unc, sz_cpr, 4{byte}}, compressed_data...}
lea eax, [ebp - (4+ decompress - _start)] ; 4: sizeof(int) lea eax, [ebp - (4+ decompress - _start)] // 4: sizeof(int)
sub eax, [eax] ; %eax= &Elf32_Ehdr of this program sub eax, [eax] // %eax= &Elf32_Ehdr of this program
mov edx, eax ; %edx= &Elf32_Ehdr of this program mov edx, eax // %edx= &Elf32_Ehdr of this program
; Linux requires PF_W in order to create .bss (implied by .p_filesz!=.p_memsz), // Linux requires PF_W in order to create .bss (implied by .p_filesz!=.p_memsz),
; but strict SELinux (or PaX, grSecurity) forbids PF_W with PF_X. // but strict SELinux (or PaX, grSecurity) forbids PF_W with PF_X.
; So first PT_LOAD must be PF_R|PF_X only, and .p_memsz==.p_filesz. // So first PT_LOAD must be PF_R|PF_X only, and .p_memsz==.p_filesz.
; So we must round up here, instead of pre-rounding .p_memsz. // So we must round up here, instead of pre-rounding .p_memsz.
add eax, [p_memsz + szElf32_Ehdr + eax] ; address after .text add eax, [p_memsz + szElf32_Ehdr + eax] // address after .text
add eax, PAGE_SIZE -1 add eax, PAGE_SIZE -1
and eax, -PAGE_SIZE and eax, 0-PAGE_SIZE
push eax ; destination for 'ret' push eax // destination for 'ret'
; mmap a page to hold the decompressed fold_elf86 // mmap a page to hold the decompressed fold_elf86
xor ecx, ecx ; %ecx= 0 xor ecx, ecx // %ecx= 0
; MAP_ANONYMOUS ==>offset is ignored, so do not push! // MAP_ANONYMOUS ==>offset is ignored, so do not push!
push ecx ; pad (must be zero?) push ecx // pad (must be zero?)
push byte -1 ; *BSD demands -1==fd for mmap(,,,MAP_ANON,,) push -1 // *BSD demands -1==fd for mmap(,,,MAP_ANON,,)
push dword MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS push MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
mov ch, PAGE_SIZE >> 8 ; %ecx= PAGE_SIZE mov ch, PAGE_SIZE >> 8 // %ecx= PAGE_SIZE
push byte PROT_READ | PROT_WRITE | PROT_EXEC push PROT_READ | PROT_WRITE | PROT_EXEC
push ecx ; length push ecx // length
push eax ; destination push eax // destination
xor eax,eax ; 0 xor eax,eax // 0
push eax ; current thread push eax // current thread
mov al, __NR_mmap mov al, __NR_mmap
push eax ; __NR_mmap push eax // __NR_mmap
push eax ; fake return address push eax // fake return address
mov al, __NR_syscall mov al, __NR_syscall
int 0x80 ; changes only %eax; %edx is live int 0x80 // changes only %eax; %edx is live
jb fail_mmap jb fail_mmap
xchg eax, edx ; %edx= page after .text; %eax= &Elf32_Ehdr of this program xchg eax, edx // %edx= page after .text; %eax= &Elf32_Ehdr of this program
xchg eax, ebx ; %ebx= &Elf32_Ehdr of this program xchg eax, ebx // %ebx= &Elf32_Ehdr of this program
cld cld
lodsd lodsd
push eax ; sz_uncompressed (maximum dstlen for lzma) push eax // sz_uncompressed (maximum dstlen for lzma)
mov ecx,esp ; save &dstlen mov ecx,esp // save &dstlen
push eax ; space for 5th param push eax // space for 5th param
push ecx ; &dstlen push ecx // &dstlen
push edx ; &dst push edx // &dst
lodsd lodsd
push eax ; sz_compressed (srclen) push eax // sz_compressed (srclen)
lodsd ; last 4 bytes of b_info lodsd // last 4 bytes of b_info
mov [4*3 + esp],eax mov [4*3 + esp],eax
push esi ; &compressed_data push esi // &compressed_data
call ebp ; decompress(&src, srclen, &dst, &dstlen, b_info.misc) call ebp // decompress(&src, srclen, &dst, &dstlen, b_info.misc)
add esp, byte (5+1 + 9)*4 ; (5+1) args to decompress, 9 "args" to mmap add esp, (5+1 + 9)*4 // (5+1) args to decompress, 9 "args" to mmap
ret ; &destination ret // &destination
main: main:
pop ebp ; &decompress pop ebp // &decompress
call unfold call unfold
; compressed fold_elf86 follows // compressed fold_elf86 follows
eof: eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+145 -154
View File
@@ -1,3 +1,4 @@
/*
; i386-bsd.elf-fold.asm -- linkage to C code to process Elf binary ; i386-bsd.elf-fold.asm -- linkage to C code to process Elf binary
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -26,256 +27,246 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32 #define PAGE_SIZE ( 1<<12)
SECTION .text #define szElf32_Ehdr 0x34
CPU 386 #define szElf32_Phdr 8*4
#define e_type 16
#define e_entry (16 + 2*2 + 4)
#define p_memsz 5*4
#define szb_info 12
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
%define PAGE_SIZE ( 1<<12) #define __NR_munmap 73
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_type 16
%define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4
%define szb_info 12
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
%define __NR_munmap 73 // control just falls through, after this part and compiled C code
// are uncompressed.
;; control just falls through, after this part and compiled C code fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
;; are uncompressed. // patchLoader will modify to be
// dword sz_uncompressed, sz_compressed
// byte compressed_data...
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program // ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
; patchLoader will modify to be // Move argc,argv,envp down to make room for Elf_auxv table.
; dword sz_uncompressed, sz_compressed // Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; byte compressed_data... // because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
// give not quite everything. It is simpler and smaller code for us
// to generate a "complete" table where Elf_auxv[k -1].a_type = k.
// On second thought, that wastes a lot of stack space (the entire kernel
// auxv, plus those slots that remain empty anyway). So try for minimal
// space on stack, without too much code, by doing it serially.
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance. #define AT_NULL 0
; Move argc,argv,envp down to make room for Elf_auxv table. #define AT_IGNORE 1
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM #define AT_PHDR 3
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?) #define AT_PHENT 4
; give not quite everything. It is simpler and smaller code for us #define AT_PHNUM 5
; to generate a "complete" table where Elf_auxv[k -1].a_type = k. #define AT_PAGESZ 6
; On second thought, that wastes a lot of stack space (the entire kernel #define AT_BASE 7
; auxv, plus those slots that remain empty anyway). So try for minimal #define AT_ENTRY 9
; space on stack, without too much code, by doing it serially.
%define AT_NULL 0 #define ET_DYN 3
%define AT_IGNORE 1
%define AT_PHDR 3
%define AT_PHENT 4
%define AT_PHNUM 5
%define AT_PAGESZ 6
%define AT_BASE 7
%define AT_ENTRY 9
%define ET_DYN 3
sub ecx, ecx sub ecx, ecx
mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_BASE) | (1<<AT_ENTRY) mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_BASE) | (1<<AT_ENTRY)
mov esi, esp mov esi, esp
mov edi, esp mov edi, esp
call do_auxv ; clear bits in edx according to existing auxv slots call do_auxv // clear bits in edx according to existing auxv slots
mov esi, esp mov esi, esp
L50: L50:
shr edx, 1 ; Carry = bottom bit shr edx, 1 // Carry = bottom bit
sbb eax, eax ; -1 or 0 sbb eax, eax // -1 or 0
sub ecx, eax ; count of 1 bits that remained in edx sub ecx, eax // count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] ; allocate one auxv slot, if needed lea esp, [esp + sz_auxv * eax] // allocate one auxv slot, if needed
test edx,edx test edx,edx
jne L50 jne L50
mov edi, esp mov edi, esp
call do_auxv ; move; fill new auxv slots with AT_IGNORE call do_auxv // move; fill new auxv slots with AT_IGNORE
%define OVERHEAD 2048 #define OVERHEAD 2048
%define MAX_ELF_HDR 512 #define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD ; alloca sub esp, MAX_ELF_HDR + OVERHEAD // alloca
push ebx ; start of unmap region (&Elf32_Ehdr of this stub) push ebx // start of unmap region (&Elf32_Ehdr of this stub)
; Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss, // Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
; but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X. // but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] ; phdr[0].p_memsz mov edx, [p_memsz + szElf32_Ehdr + ebx] // phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] ; 1 page for round, 1 for unfold lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] // 1 page for round, 1 for unfold
and edx, -PAGE_SIZE and edx, 0-PAGE_SIZE
push edx ; end of unmap region push edx // end of unmap region
sub eax, eax ; 0 sub eax, eax // 0
cmp word [e_type + ebx], byte ET_DYN cmp word ptr [e_type + ebx], ET_DYN
jne L53 jne L53
xchg eax, edx ; dynbase for ET_DYN; assumes mmap(0, ...) is placed after us! xchg eax, edx // dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
L53: L53:
push eax ; dynbase push eax // dynbase
mov esi, [e_entry + ebx] ; end of compressed data mov esi, [e_entry + ebx] // end of compressed data
lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] ; 1st &b_info lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] // 1st &b_info
sub esi, eax ; length of compressed data sub esi, eax // length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, byte szb_info add ecx, szb_info
lea edx, [3*4 + esp] ; &tmp lea edx, [3*4 + esp] // &tmp
pusha ; (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} ) pusha // (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi ; swap with above 'pusha' to inhibit auxv_up for PT_INTERP inc edi // swap with above 'pusha' to inhibit auxv_up for PT_INTERP
EXTERN upx_main .extern upx_main
call upx_main ; returns entry address call upx_main // returns entry address
add esp, byte (8 +1)*4 ; remove 8 params from pusha, also dynbase add esp, (8 +1)*4 // remove 8 params from pusha, also dynbase
pop ecx ; end of unmap region pop ecx // end of unmap region
pop ebx ; start of unmap region (&Elf32_Ehdr of this stub) pop ebx // start of unmap region (&Elf32_Ehdr of this stub)
add esp, dword MAX_ELF_HDR + OVERHEAD ; un-alloca add esp, MAX_ELF_HDR + OVERHEAD // un-alloca
push eax ; save entry address as ret.addr push eax // save entry address as ret.addr
push byte 0 ; 'leave' uses this to clear ebp push 0 // 'leave' uses this to clear ebp
mov ebp,esp ; frame mov ebp,esp // frame
sub ecx, ebx sub ecx, ebx
sub eax,eax ; 0, also AT_NULL sub eax,eax // 0, also AT_NULL
push ecx ; length to unmap push ecx // length to unmap
push ebx ; start of unmap region (&Elf32_Ehdr of this stub) push ebx // start of unmap region (&Elf32_Ehdr of this stub)
push eax ; fake ret.addr push eax // fake ret.addr
dec edi ; auxv table dec edi // auxv table
db 0x3c ; "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter .byte 0x3c // "cmpb al, ..." like "jmp 1+L60" but 1 byte shorter
L60: L60:
scasd ; a_un.a_val etc. scasd // a_un.a_val etc.
scasd ; a_type scasd // a_type
jne L60 ; not AT_NULL jne L60 // not AT_NULL
; edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch() // edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push dword [edi] ; &escape hatch push dword ptr [edi] // &escape hatch
xor edi,edi xor edi,edi
xor esi,esi xor esi,esi
xor edx,edx xor edx,edx
xor ecx,ecx xor ecx,ecx
xor ebx,ebx xor ebx,ebx
mov al, __NR_munmap ; eax was 0 from L60 mov al, __NR_munmap // eax was 0 from L60
ret ; goto escape hatch: int 0x80; leave; ret ret // goto escape hatch: int 0x80; leave; ret
; called twice: // called twice:
; 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx. // 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
; 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots // 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
; entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted // entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
; exit: edi= &auxtab; edx= bits still needed // exit: edi= &auxtab; edx= bits still needed
do_auxv: do_auxv:
; cld // cld
L10: ; move argc+argv L10: // move argc+argv
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L10 jne L10
L20: ; move envp L20: // move envp
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L20 jne L20
push edi ; return value push edi // return value
L30: ; process auxv L30: // process auxv
lodsd ; a_type lodsd // a_type
stosd stosd
cmp eax, byte 32 cmp eax, 32
jae L32 ; prevent aliasing by 'btr' when 32<=a_type jae L32 // prevent aliasing by 'btr' when 32<=a_type
btr edx, eax ; no longer need a slot of type eax [Carry only] btr edx, eax // no longer need a slot of type eax [Carry only]
L32: L32:
test eax, eax ; AT_NULL ? test eax, eax // AT_NULL ?
lodsd lodsd
stosd stosd
jnz L30 ; a_type != AT_NULL jnz L30 // a_type != AT_NULL
sub edi, byte 8 ; backup to AT_NULL sub edi, 8 // backup to AT_NULL
add ecx, ecx ; two words per auxv add ecx, ecx // two words per auxv
inc eax ; convert 0 to AT_IGNORE inc eax // convert 0 to AT_IGNORE
rep stosd ; allocate and fill rep stosd // allocate and fill
dec eax ; convert AT_IGNORE to AT_NULL dec eax // convert AT_IGNORE to AT_NULL
stosd ; re-terminate with AT_NULL stosd // re-terminate with AT_NULL
stosd stosd
pop edi ; &auxtab pop edi // &auxtab
ret ret
%define __NR_mmap 197 #define __NR_mmap 197
%define __NR_syscall 198 #define __NR_syscall 198
global mmap mmap: .globl mmap
mmap:
push ebp push ebp
mov ebp,esp mov ebp,esp
xor eax,eax ; 0 xor eax,eax // 0
push eax ; convert to 64-bit push eax // convert to 64-bit
push dword [7*4+ebp] ; offset push dword ptr [7*4+ebp] // offset
push eax ; pad push eax // pad
push dword [6*4+ebp] ; fd push dword ptr [6*4+ebp] // fd
push dword [5*4+ebp] ; flags push dword ptr [5*4+ebp] // flags
push dword [4*4+ebp] ; prot push dword ptr [4*4+ebp] // prot
push dword [3*4+ebp] ; len push dword ptr [3*4+ebp] // len
push dword [2*4+ebp] ; addr push dword ptr [2*4+ebp] // addr
push eax ; current thread push eax // current thread
mov al,__NR_mmap mov al,__NR_mmap
push eax push eax
push eax ; fake ret.addr push eax // fake ret.addr
mov al,__NR_syscall mov al,__NR_syscall
int 0x80 int 0x80
leave leave
ret ret
global brk brk: .globl brk
brk:
ret ret
%define __NR_exit 1 #define __NR_exit 1
%define __NR_read 3 #define __NR_read 3
%define __NR_write 4 #define __NR_write 4
%define __NR_open 5 #define __NR_open 5
%define __NR_close 6 #define __NR_close 6
%define __NR_munmap 73 #define __NR_munmap 73
%define __NR_mprotect 74 #define __NR_mprotect 74
global exit exit: .globl exit
exit:
mov al,__NR_exit mov al,__NR_exit
nf_sysgo: nf_sysgo:
movzx eax,al movzx eax,al
int 0x80 int 0x80
ret ret
global read read: .globl read
read:
mov al,__NR_read mov al,__NR_read
jmp nf_sysgo jmp nf_sysgo
global write write: .globl write
write:
mov al,__NR_write mov al,__NR_write
jmp nf_sysgo jmp nf_sysgo
global open open: .globl open
open:
mov al,__NR_open mov al,__NR_open
jmp nf_sysgo jmp nf_sysgo
global close close: .globl close
close:
mov al,__NR_close mov al,__NR_close
jmp nf_sysgo jmp nf_sysgo
global munmap munmap: .globl munmap
munmap:
mov al,__NR_munmap mov al,__NR_munmap
jmp nf_sysgo jmp nf_sysgo
global mprotect mprotect: .globl mprotect
mprotect:
mov al,__NR_mprotect mov al,__NR_mprotect
jmp nf_sysgo jmp nf_sysgo
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+5 -4
View File
@@ -63,10 +63,11 @@ section LZMA_INIT_STACK
; ============= ; =============
*/ */
//include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
//#include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash" #include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash" #define db .byte
#include "arch/i386/lzma_d_2.ash"
section LZMA_DONE_STACK section LZMA_DONE_STACK
mov ss, [eax] // eax is always 0 here mov ss, [eax] // eax is always 0 here
+4 -4
View File
@@ -66,10 +66,10 @@ decompressor:
// ============= DECOMPRESSION // ============= DECOMPRESSION
// ============= // =============
//#include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
//#include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash" #include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash" #include "arch/i386/lzma_d_2.ash"
section TMTMAIN5 section TMTMAIN5
pop ebp pop ebp
+4 -4
View File
@@ -71,10 +71,10 @@ decompressor:
// ============= DECOMPRESSION // ============= DECOMPRESSION
// ============= // =============
//#include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
//#include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash" #include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash" #include "arch/i386/lzma_d_2.ash"
// ============= // =============
+112 -115
View File
@@ -1,3 +1,4 @@
/*
; l_lx_elf86.asm -- Linux program entry point & decompressor (Elf binary) ; l_lx_elf86.asm -- Linux program entry point & decompressor (Elf binary)
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -28,24 +29,23 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32 #define jmps jmp short
SECTION .text #define jmpn jmp near
CPU 386
%define jmps jmp short /*************************************************************************
%define jmpn jmp near // program entry point
// see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
; /************************************************************************* section LEXEC000
; // program entry point _start: .globl _start
; // see glibc/sysdeps/i386/elf/start.S //// int3
; **************************************************************************/ /*
GLOBAL _start
;__LEXEC000__
_start:
;;;; int3
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above. ;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date. ;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as ;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@@ -62,51 +62,52 @@ _start:
;; end ;; end
;; Step through the code; remember that <Enter> repeats the previous command. ;; Step through the code; remember that <Enter> repeats the previous command.
;; ;;
call main ; push address of decompress subroutine */
call main // push address of decompress subroutine
decompress: decompress:
; /************************************************************************* // /*************************************************************************
; // C callable decompressor // // C callable decompressor
; **************************************************************************/ // **************************************************************************/
; /* Offsets to parameters, allowing for {push + pusha + call} */ // /* Offsets to parameters, allowing for {push + pusha + call} */
%define O_INP (4+ 8*4 +1*4) #define O_INP (4+ 8*4 +1*4)
%define O_INS (4+ 8*4 +2*4) #define O_INS (4+ 8*4 +2*4)
%define O_OUTP (4+ 8*4 +3*4) #define O_OUTP (4+ 8*4 +3*4)
%define O_OUTS (4+ 8*4 +4*4) #define O_OUTS (4+ 8*4 +4*4)
%define O_PARAM (4+ 8*4 +5*4) #define O_PARAM (4+ 8*4 +5*4)
%define INP dword [esp+O_INP] #define INP dword [esp+O_INP]
%define INS dword [esp+O_INS] #define INS dword [esp+O_INS]
%define OUTP dword [esp+O_OUTP] #define OUTP dword [esp+O_OUTP]
%define OUTS dword [esp+O_OUTS] #define OUTS dword [esp+O_OUTS]
%define PARM dword [esp+O_PARAM] #define PARM dword [esp+O_PARAM]
;__LEXEC009__ section LEXEC009
;; empty section for commonality with l_lx_exec86.asm //; empty section for commonality with l_lx_exec86.asm
;__LEXEC010__ section LEXEC010
pusha pusha
push byte '?' ; cto8 (sign extension does not matter) push '?' // cto8 (sign extension does not matter)
; cld // cld
mov esi, INP mov esi, INP
mov edi, OUTP mov edi, OUTP
or ebp, byte -1 or ebp, byte -1
;;; align 8 //;; align 8
%include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
%include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
%include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
%include "arch/i386/lzma_d.ash" #define db .byte
%include "arch/i386/macros.ash" #include "arch/i386/lzma_d_2.ash"
cjt32 0 cjt32 0
;__LEXEC015__ section LEXEC015
; eax is 0 from decompressor code // eax is 0 from decompressor code
;xor eax, eax ; return code //xor eax, eax ; return code
; check compressed size // check compressed size
mov edx, INP mov edx, INP
add edx, INS add edx, INS
cmp esi, edx cmp esi, edx
@@ -114,12 +115,12 @@ decompress:
dec eax dec eax
.ok: .ok:
; write back the uncompressed size // write back the uncompressed size
sub edi, OUTP sub edi, OUTP
mov edx, OUTS mov edx, OUTS
mov [edx], edi mov [edx], edi
pop edx ; cto8 pop edx // cto8
mov [7*4 + esp], eax mov [7*4 + esp], eax
popa popa
@@ -127,107 +128,103 @@ decompress:
ctojr32 ctojr32
ckt32 edi, dl ckt32 edi, dl
;__LEXEC017__ section LEXEC017
popa popa
ret ret
;__LEXEC020__ section LEXEC020
%define PAGE_SIZE ( 1<<12) #define PAGE_SIZE ( 1<<12)
%define MAP_FIXED 0x10 #define MAP_FIXED 0x10
%define MAP_PRIVATE 0x02 #define MAP_PRIVATE 0x02
%define MAP_ANONYMOUS 0x20 #define MAP_ANONYMOUS 0x20
%define PROT_READ 1 #define PROT_READ 1
%define PROT_WRITE 2 #define PROT_WRITE 2
%define PROT_EXEC 4 #define PROT_EXEC 4
%define __NR_mmap 90 #define __NR_mmap 90
%define szElf32_Ehdr 0x34 #define szElf32_Ehdr 0x34
%define p_memsz 5*4 #define p_memsz 5*4
%define __NR_write 4 #define __NR_write 4
%define __NR_exit 1 #define __NR_exit 1
msg_SELinux: msg_SELinux:
push byte L71 - L70 push L71 - L70
pop edx ; length pop edx // length
call L71 call L71
L70: L70:
db "PROT_EXEC|PROT_WRITE failed.",10 .ascii "PROT_EXEC|PROT_WRITE failed.\n"
L71: L71:
pop ecx ; message text pop ecx // message text
push byte 2 ; fd stderr push 2 // fd stderr
pop ebx pop ebx
push byte __NR_write push __NR_write
pop eax pop eax
int 0x80 int 0x80
die: die:
mov bl, byte 127 ; only low 7 bits matter! mov bl, 127 // only low 7 bits matter!
push byte __NR_exit push __NR_exit
pop eax ; write to stderr could fail, leaving eax as -EBADF etc. pop eax // write to stderr could fail, leaving eax as -EBADF etc.
int 0x80 int 0x80
; Decompress the rest of this loader, and jump to it // Decompress the rest of this loader, and jump to it
unfold: unfold:
pop esi ; &{ b_info:{sz_unc, sz_cpr, 4{byte}}, compressed_data...} pop esi // &{ b_info:{sz_unc, sz_cpr, 4{byte}}, compressed_data...}
lea eax, [ebp - (4+ decompress - _start)] ; 4: sizeof(int) lea eax, [ebp - (4+ decompress - _start)] // 4: sizeof(int)
sub eax, [eax] ; %eax= &Elf32_Ehdr of this program sub eax, [eax] // %eax= &Elf32_Ehdr of this program
mov edx, eax ; %edx= &Elf32_Ehdr of this program mov edx, eax // %edx= &Elf32_Ehdr of this program
; Linux requires PF_W in order to create .bss (implied by .p_filesz!=.p_memsz), // Linux requires PF_W in order to create .bss (implied by .p_filesz!=.p_memsz),
; but strict SELinux (or PaX, grSecurity) forbids PF_W with PF_X. // but strict SELinux (or PaX, grSecurity) forbids PF_W with PF_X.
; So first PT_LOAD must be PF_R|PF_X only, and .p_memsz==.p_filesz. // So first PT_LOAD must be PF_R|PF_X only, and .p_memsz==.p_filesz.
; So we must round up here, instead of pre-rounding .p_memsz. // So we must round up here, instead of pre-rounding .p_memsz.
add eax, [p_memsz + szElf32_Ehdr + eax] ; address after .text add eax, [p_memsz + szElf32_Ehdr + eax] // address after .text
add eax, PAGE_SIZE -1 add eax, PAGE_SIZE -1
and eax, -PAGE_SIZE and eax, 0-PAGE_SIZE
push eax ; destination for 'ret' push eax // destination for 'ret'
; mmap a page to hold the decompressed fold_elf86 // mmap a page to hold the decompressed fold_elf86
xor ecx, ecx ; %ecx= 0 xor ecx, ecx // %ecx= 0
; MAP_ANONYMOUS ==>offset is ignored, so do not push! // MAP_ANONYMOUS ==>offset is ignored, so do not push!
; push ecx ; offset // push ecx ; offset
push byte -1 ; *BSD demands -1==fd for mmap(,,,MAP_ANON,,) push -1 // *BSD demands -1==fd for mmap(,,,MAP_ANON,,)
push byte MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS push MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
mov ch, PAGE_SIZE >> 8 ; %ecx= PAGE_SIZE mov ch, PAGE_SIZE >> 8 // %ecx= PAGE_SIZE
push byte PROT_READ | PROT_WRITE | PROT_EXEC push PROT_READ | PROT_WRITE | PROT_EXEC
push ecx ; length push ecx // length
push eax ; destination push eax // destination
mov ebx, esp ; address of parameter vector for __NR_mmap mov ebx, esp // address of parameter vector for __NR_mmap
push byte __NR_mmap push __NR_mmap
pop eax pop eax
int 0x80 ; changes only %eax; %edx is live int 0x80 // changes only %eax; %edx is live
test eax,eax test eax,eax
js msg_SELinux js msg_SELinux
xchg eax, edx ; %edx= page after .text; %eax= &Elf32_Ehdr of this program xchg eax, edx // %edx= page after .text; %eax= &Elf32_Ehdr of this program
xchg eax, ebx ; %ebx= &Elf32_Ehdr of this program xchg eax, ebx // %ebx= &Elf32_Ehdr of this program
cld cld
lodsd lodsd
push eax ; sz_uncompressed (maximum dstlen for lzma) push eax // sz_uncompressed (maximum dstlen for lzma)
mov ecx,esp ; save &dstlen mov ecx,esp // save &dstlen
push eax ; space for 5th param push eax // space for 5th param
push ecx ; &dstlen push ecx // &dstlen
push edx ; &dst push edx // &dst
lodsd lodsd
push eax ; sz_compressed (srclen) push eax // sz_compressed (srclen)
lodsd ; last 4 bytes of b_info lodsd // last 4 bytes of b_info
mov [4*3 + esp],eax mov [4*3 + esp],eax
push esi ; &compressed_data push esi // &compressed_data
call ebp ; decompress(&src, srclen, &dst, &dstlen, b_info.misc) call ebp // decompress(&src, srclen, &dst, &dstlen, b_info.misc)
add esp, byte (5+1 + 6-1)*4 ; (5+1) args to decompress, (6-1) args to mmap add esp, 0+(5+1 + 6-1)*4 // (5+1) args to decompress, (6-1) args to mmap
ret ; &destination ret // &destination
main: main:
pop ebp ; &decompress pop ebp // &decompress
call unfold call unfold
; compressed fold_elf86 follows // compressed fold_elf86 follows
eof: eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+114 -114
View File
@@ -1,3 +1,4 @@
/*
; fold_elf86.asm -- linkage to C code to process Elf binary ; fold_elf86.asm -- linkage to C code to process Elf binary
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -26,118 +27,118 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
BITS 32 // CPU 386
SECTION .text
CPU 386
%define PAGE_SIZE ( 1<<12) #define PAGE_SIZE ( 1<<12)
%define szElf32_Ehdr 0x34 #define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4 #define szElf32_Phdr 8*4
%define e_type 16 #define e_type 16
%define e_entry (16 + 2*2 + 4) #define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4 #define p_memsz 5*4
%define szb_info 12 #define szb_info 12
%define szl_info 12 #define szl_info 12
%define szp_info 12 #define szp_info 12
%define a_type 0 #define a_type 0
%define a_val 4 #define a_val 4
%define sz_auxv 8 #define sz_auxv 8
%define __NR_munmap 91 #define __NR_munmap 91
;; control just falls through, after this part and compiled C code // control just falls through, after this part and compiled C code
;; are uncompressed. // are uncompressed.
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
; patchLoader will modify to be // patchLoader will modify to be
; dword sz_uncompressed, sz_compressed // dword sz_uncompressed, sz_compressed
; byte compressed_data... // byte compressed_data...
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance. // ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
; Move argc,argv,envp down to make room for Elf_auxv table. // Move argc,argv,envp down to make room for Elf_auxv table.
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM // Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?) // because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
; give not quite everything. It is simpler and smaller code for us // give not quite everything. It is simpler and smaller code for us
; to generate a "complete" table where Elf_auxv[k -1].a_type = k. // to generate a "complete" table where Elf_auxv[k -1].a_type = k.
; On second thought, that wastes a lot of stack space (the entire kernel // On second thought, that wastes a lot of stack space (the entire kernel
; auxv, plus those slots that remain empty anyway). So try for minimal // auxv, plus those slots that remain empty anyway). So try for minimal
; space on stack, without too much code, by doing it serially. // space on stack, without too much code, by doing it serially.
%define AT_NULL 0 #define AT_NULL 0
%define AT_IGNORE 1 #define AT_IGNORE 1
%define AT_PHDR 3 #define AT_PHDR 3
%define AT_PHENT 4 #define AT_PHENT 4
%define AT_PHNUM 5 #define AT_PHNUM 5
%define AT_PAGESZ 6 #define AT_PAGESZ 6
%define AT_ENTRY 9 #define AT_ENTRY 9
%define ET_DYN 3 #define ET_DYN 3
sub ecx, ecx sub ecx, ecx
mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_ENTRY) mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_ENTRY)
mov esi, esp mov esi, esp
mov edi, esp mov edi, esp
call do_auxv ; clear bits in edx according to existing auxv slots call do_auxv // clear bits in edx according to existing auxv slots
mov esi, esp mov esi, esp
L50: L50:
shr edx, 1 ; Carry = bottom bit shr edx, 1 // Carry = bottom bit
sbb eax, eax ; -1 or 0 sbb eax, eax // -1 or 0
sub ecx, eax ; count of 1 bits that remained in edx sub ecx, eax // count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] ; allocate one auxv slot, if needed lea esp, [esp + sz_auxv * eax] // allocate one auxv slot, if needed
test edx,edx test edx,edx
jne L50 jne L50
mov edi, esp mov edi, esp
call do_auxv ; move; fill new auxv slots with AT_IGNORE call do_auxv // move; fill new auxv slots with AT_IGNORE
%define OVERHEAD 2048 #define OVERHEAD 2048
%define MAX_ELF_HDR 512 #define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD ; alloca sub esp, MAX_ELF_HDR + OVERHEAD // alloca
push ebx ; start of unmap region (&Elf32_Ehdr of this stub) push ebx // start of unmap region (&Elf32_Ehdr of this stub)
; Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss, // Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
; but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X. // but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] ; phdr[0].p_memsz mov edx, [p_memsz + szElf32_Ehdr + ebx] // phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] ; 1 page for round, 1 for unfold lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] // 1 page for round, 1 for unfold
and edx, -PAGE_SIZE and edx, 0-PAGE_SIZE
push edx ; end of unmap region push edx // end of unmap region
sub eax, eax ; 0 sub eax, eax // 0
cmp word [e_type + ebx], byte ET_DYN cmp word ptr [e_type + ebx], ET_DYN
jne L53 jne L53
xchg eax, edx ; dynbase for ET_DYN; assumes mmap(0, ...) is placed after us! xchg eax, edx // dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
L53: L53:
push eax ; dynbase push eax // dynbase
mov esi, [e_entry + ebx] ; end of compressed data mov esi, [e_entry + ebx] // end of compressed data
lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] ; 1st &b_info lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] // 1st &b_info
sub esi, eax ; length of compressed data sub esi, eax // length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, byte szb_info add ecx, szb_info
lea edx, [3*4 + esp] ; &tmp lea edx, [3*4 + esp] // &tmp
pusha ; (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} ) pusha // (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi ; swap with above 'pusha' to inhibit auxv_up for PT_INTERP inc edi // swap with above 'pusha' to inhibit auxv_up for PT_INTERP
EXTERN upx_main .extern upx_main
call upx_main ; returns entry address call upx_main // returns entry address
add esp, byte (8 +1)*4 ; remove 8 params from pusha, also dynbase add esp, (8 +1)*4 // remove 8 params from pusha, also dynbase
pop ecx ; end of unmap region pop ecx // end of unmap region
pop ebx ; start of unmap region (&Elf32_Ehdr of this stub) pop ebx // start of unmap region (&Elf32_Ehdr of this stub)
add esp, dword MAX_ELF_HDR + OVERHEAD ; un-alloca add esp, MAX_ELF_HDR + OVERHEAD // un-alloca
push eax ; save entry address push eax // save entry address
dec edi ; auxv table dec edi // auxv table
sub eax,eax ; 0, also AT_NULL sub eax,eax // 0, also AT_NULL
db 0x3c ; "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter .byte 0x3c // "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter
L60: L60:
scasd ; a_un.a_val etc. scasd // a_un.a_val etc.
scasd ; a_type scasd // a_type
jne L60 ; not AT_NULL jne L60 // not AT_NULL
; edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch() // edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push eax push eax
push eax push eax
@@ -146,67 +147,66 @@ L60:
push eax push eax
push eax push eax
push eax push eax
push eax ; 32 bytes of zeroes now on stack, ready for 'popa' push eax // 32 bytes of zeroes now on stack, ready for 'popa'
sub ecx, ebx ; length to unmap sub ecx, ebx // length to unmap
mov al, __NR_munmap ; eax was 0 from L60 mov al, __NR_munmap // eax was 0 from L60
jmp [edi] ; unmap ourselves via escape hatch, then goto entry jmp [edi] // unmap ourselves via escape hatch, then goto entry
; called twice: // called twice:
; 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx. // 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
; 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots // 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
; entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted // entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
; exit: edi= &auxtab; edx= bits still needed // exit: edi= &auxtab; edx= bits still needed
do_auxv: do_auxv:
; cld // cld
L10: ; move argc+argv L10: // move argc+argv
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L10 jne L10
L20: ; move envp L20: // move envp
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L20 jne L20
push edi ; return value push edi // return value
L30: ; process auxv L30: // process auxv
lodsd ; a_type lodsd // a_type
stosd stosd
cmp eax, byte 32 cmp eax, 32
jae L32 ; prevent aliasing by 'btr' when 32<=a_type jae L32 // prevent aliasing by 'btr' when 32<=a_type
btr edx, eax ; no longer need a slot of type eax [Carry only] btr edx, eax // no longer need a slot of type eax [Carry only]
L32: L32:
test eax, eax ; AT_NULL ? test eax, eax // AT_NULL ?
lodsd lodsd
stosd stosd
jnz L30 ; a_type != AT_NULL jnz L30 // a_type != AT_NULL
sub edi, byte 8 ; backup to AT_NULL sub edi, 8 // backup to AT_NULL
add ecx, ecx ; two words per auxv add ecx, ecx // two words per auxv
inc eax ; convert 0 to AT_IGNORE inc eax // convert 0 to AT_IGNORE
rep stosd ; allocate and fill rep stosd // allocate and fill
dec eax ; convert AT_IGNORE to AT_NULL dec eax // convert AT_IGNORE to AT_NULL
stosd ; re-terminate with AT_NULL stosd // re-terminate with AT_NULL
stosd stosd
pop edi ; &auxtab pop edi // &auxtab
ret ret
%define __NR_mmap 90 #define __NR_mmap 90
global mmap mmap: .globl mmap
mmap:
push ebx push ebx
lea ebx, [2*4 + esp] lea ebx, [2*4 + esp]
push byte __NR_mmap push __NR_mmap
pop eax pop eax
int 0x80 int 0x80
pop ebx pop ebx
ret ret
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+69 -71
View File
@@ -1,3 +1,4 @@
/*
; l_lx_exec86.asm -- Linux program entry point & decompressor (kernel exec) ; l_lx_exec86.asm -- Linux program entry point & decompressor (kernel exec)
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -28,24 +29,23 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32 #define jmps jmp short
SECTION .text #define jmpn jmp near
CPU 386
%define jmps jmp short /*************************************************************************
%define jmpn jmp near // program entry point
// see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
; /************************************************************************* section LEXEC000
; // program entry point _start: .globl _start
; // see glibc/sysdeps/i386/elf/start.S //// int3
; **************************************************************************/ /*
GLOBAL _start
;__LEXEC000__
_start:
;;;; int3
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above. ;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date. ;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as ;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@@ -62,106 +62,104 @@ _start:
;; end ;; end
;; Step through the code; remember that <Enter> repeats the previous command. ;; Step through the code; remember that <Enter> repeats the previous command.
;; ;;
*/
%if 0 #if 0
; personality(PER_LINUX) // personality(PER_LINUX)
mov eax, 136 ; syscall_personality mov eax, 136 // syscall_personality
xor ebx, ebx ; PER_LINUX xor ebx, ebx // PER_LINUX
int 0x80 int 0x80
%endif #endif
call main ; push address of decompress subroutine call main // push address of decompress subroutine
decompress: decompress:
; /************************************************************************* // /*************************************************************************
; // C callable decompressor // // C callable decompressor
; **************************************************************************/ // **************************************************************************/
; /* Offsets to parameters, allowing for {push + pusha + call} */ // /* Offsets to parameters, allowing for {push + pusha + call} */
%define O_INP (4+ 8*4 +1*4) #define O_INP (4+ 8*4 +1*4)
%define O_INS (4+ 8*4 +2*4) #define O_INS (4+ 8*4 +2*4)
%define O_OUTP (4+ 8*4 +3*4) #define O_OUTP (4+ 8*4 +3*4)
%define O_OUTS (4+ 8*4 +4*4) #define O_OUTS (4+ 8*4 +4*4)
%define O_PARAM (4+ 8*4 +5*4) #define O_PARAM (4+ 8*4 +5*4)
%define INP dword [esp+O_INP] #define INP dword [esp+O_INP]
%define INS dword [esp+O_INS] #define INS dword [esp+O_INS]
%define OUTP dword [esp+O_OUTP] #define OUTP dword [esp+O_OUTP]
%define OUTS dword [esp+O_OUTS] #define OUTS dword [esp+O_OUTS]
%define PARM dword [esp+O_PARAM] #define PARM dword [esp+O_PARAM]
;__LEXEC009__ section LEXEC009
mov eax, 'NMRU' ; free slot in following 'pusha' mov eax, offset NMRU // free slot in following 'pusha'
;__LEXEC010__ section LEXEC010
pusha pusha
push byte '?' ; cto8 (sign extension does not matter) push '?' // cto8 (sign extension does not matter)
; cld // cld
mov esi, INP mov esi, INP
mov edi, OUTP mov edi, OUTP
or ebp, byte -1 or ebp, byte -1
;;; align 8 // align 8
%include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
%include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
%include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
%include "arch/i386/lzma_d.ash" #define db .byte
%include "arch/i386/macros.ash" #include "arch/i386/lzma_d_2.ash"
#include "arch/i386/macros2.ash"
cjt32 0 cjt32 0
;__LEXEC015__ section LEXEC015
; eax is 0 from decompressor code // eax is 0 from decompressor code
;xor eax, eax ; return code //xor eax, eax ; return code
; check compressed size // check compressed size
mov edx, INP mov edx, INP
add edx, INS add edx, INS
cmp edx, esi cmp edx, esi
jz .ok jz .ok
dec eax dec eax
.ok: .ok:
xchg [8*4 + esp], eax ; store success/failure, fetch NMRU xchg [8*4 + esp], eax // store success/failure, fetch NMRU
; write back the uncompressed size, and prepare for unfilter // write back the uncompressed size, and prepare for unfilter
mov edx, OUTS mov edx, OUTS
mov ecx, edi mov ecx, edi
mov edi, OUTP mov edi, OUTP
sub ecx, edi ; ecx= uncompressed size sub ecx, edi // ecx= uncompressed size
mov [edx], ecx mov [edx], ecx
pop edx ; cto8 pop edx // cto8
;__LEXEC110__ Jcc and/or possible n_mru section LEXEC110 // Jcc and/or possible n_mru
push edi ; addvalue push edi // addvalue
push byte 0x0f push 0x0f
pop ebx pop ebx
mov bh, dl ; ebx= 0,,cto8,0x0F mov bh, dl // ebx= 0,,cto8,0x0F
;__LEXEC100__ 0!=n_mru section LEXEC100 // 0!=n_mru
xchg eax, ebx ; eax= ct08_0f; ebx= n_mru {or n_mru1} xchg eax, ebx // eax= ct08_0f; ebx= n_mru {or n_mru1}
;;LEXEC016 bug in APP: jmp and target must be in same .asx section LEXEC016 // bug in APP: jmp and target must be in same .asx
;; jmpn lxunf0 ; logically belongs here //; jmpn lxunf0 ; logically belongs here
ctojr32 ctojr32
ckt32 edi, dl ckt32 edi, dl
;__LEXEC017__ section LEXEC017
popa popa
ret ret
;__LEXEC020__ section LEXEC020
main: main:
pop ebp ; &decompress pop ebp // &decompress
mov ebx, 0x401000 ; &Elf32_Ehdr of this program mov ebx, 0x401000 // &Elf32_Ehdr of this program
;; fall into fold_begin //; fall into fold_begin
eof: eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+27 -28
View File
@@ -1,3 +1,4 @@
/*
; fold_exec86.asm -- linkage to C code to process Elf binary ; fold_exec86.asm -- linkage to C code to process Elf binary
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -26,47 +27,45 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32 // control just falls through, after this part and compiled C code
SECTION .text // are uncompressed.
CPU 386
;; control just falls through, after this part and compiled C code #define szElf32_Ehdr 0x34
;; are uncompressed. #define szElf32_Phdr 8*4
#define e_entry (16 + 2*2 + 4)
#define p_vaddr 2*4
#define p_memsz 5*4
#define szl_info 12
#define szp_info 12
%define szElf32_Ehdr 0x34 fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
%define szElf32_Phdr 8*4
%define e_entry (16 + 2*2 + 4)
%define p_vaddr 2*4
%define p_memsz 5*4
%define szl_info 12
%define szp_info 12
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program pop eax // Pop the argument count
mov ecx, esp // argv starts just at the current stack top
pop eax ; Pop the argument count lea edx, [esp+eax*4+4] // envp = &argv[argc + 1]
mov ecx, esp ; argv starts just at the current stack top
lea edx, [esp+eax*4+4] ; envp = &argv[argc + 1]
mov edi, [ebx + e_entry] mov edi, [ebx + e_entry]
lea esi, [ebx + szElf32_Ehdr + 2*szElf32_Phdr + szl_info] lea esi, [ebx + szElf32_Ehdr + 2*szElf32_Phdr + szl_info]
sub edi, esi ; length sub edi, esi // length
lea ebx, [2 + ebp] ; f_unfilter, maybe lea ebx, [2 + ebp] // f_unfilter, maybe
pusha ; (cprLen, cprSrc, f_decpr, xx, f_unf, envp, argv, argc) pusha // (cprLen, cprSrc, f_decpr, xx, f_unf, envp, argv, argc)
EXTERN upx_main .extern upx_main
call upx_main ; Call the UPX main function call upx_main // Call the UPX main function
hlt ; Crash if somehow upx_main does return hlt // Crash if somehow upx_main does return
%define __NR_mmap 90 #define __NR_mmap 90
global mmap mmap: .globl mmap
mmap:
push ebx push ebx
lea ebx, [2*4 + esp] lea ebx, [2*4 + esp]
push byte __NR_mmap push __NR_mmap
pop eax pop eax
int 0x80 int 0x80
pop ebx pop ebx
ret ret
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+62 -68
View File
@@ -1,3 +1,4 @@
/*
; l_lx_pti86.asm -- Linux separate ELF PT_INTERP ; l_lx_pti86.asm -- Linux separate ELF PT_INTERP
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -28,24 +29,20 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32 /*************************************************************************
SECTION .text // program entry point
CPU 386 // see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
%define jmps jmp short section LXPTI000
%define jmpn jmp near _start: .globl _start
//// int3
; /************************************************************************* /*
; // program entry point
; // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/
GLOBAL _start
;__LXPTI000__
_start:
;;;; int3
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above. ;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date. ;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as ;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@@ -62,12 +59,13 @@ _start:
;; end ;; end
;; Step through the code; remember that <Enter> repeats the previous command. ;; Step through the code; remember that <Enter> repeats the previous command.
;; ;;
call L200 ; push address of get_funf */
call L200 // push address of get_funf
get_funf: get_funf:
cmp eax, byte 0x46 cmp eax, 0x46
mov ecx, unf46 mov ecx, unf46
je L110 je L110
cmp eax, byte 0x49 cmp eax, 0x49
mov ecx, unf49 mov ecx, unf49
je L110 je L110
L120: L120:
@@ -77,66 +75,67 @@ L110:
none: none:
ret ret
%define M_NRV2B_LE32 2 #define M_NRV2B_LE32 2
%define M_NRV2D_LE32 5 #define M_NRV2D_LE32 5
%define M_NRV2E_LE32 8 #define M_NRV2E_LE32 8
%define M_CL1B_LE32 11 #define M_CL1B_LE32 11
%define M_LZMA 14 #define M_LZMA 14
L200: L200:
call L300 ; push address of get_fexp call L300 // push address of get_fexp
get_fexp: get_fexp:
cmp eax, byte M_NRV2B_LE32 cmp eax, M_NRV2B_LE32
mov ecx, nrv2b mov ecx, nrv2b
je L110 je L110
cmp eax, byte M_NRV2D_LE32 cmp eax, M_NRV2D_LE32
mov ecx, nrv2d mov ecx, nrv2d
je L110 je L110
cmp eax, byte M_NRV2E_LE32 cmp eax, M_NRV2E_LE32
mov ecx, nrv2e mov ecx, nrv2e
je L110 je L110
cmp eax, byte M_CL1B_LE32 cmp eax, M_CL1B_LE32
mov ecx, cl1b mov ecx, cl1b
je L110 je L110
jmpn L120 jmp L120
; /************************************************************************* /*************************************************************************
; // C callable decompressor // C callable decompressor
; **************************************************************************/ **************************************************************************/
;__LXPTI040__ section LXPTI040
nrv2b: nrv2b:
;__LXPTI041__ section LXPTI041
nrv2d: nrv2d:
;__LXPTI042__ section LXPTI042
nrv2e: nrv2e:
;__LXPTI043__ section LXPTI043
cl1b: cl1b:
%define INP dword [esp+8*4+1*4] #define INP dword [esp+8*4+1*4]
%define INS dword [esp+8*4+2*4] #define INS dword [esp+8*4+2*4]
%define OUTP dword [esp+8*4+3*4] #define OUTP dword [esp+8*4+3*4]
%define OUTS dword [esp+8*4+4*4] #define OUTS dword [esp+8*4+4*4]
;__LXPTI050__ section LXPTI050
pusha pusha
; cld // cld
or ebp, byte -1 or ebp, -1
mov esi, INP mov esi, INP
mov edi, OUTP mov edi, OUTP
;;; align 8 // align 8
%include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
%include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
%include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
%include "arch/i386/cl1_d32.ash" #include "arch/i386/cl1_d32_2.ash"
%include "arch/i386/lzma_d.ash" #define db .byte
;__LXPTI090__ #include "arch/i386/lzma_d_2.ash"
jmpn exp_done section LXPTI090
;__LXPTI091__ jmp exp_done
; eax is 0 from decompressor code section LXPTI091
;xor eax, eax ; return code // eax is 0 from decompressor code
//xor eax, eax ; return code
exp_done: exp_done:
; check compressed size // check compressed size
mov edx, INP mov edx, INP
add edx, INS add edx, INS
cmp esi, edx cmp esi, edx
@@ -144,7 +143,7 @@ exp_done:
dec eax dec eax
.ok: .ok:
; write back the uncompressed size // write back the uncompressed size
sub edi, OUTP sub edi, OUTP
mov edx, OUTS mov edx, OUTS
mov [edx], edi mov [edx], edi
@@ -153,18 +152,17 @@ exp_done:
popa popa
ret ret
%include "arch/i386/macros.ash"
cjt32 0 cjt32 0
ctojr32 ctojr32
;__LXPTI140__ section LXPTI140
unf46: unf46:
;__LXPTI141__ section LXPTI141
unf49: unf49:
%define CTO8 dword [esp+8*4+3*4] #define CTO8 dword ptr [esp+8*4+3*4]
;__LXPTI150__ section LXPTI150
pusha pusha
mov edi,INP mov edi,INP
mov ecx,INS mov ecx,INS
@@ -172,18 +170,14 @@ unf49:
ckt32 edi, dl ckt32 edi, dl
;__LXPTI160__ section LXPTI160
popa popa
ret ret
;__LXPTI200__ section LXPTI200
L300: L300:
eof: eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+61 -62
View File
@@ -1,3 +1,4 @@
/*
; fold_pti86.asm -- linkage to C code to act as ELF PT_INTERP ; fold_pti86.asm -- linkage to C code to act as ELF PT_INTERP
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -26,85 +27,84 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32 #define PAGE_SIZE ( 1<<12)
SECTION .text
CPU 386
#define AT_NULL 0
#define AT_PHDR 3
%define PAGE_SIZE ( 1<<12) #define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_entry (16 + 2*2 + 4)
#define p_vaddr 2*4
#define p_memsz 5*4
#define szb_info 12
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
%define AT_NULL 0 #define MAP_FIXED 0x10
%define AT_PHDR 3 #define MAP_PRIVATE 0x02
#define MAP_ANONYMOUS 0x20
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4
#define __NR_mmap 90
#define __NR_munmap 91
%define szElf32_Ehdr 0x34 #define OVERHEAD 2048
%define szElf32_Phdr 8*4 #define MAX_ELF_HDR 512
%define e_entry (16 + 2*2 + 4)
%define p_vaddr 2*4
%define p_memsz 5*4
%define szb_info 12
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
%define MAP_FIXED 0x10 pop ebp // get_fexp
%define MAP_PRIVATE 0x02 pop ecx // get_funf
%define MAP_ANONYMOUS 0x20 pop eax // argc
%define PROT_READ 1 lea edi, [4+ 4*eax + esp] // &environ
%define PROT_WRITE 2 push eax // argc
%define PROT_EXEC 4
%define __NR_mmap 90
%define __NR_munmap 91
%define OVERHEAD 2048 sub eax,eax // 0
%define MAX_ELF_HDR 512
pop ebp ; get_fexp
pop ecx ; get_funf
pop eax ; argc
lea edi, [4+ 4*eax + esp] ; &environ
push eax ; argc
sub eax,eax ; 0
L310: L310:
scasd scasd
jne L310 jne L310
scasd ; edi= &Elf32_auxv_t scasd // edi= &Elf32_auxv_t
mov esi,edi mov esi,edi
L320: L320:
mov eax,[esi] ; a_type mov eax,[esi] // a_type
cmp eax, byte AT_PHDR cmp eax, AT_PHDR
je L330 je L330
add esi, byte sz_auxv add esi, sz_auxv
cmp eax, byte AT_NULL cmp eax, AT_NULL
jne L320 jne L320
L330: L330:
mov ebx,[a_val + esi] mov ebx,[a_val + esi]
push ebx ; save &Elf32_Phdr of compressed data push ebx // save &Elf32_Phdr of compressed data
sub esp, dword MAX_ELF_HDR + OVERHEAD ; working storage sub esp, MAX_ELF_HDR + OVERHEAD // working storage
mov edx, esp mov edx, esp
push ecx ; get_funf 9th param to pti_main push ecx // get_funf 9th param to pti_main
lea eax, [2*szElf32_Phdr + szl_info + szp_info + ebx] ; 1st &b_info lea eax, [2*szElf32_Phdr + szl_info + szp_info + ebx] // 1st &b_info
mov esi, [e_entry + ebx] ; beyond compressed data mov esi, [e_entry + ebx] // beyond compressed data
sub esi, eax ; length of compressed data sub esi, eax // length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, byte szb_info add ecx, szb_info
pusha ; (AT_table, sz_cpr, get_fexp, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} ) pusha // (AT_table, sz_cpr, get_fexp, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
EXTERN pti_main .extern pti_main
call pti_main ; returns entry address call pti_main // returns entry address
add esp, dword 9*4 + MAX_ELF_HDR + OVERHEAD ; remove 9 params, temp space add esp, 9*4 + MAX_ELF_HDR + OVERHEAD // remove 9 params, temp space
pop ebx ; &Elf32_Phdr pop ebx // &Elf32_Phdr
push eax ; save entry address push eax // save entry address
mov ecx,[p_memsz + ebx] mov ecx,[p_memsz + ebx]
mov ebx,[p_vaddr + ebx] mov ebx,[p_vaddr + ebx]
mov eax,__NR_munmap mov eax,__NR_munmap
int 0x80 ; unmap compressed data int 0x80 // unmap compressed data
sub eax,eax sub eax,eax
sub ecx,ecx sub ecx,ecx
@@ -113,19 +113,18 @@ EXTERN pti_main
sub ebp,ebp sub ebp,ebp
sub esi,esi sub esi,esi
sub edi,edi sub edi,edi
ret ; goto entry point ret // goto entry point
%define __NR_mmap 90 #define __NR_mmap 90
global mmap mmap: .globl mmap
mmap:
push ebx push ebx
lea ebx, [2*4 + esp] lea ebx, [2*4 + esp]
push byte __NR_mmap push __NR_mmap
pop eax pop eax
int 0x80 int 0x80
pop ebx pop ebx
ret ret
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+69 -71
View File
@@ -1,3 +1,4 @@
/*
; l_lx_sh86.asm -- Linux program entry point & decompressor (shell script) ; l_lx_sh86.asm -- Linux program entry point & decompressor (shell script)
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -28,21 +29,21 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
BITS 32 // CPU 386
SECTION .text
CPU 386
; /************************************************************************* /*************************************************************************
; // program entry point // program entry point
; // see glibc/sysdeps/i386/elf/start.S // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/ **************************************************************************/
GLOBAL _start section LEXEC000
;__LEXEC000__ _start: .globl _start
_start: //// int3
;;;; int3 /*
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above. ;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date. ;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as ;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@@ -59,42 +60,43 @@ _start:
;; end ;; end
;; Step through the code; remember that <Enter> repeats the previous command. ;; Step through the code; remember that <Enter> repeats the previous command.
;; ;;
*/
call main ; push address of decompress subroutine call main // push address of decompress subroutine
decompress: decompress:
; /************************************************************************* /*************************************************************************
; // C callable decompressor // C callable decompressor
; **************************************************************************/ **************************************************************************/
%define INP dword [esp+8*4+4] #define INP dword [esp+8*4+4]
%define INS dword [esp+8*4+8] #define INS dword [esp+8*4+8]
%define OUTP dword [esp+8*4+12] #define OUTP dword [esp+8*4+12]
%define OUTS dword [esp+8*4+16] #define OUTS dword [esp+8*4+16]
;__LEXEC010__ section LEXEC010
pusha pusha
; cld ; cld
mov esi, INP mov esi, INP
mov edi, OUTP mov edi, OUTP
or ebp, byte -1 or ebp, -1
;;; align 8 // .balign 8
%include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
%include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
%include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
%include "arch/i386/cl1_d32.ash" #include "arch/i386/cl1_d32_2.ash"
%include "arch/i386/lzma_d.ash" #define db .byte
%include "arch/i386/macros.ash" #include "arch/i386/lzma_d_2.ash"
cjt32 0 cjt32 0
;__LEXEC015__ section LEXEC015
; eax is 0 from decompressor code // eax is 0 from decompressor code
;xor eax, eax ; return code //xor eax, eax ; return code
; check compressed size // check compressed size
mov edx, INP mov edx, INP
add edx, INS add edx, INS
cmp esi, edx cmp esi, edx
@@ -102,65 +104,61 @@ decompress:
dec eax dec eax
.ok: .ok:
; write back the uncompressed size // write back the uncompressed size
sub edi, OUTP sub edi, OUTP
mov edx, OUTS mov edx, OUTS
mov [edx], edi mov [edx], edi
mov [7*4 + esp], eax mov [7*4 + esp], eax
;__LEXEC017__ section LEXEC017
popa popa
ret ret
;__LEXEC020__ section LEXEC020
%define PAGE_SIZE ( 1<<12) #define PAGE_SIZE ( 1<<12)
%define MAP_FIXED 0x10 #define MAP_FIXED 0x10
%define MAP_PRIVATE 0x02 #define MAP_PRIVATE 0x02
%define MAP_ANONYMOUS 0x20 #define MAP_ANONYMOUS 0x20
%define PROT_READ 1 #define PROT_READ 1
%define PROT_WRITE 2 #define PROT_WRITE 2
%define PROT_EXEC 4 #define PROT_EXEC 4
%define __NR_mmap 90 #define __NR_mmap 90
%define szElf32_Ehdr 0x34 #define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4 #define szElf32_Phdr 8*4
%define e_entry (16 + 2*2 + 4) #define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4 #define p_memsz 5*4
%define szl_info 12 #define szl_info 12
%define szp_info 12 #define szp_info 12
%define p_filesize 4 #define p_filesize 4
; Decompress the rest of this loader, and jump to it // Decompress the rest of this loader, and jump to it
main: main:
pop ebp ; &decompress pop ebp // &decompress
mov eax,0x1400000 ; &Elf32_Ehdr of this stub mov eax,0x1400000 // &Elf32_Ehdr of this stub
lea edx,[0x80 + szp_info + eax] ; &cprScript lea edx,[0x80 + szp_info + eax] // &cprScript
add eax,[p_memsz + szElf32_Ehdr + eax] ; after .text add eax,[p_memsz + szElf32_Ehdr + eax] // after .text
add eax,PAGE_SIZE -1 add eax,PAGE_SIZE -1
and eax, -PAGE_SIZE ; round up to next page and eax, 0-PAGE_SIZE // round up to next page
push byte 0 push 0
push byte -1 push -1
push byte MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS push MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
push byte PROT_READ | PROT_WRITE push PROT_READ | PROT_WRITE
push dword [edx] ; sz_unc length push dword ptr [edx] // sz_unc length
push eax ; address push eax // address
mov ebx,esp mov ebx,esp
push byte __NR_mmap push __NR_mmap
pop eax pop eax
int 0x80 int 0x80
add esp, byte 6*4 ; remove arguments add esp, 6*4 // remove arguments
lea ebx,[3+ eax] ; space for "-c" lea ebx,[3+ eax] // space for "-c"
; fall into fold [not compressed!] // fall into fold [not compressed!]
eof: eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+85 -85
View File
@@ -1,3 +1,4 @@
/*
; fold_sh86.asm -- Linux program entry point & decompressor (shell script) ; fold_sh86.asm -- Linux program entry point & decompressor (shell script)
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -28,151 +29,150 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
BITS 32 // CPU 386
SECTION .text
CPU 386
%define PAGE_SIZE ( 1<<12) #define PAGE_SIZE ( 1<<12)
%define szElf32_Ehdr 0x34 #define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4 #define szElf32_Phdr 8*4
%define e_entry (16 + 2*2 + 4) #define e_entry (16 + 2*2 + 4)
%define szl_info 12 #define szl_info 12
%define szp_info 12 #define szp_info 12
%define a_type 0 #define a_type 0
%define a_val 4 #define a_val 4
%define sz_auxv 8 #define sz_auxv 8
fold_begin: ; In: %ebx= uncDst; edx= &b_info cprSrc; ebp = &decompress fold_begin: // In: %ebx= uncDst; edx= &b_info cprSrc; ebp = &decompress
; Move argc,argv,envp down to make room for complete Elf_auxv table. // Move argc,argv,envp down to make room for complete Elf_auxv table.
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM // Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?) // because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
; give not quite everything. It is simpler and smaller code for us // give not quite everything. It is simpler and smaller code for us
; to generate a "complete" table where Elf_auxv[k -1].a_type = k. // to generate a "complete" table where Elf_auxv[k -1].a_type = k.
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance // ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance
%define AT_NULL 0 #define AT_NULL 0
%define AT_IGNORE 1 #define AT_IGNORE 1
%define AT_PHDR 3 #define AT_PHDR 3
%define AT_NUMBER (5+ 37) #define AT_NUMBER (5+ 37)
; 2002-11-09 glibc-2.2.90 AT_IGNOREPPC==22 plus 5 for future growth // 2002-11-09 glibc-2.2.90 AT_IGNOREPPC==22 plus 5 for future growth
; 2006-05-15 glibc-2.4-4 AT_L3_CACHESHAPE==37 // 2006-05-15 glibc-2.4-4 AT_L3_CACHESHAPE==37
mov esi, esp mov esi, esp
sub esp, sz_auxv * AT_NUMBER ; more than 128 bytes sub esp, sz_auxv * AT_NUMBER // more than 128 bytes
mov edi, esp mov edi, esp
do_auxv: ; entry: %esi=src = &argc; %edi=dst. exit: %edi= &AT_NULL do_auxv: // entry: %esi=src = &argc; %edi=dst. exit: %edi= &AT_NULL
; cld // cld
L10: ; move argc+argv L10: // move argc+argv
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L10 jne L10
L20: ; move envp L20: // move envp
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L20 jne L20
; complete Elf_auxv table full of AT_IGNORE // complete Elf_auxv table full of AT_IGNORE
push edi ; save base of resulting table push edi // save base of resulting table
inc eax ; convert 0 to AT_IGNORE inc eax // convert 0 to AT_IGNORE
push byte 2 * (AT_NUMBER -1) ; less than 128 push 2 * (AT_NUMBER -1) // less than 128
pop ecx pop ecx
rep stosd rep stosd
dec eax ; convert AT_IGNORE into AT_NULL dec eax // convert AT_IGNORE into AT_NULL
stosd ; terminate Elf_auxv stosd // terminate Elf_auxv
stosd stosd
pop edi ; base of resulting table pop edi // base of resulting table
L30: ; distribute existing Elf32_auxv into new table L30: // distribute existing Elf32_auxv into new table
lodsd lodsd
test eax,eax ; AT_NULL ? test eax,eax // AT_NULL ?
xchg eax,ecx ; edx is busy, do not use xchg eax,ecx // edx is busy, do not use
lodsd lodsd
je L40 je L40
cmp ecx, byte AT_NUMBER cmp ecx, AT_NUMBER
jae L30 jae L30
mov [a_type + sz_auxv*(ecx -1) + edi], ecx mov [a_type + sz_auxv*(ecx -1) + edi], ecx
mov [a_val + sz_auxv*(ecx -1) + edi], eax mov [a_val + sz_auxv*(ecx -1) + edi], eax
jmp L30 jmp L30
L40: L40:
%define OVERHEAD 2048 #define OVERHEAD 2048
%define MAX_ELF_HDR 512 #define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD sub esp, MAX_ELF_HDR + OVERHEAD
xchg eax, ebx ; eax= uncDst xchg eax, ebx // eax= uncDst
mov ecx, [ edx] ; sz_unc mov ecx, [ edx] // sz_unc
mov ebx, [4+ edx] ; sz_cpr mov ebx, [4+ edx] // sz_cpr
mov esi, eax ; extra copy of uncDst mov esi, eax // extra copy of uncDst
pusha ; (AT_table,uncDst,f_decpr,&ehdr,{sz_cpr,cprSrc},{sz_unc,uncDst}) pusha // (AT_table,uncDst,f_decpr,&ehdr,{sz_cpr,cprSrc},{sz_unc,uncDst})
EXTERN upx_main .extern upx_main
call upx_main ; entry = upx_main(...) call upx_main // entry = upx_main(...)
pop ecx ; junk pop ecx // junk
push eax ; save entry address push eax // save entry address
popa ; edi= entry address; esi= uncDst popa // edi= entry address; esi= uncDst
add esp, dword MAX_ELF_HDR + OVERHEAD ; remove temp space add esp, MAX_ELF_HDR + OVERHEAD // remove temp space
pop ecx ; argc pop ecx // argc
pop edx ; $0 filename, to become argv[0] pop edx // $0 filename, to become argv[0]
push edx ; restore $0 filename push edx // restore $0 filename
inc ecx inc ecx
push esi ; &uncompressed shell script push esi // &uncompressed shell script
sub esi, byte 3 sub esi, 3
mov [esi], word 0x632d ; "-c" mov word ptr [esi], 0x632d // "-c"
inc ecx inc ecx
push esi ; &"-c" push esi // &"-c"
inc ecx inc ecx
push edx ; argv[0] is duplicate of $0 push edx // argv[0] is duplicate of $0
push ecx ; new argc push ecx // new argc
push edi ; save entry address push edi // save entry address
; _dl_start and company (ld-linux.so.2) assumes that it has virgin stack, // _dl_start and company (ld-linux.so.2) assumes that it has virgin stack,
; and does not initialize all its stack local variables to zero. // and does not initialize all its stack local variables to zero.
; Ulrich Drepper (drepper@cyngus.com) has refused to fix the bugs. // Ulrich Drepper (drepper@cyngus.com) has refused to fix the bugs.
; See GNU wwwgnats libc/1165 . // See GNU wwwgnats libc/1165 .
%define N_STKCLR (0x100 + MAX_ELF_HDR + OVERHEAD)/4 #define N_STKCLR (0x100 + MAX_ELF_HDR + OVERHEAD)/4
lea edi, [esp - 4*N_STKCLR] lea edi, [esp - 4*N_STKCLR]
pusha ; values will be zeroed pusha // values will be zeroed
mov ebx,esp ; save mov ebx,esp // save
mov esp,edi ; Linux does not grow stack below esp mov esp,edi // Linux does not grow stack below esp
mov ecx, N_STKCLR mov ecx, N_STKCLR
xor eax,eax xor eax,eax
rep stosd rep stosd
mov esp,ebx ; restore mov esp,ebx // restore
; Because the decompressed shell script occupies low memory anyway, // Because the decompressed shell script occupies low memory anyway,
; there isn't much payback to unmapping the compressed script and // there isn't much payback to unmapping the compressed script and
; ourselves the stub. We would need a place to put the escape hatch // ourselves the stub. We would need a place to put the escape hatch
; "int $0x80; popa; ret", and some kernels do not allow execution // "int $0x80; popa; ret", and some kernels do not allow execution
; on the stack. So, we would have to dirty a page of the shell // on the stack. So, we would have to dirty a page of the shell
; or of /lib/ld-linux.so. It's simpler just to omit the unmapping. // or of /lib/ld-linux.so. It's simpler just to omit the unmapping.
popa popa
ret ret
%define __NR_mmap 90 #define __NR_mmap 90
global mmap mmap: .globl mmap
mmap:
push ebx push ebx
lea ebx, [2*4 + esp] lea ebx, [2*4 + esp]
push byte __NR_mmap push __NR_mmap
pop eax pop eax
int 0x80 int 0x80
pop ebx pop ebx
ret ret
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+7 -7
View File
@@ -30,7 +30,7 @@
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
*/ */
#include "arch/i386/macros2.ash" #include "arch/i386/macros2.ash"
/* /*
; ============= ; =============
@@ -62,11 +62,11 @@ section LXMOVEUP
// ============= DECOMPRESSION // ============= DECOMPRESSION
// ============= // =============
//#include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
//#include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
//#include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash" #define db .byte
//#include "arch/i386/lzma_d.ash" #include "arch/i386/lzma_d_2.ash"
// ============= // =============
// ============= UNFILTER // ============= UNFILTER
@@ -130,6 +130,6 @@ move_up:
or ebp, -1 // decompressor assumption or ebp, -1 // decompressor assumption
jmp eax // enter moved decompressor jmp eax // enter moved decompressor
#include "include/header2.ash" #include "include/header2.ash"
// vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+6 -6
View File
@@ -28,7 +28,7 @@
*/ */
#include "arch/i386/macros2.ash" #include "arch/i386/macros2.ash"
// ============= // =============
// ============= ENTRY POINT // ============= ENTRY POINT
@@ -118,11 +118,11 @@ section LZCUTPOI
// ============= DECOMPRESSION // ============= DECOMPRESSION
// ============= // =============
//#include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
//#include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
//#include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash" #define db .byte
//#include "arch/i386/lzma_d.ash" #include "arch/i386/lzma_d_2.ash"
// ============= // =============
// ============= UNFILTER // ============= UNFILTER
+146 -158
View File
@@ -1,3 +1,4 @@
/*
; i386-openbsd.elf-fold.asm -- linkage to C code to process Elf binary ; i386-openbsd.elf-fold.asm -- linkage to C code to process Elf binary
; ;
; This file is part of the UPX executable compressor. ; This file is part of the UPX executable compressor.
@@ -26,262 +27,249 @@
; John F. Reiser ; John F. Reiser
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/
#include "arch/i386/macros2.ash"
#define PAGE_SIZE ( 1<<12)
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_type 16
#define e_entry (16 + 2*2 + 4)
#define p_memsz 5*4
#define sznote 0x18
#define szb_info 12
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
BITS 32 #define __NR_munmap 73
SECTION .text
CPU 386
%define PAGE_SIZE ( 1<<12) // control just falls through, after this part and compiled C code
%define szElf32_Ehdr 0x34 // are uncompressed.
%define szElf32_Phdr 8*4
%define e_type 16
%define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4
%define sznote 0x18
%define szb_info 12
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
%define __NR_munmap 73 fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
// patchLoader will modify to be
// dword sz_uncompressed, sz_compressed
// byte compressed_data...
;; control just falls through, after this part and compiled C code // ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
;; are uncompressed. // Move argc,argv,envp down to make room for Elf_auxv table.
// Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
// because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
// give not quite everything. It is simpler and smaller code for us
// to generate a "complete" table where Elf_auxv[k -1].a_type = k.
// On second thought, that wastes a lot of stack space (the entire kernel
// auxv, plus those slots that remain empty anyway). So try for minimal
// space on stack, without too much code, by doing it serially.
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program #define AT_NULL 0
; patchLoader will modify to be #define AT_IGNORE 1
; dword sz_uncompressed, sz_compressed #define AT_PHDR 3
; byte compressed_data... #define AT_PHENT 4
#define AT_PHNUM 5
#define AT_PAGESZ 6
#define AT_BASE 7
#define AT_ENTRY 9
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance. #define ET_DYN 3
; Move argc,argv,envp down to make room for Elf_auxv table.
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
; give not quite everything. It is simpler and smaller code for us
; to generate a "complete" table where Elf_auxv[k -1].a_type = k.
; On second thought, that wastes a lot of stack space (the entire kernel
; auxv, plus those slots that remain empty anyway). So try for minimal
; space on stack, without too much code, by doing it serially.
%define AT_NULL 0
%define AT_IGNORE 1
%define AT_PHDR 3
%define AT_PHENT 4
%define AT_PHNUM 5
%define AT_PAGESZ 6
%define AT_BASE 7
%define AT_ENTRY 9
%define ET_DYN 3
sub ecx, ecx sub ecx, ecx
mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_BASE) | (1<<AT_ENTRY) mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_BASE) | (1<<AT_ENTRY)
mov esi, esp mov esi, esp
mov edi, esp mov edi, esp
call do_auxv ; clear bits in edx according to existing auxv slots call do_auxv // clear bits in edx according to existing auxv slots
mov esi, esp mov esi, esp
L50: L50:
shr edx, 1 ; Carry = bottom bit shr edx, 1 // Carry = bottom bit
sbb eax, eax ; -1 or 0 sbb eax, eax // -1 or 0
sub ecx, eax ; count of 1 bits that remained in edx sub ecx, eax // count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] ; allocate one auxv slot, if needed lea esp, [esp + sz_auxv * eax] // allocate one auxv slot, if needed
test edx,edx test edx,edx
jne L50 jne L50
mov edi, esp mov edi, esp
call do_auxv ; move; fill new auxv slots with AT_IGNORE call do_auxv // move; fill new auxv slots with AT_IGNORE
%define OVERHEAD 2048 #define OVERHEAD 2048
%define MAX_ELF_HDR 512 #define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD ; alloca sub esp, MAX_ELF_HDR + OVERHEAD // alloca
push ebx ; start of unmap region (&Elf32_Ehdr of this stub) push ebx // start of unmap region (&Elf32_Ehdr of this stub)
; Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss, // Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
; but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X. // but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] ; phdr[0].p_memsz mov edx, [p_memsz + szElf32_Ehdr + ebx] // phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] ; 1 page for round, 1 for unfold lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] // 1 page for round, 1 for unfold
and edx, -PAGE_SIZE and edx, 0-PAGE_SIZE
push edx ; end of unmap region push edx // end of unmap region
sub eax, eax ; 0 sub eax, eax // 0
cmp word [e_type + ebx], byte ET_DYN cmp word ptr [e_type + ebx], ET_DYN
jne L53 jne L53
xchg eax, edx ; dynbase for ET_DYN; assumes mmap(0, ...) is placed after us! xchg eax, edx // dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
L53: L53:
push eax ; dynbase push eax // dynbase
mov esi, [e_entry + ebx] ; end of compressed data mov esi, [e_entry + ebx] // end of compressed data
lea eax, [szElf32_Ehdr + 3*szElf32_Phdr + sznote + szl_info + szp_info + ebx] ; 1st &b_info lea eax, [szElf32_Ehdr + 3*szElf32_Phdr + sznote + szl_info + szp_info + ebx] // 1st &b_info
sub esi, eax ; length of compressed data sub esi, eax // length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, byte szb_info add ecx, szb_info
lea edx, [3*4 + esp] ; &tmp lea edx, [3*4 + esp] // &tmp
pusha ; (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} ) pusha // (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi ; swap with above 'pusha' to inhibit auxv_up for PT_INTERP inc edi // swap with above 'pusha' to inhibit auxv_up for PT_INTERP
EXTERN upx_main .extern upx_main
call upx_main ; returns entry address call upx_main // returns entry address
add esp, byte (8 +1)*4 ; remove 8 params from pusha, also dynbase add esp, (8 +1)*4 // remove 8 params from pusha, also dynbase
pop ecx ; end of unmap region pop ecx // end of unmap region
pop ebx ; start of unmap region (&Elf32_Ehdr of this stub) pop ebx // start of unmap region (&Elf32_Ehdr of this stub)
add esp, dword MAX_ELF_HDR + OVERHEAD ; un-alloca add esp, MAX_ELF_HDR + OVERHEAD // un-alloca
push eax ; save entry address as ret.addr push eax // save entry address as ret.addr
push byte 0 ; 'leave' uses this to clear ebp push 0 // 'leave' uses this to clear ebp
mov ebp,esp ; frame mov ebp,esp // frame
sub ecx, ebx sub ecx, ebx
sub eax,eax ; 0, also AT_NULL sub eax,eax // 0, also AT_NULL
push ecx ; length to unmap push ecx // length to unmap
push ebx ; start of unmap region (&Elf32_Ehdr of this stub) push ebx // start of unmap region (&Elf32_Ehdr of this stub)
push eax ; fake ret.addr push eax // fake ret.addr
dec edi ; auxv table dec edi // auxv table
db 0x3c ; "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter .byte 0x3c // "cmpb al, ..." like "jmp 1+L60" but 1 byte shorter
L60: L60:
scasd ; a_un.a_val etc. scasd // a_un.a_val etc.
scasd ; a_type scasd // a_type
jne L60 ; not AT_NULL jne L60 // not AT_NULL
; edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch() // edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push dword [edi] ; &escape hatch push dword ptr [edi] // &escape hatch
xor edi,edi xor edi,edi
xor esi,esi xor esi,esi
xor edx,edx xor edx,edx
xor ecx,ecx xor ecx,ecx
xor ebx,ebx xor ebx,ebx
mov al, __NR_munmap ; eax was 0 from L60 mov al, __NR_munmap // eax was 0 from L60
ret ; goto escape hatch: int 0x80; leave; ret ret // goto escape hatch: int 0x80; leave; ret
; called twice: // called twice:
; 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx. // 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
; 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots // 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
; entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted // entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
; exit: edi= &auxtab; edx= bits still needed // exit: edi= &auxtab; edx= bits still needed
do_auxv: do_auxv:
; cld // cld
L10: ; move argc+argv L10: // move argc+argv
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L10 jne L10
L20: ; move envp L20: // move envp
lodsd lodsd
stosd stosd
test eax,eax test eax,eax
jne L20 jne L20
push edi ; return value push edi // return value
L30: ; process auxv L30: // process auxv
lodsd ; a_type lodsd // a_type
stosd stosd
cmp eax, byte 32 cmp eax, 32
jae L32 ; prevent aliasing by 'btr' when 32<=a_type jae L32 // prevent aliasing by 'btr' when 32<=a_type
btr edx, eax ; no longer need a slot of type eax [Carry only] btr edx, eax // no longer need a slot of type eax [Carry only]
L32: L32:
test eax, eax ; AT_NULL ? test eax, eax // AT_NULL ?
lodsd lodsd
stosd stosd
jnz L30 ; a_type != AT_NULL jnz L30 // a_type != AT_NULL
sub edi, byte 8 ; backup to AT_NULL sub edi, 8 // backup to AT_NULL
add ecx, ecx ; two words per auxv add ecx, ecx // two words per auxv
inc eax ; convert 0 to AT_IGNORE inc eax // convert 0 to AT_IGNORE
rep stosd ; allocate and fill rep stosd // allocate and fill
dec eax ; convert AT_IGNORE to AT_NULL dec eax // convert AT_IGNORE to AT_NULL
stosd ; re-terminate with AT_NULL stosd // re-terminate with AT_NULL
stosd stosd
pop edi ; &auxtab pop edi // &auxtab
ret ret
%define __NR_mmap 197 #define __NR_mmap 197
%define __NR_syscall 198 #define __NR_syscall 198
global mmap mmap: .globl mmap
mmap:
push ebp push ebp
mov ebp,esp mov ebp,esp
xor eax,eax ; 0 xor eax,eax // 0
push eax ; convert to 64-bit push eax // convert to 64-bit
push dword [7*4+ebp] ; offset push dword ptr [7*4+ebp] // offset
push eax ; pad push eax // pad
push dword [6*4+ebp] ; fd push dword ptr [6*4+ebp] // fd
push dword [5*4+ebp] ; flags push dword ptr [5*4+ebp] // flags
push dword [4*4+ebp] ; prot push dword ptr [4*4+ebp] // prot
push dword [3*4+ebp] ; len push dword ptr [3*4+ebp] // len
push dword [2*4+ebp] ; addr push dword ptr [2*4+ebp] // addr
push eax ; current thread push eax // current thread
mov al,__NR_mmap mov al,__NR_mmap
push eax push eax
push eax ; fake ret.addr push eax // fake ret.addr
mov al,__NR_syscall mov al,__NR_syscall
int 0x80 int 0x80
leave leave
ret ret
global brk brk: .globl brk
brk:
ret ret
global bkpt bkpt: .globl bkpt
bkpt:
int3 int3
ret ret
%define __NR_exit 1 #define __NR_exit 1
%define __NR_read 3 #define __NR_read 3
%define __NR_write 4 #define __NR_write 4
%define __NR_open 5 #define __NR_open 5
%define __NR_close 6 #define __NR_close 6
%define __NR_munmap 73 #define __NR_munmap 73
%define __NR_mprotect 74 #define __NR_mprotect 74
global exit exit: .globl exit
exit:
mov al,__NR_exit mov al,__NR_exit
nf_sysgo: nf_sysgo:
movzx eax,al movzx eax,al
int 0x80 int 0x80
ret ret
global read read: .globl read
read:
mov al,__NR_read mov al,__NR_read
jmp nf_sysgo jmp nf_sysgo
global write write: .globl write
write:
mov al,__NR_write mov al,__NR_write
jmp nf_sysgo jmp nf_sysgo
global open open: .globl open
open:
mov al,__NR_open mov al,__NR_open
jmp nf_sysgo jmp nf_sysgo
global close close: .globl close
close:
mov al,__NR_close mov al,__NR_close
jmp nf_sysgo jmp nf_sysgo
global munmap munmap: .globl munmap
munmap:
mov al,__NR_munmap mov al,__NR_munmap
jmp nf_sysgo jmp nf_sysgo
global mprotect mprotect: .globl mprotect
mprotect:
mov al,__NR_mprotect mov al,__NR_mprotect
jmp nf_sysgo jmp nf_sysgo
; vi:ts=8:et:nowrap // vi:ts=8:et:nowrap
+6 -6
View File
@@ -28,7 +28,7 @@
*/ */
#define UPX102 1 #define UPX102 1
#include "arch/i386/macros2.ash" #include "arch/i386/macros2.ash"
CPU 386 CPU 386
@@ -57,11 +57,11 @@ section PEMAIN02
// ============= DECOMPRESSION // ============= DECOMPRESSION
// ============= // =============
//#include "arch/i386/nrv2b_d32.ash" #include "arch/i386/nrv2b_d32_2.ash"
//#include "arch/i386/nrv2d_d32.ash" #include "arch/i386/nrv2d_d32_2.ash"
//#include "arch/i386/nrv2e_d32.ash" #include "arch/i386/nrv2e_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash" #define db .byte
//#include "arch/i386/lzma_d.ash" #include "arch/i386/lzma_d_2.ash"
// ============= // =============
section PEMAIN10 section PEMAIN10
+8
View File
@@ -124,6 +124,14 @@ int upx_tolower(int c);
#endif #endif
class nocopy
{
nocopy(const nocopy &); // undefined
nocopy& operator=(const nocopy &); // undefined
public:
inline nocopy() {}
};
#endif /* already included */ #endif /* already included */