This commit is contained in:
László Molnár
2006-07-17 12:13:08 +02:00
65 changed files with 34329 additions and 16009 deletions
+2
View File
@@ -9,3 +9,5 @@ b0353253b0b3d062eb5adb50d4b665a96620da45 RELEASE_195
c2e0cd4d621b047f254f2def42132a03683ff52c RELEASE_192 c2e0cd4d621b047f254f2def42132a03683ff52c RELEASE_192
eb1ce56dce7dd1835964362470610925963b9043 RELEASE_110 eb1ce56dce7dd1835964362470610925963b9043 RELEASE_110
ed96891ef795bceec6b7ff3ca1ca7764431bfb39 RELEASE_191 ed96891ef795bceec6b7ff3ca1ca7764431bfb39 RELEASE_191
8afead5e7182950592970330c218913fecfbe390 jfr-2006-07-12
72fe9925b247073cd8342d8bff07adc47b72173f main-2006-07-12
+54 -21
View File
@@ -71,6 +71,7 @@ struct DefaultLinker::Section
int istart; int istart;
int ostart; int ostart;
int len; int len;
unsigned char align;
DefaultLinker::Label name; DefaultLinker::Label name;
}; };
@@ -196,13 +197,14 @@ int DefaultLinker::addSection(const char *sname)
} }
void DefaultLinker::addSection(const char *sname, const void *sdata, int slen) void DefaultLinker::addSection(const char *sname, const void *sdata, int slen, int align)
{ {
assert(!frozen); assert(!frozen);
// add a new section - can be used for adding stuff like ident or header // add a new section - can be used for adding stuff like ident or header
sections[nsections].name.set(sname); sections[nsections].name.set(sname);
sections[nsections].istart = ilen; sections[nsections].istart = ilen;
sections[nsections].len = slen; sections[nsections].len = slen;
sections[nsections].align = align;
sections[nsections++].ostart = olen; sections[nsections++].ostart = olen;
assert(nsections < NSECTIONS); assert(nsections < NSECTIONS);
memcpy(iloader+ilen, sdata, slen); memcpy(iloader+ilen, sdata, slen);
@@ -314,10 +316,10 @@ int SimpleLinker::addSection(const char *sname)
} }
void SimpleLinker::addSection(const char *sname, const void *sdata, int slen) void SimpleLinker::addSection(const char *sname, const void *sdata, int slen, int align)
{ {
assert(!frozen); assert(!frozen);
UNUSED(sname); UNUSED(sdata); UNUSED(slen); UNUSED(sname); UNUSED(sdata); UNUSED(slen); UNUSED(align);
assert(0); assert(0);
} }
@@ -350,8 +352,8 @@ unsigned char *SimpleLinker::getLoader(int *llen)
// //
**************************************************************************/ **************************************************************************/
ElfLinker::Section::Section(const char *n, const void *i, unsigned s) : ElfLinker::Section::Section(const char *n, const void *i, unsigned s, unsigned a) :
name(strdup(n)), output(NULL), size(s), offset(0), next(NULL) name(strdup(n)), output(NULL), size(s), offset(0), align(a), next(NULL)
{ {
assert(name); assert(name);
input = malloc(s + 1); input = malloc(s + 1);
@@ -388,24 +390,24 @@ void ElfLinker::preprocessSections(char *start, const char *end)
while (start < end) while (start < end)
{ {
char name[1024]; char name[1024];
unsigned offset, size; unsigned offset, size, align;
char *nextl = strchr(start, '\n'); char *nextl = strchr(start, '\n');
assert(nextl != NULL); assert(nextl != NULL);
if (sscanf(start, "%*d %1023s %x %*d %*d %x", if (sscanf(start, "%*d %1023s %x %*d %*d %x 2**%d",
name, &size, &offset) == 3) name, &size, &offset, &align) == 4)
{ {
char *n = strstr(start, name); char *n = strstr(start, name);
n[strlen(name)] = 0; n[strlen(name)] = 0;
addSection(n, input + offset, size); addSection(n, input + offset, size, align);
//printf("section %s preprocessed\n", n); //printf("section %s preprocessed\n", n);
} }
start = nextl + 1; start = nextl + 1;
} }
addSection("*ABS*", NULL, 0); addSection("*ABS*", NULL, 0, 0);
addSection("*UND*", NULL, 0); addSection("*UND*", NULL, 0, 0);
} }
void ElfLinker::preprocessSymbols(char *start, const char *end) void ElfLinker::preprocessSymbols(char *start, const char *end)
@@ -464,8 +466,17 @@ void ElfLinker::preprocessRelocations(char *start, const char *end)
unsigned add = 0; unsigned add = 0;
if (char *p = strstr(symbol, "+0x")) if (char *p = strstr(symbol, "+0x"))
{ {
*p = 0; // Beware: sscanf("0xfffffffffffffffc", "%x", &add) ==> -1 == add
sscanf(p + 3, "%x", &add); // because conversion stops after 32 bits for a non-long.
// Also, glibc-2.3.5 has a bug: even using "%lx" still gives -1 instead of -4.
long addend;
*p = 0; // terminate the symbol name
p+=3;
if ('f'==p[0] && 0==strncmp(p, "ffffffff", 8)) {
p+=8; // workaround a bug in glibc-2.3.5
}
sscanf(p, "%lx", &addend);
add = (unsigned)addend;
} }
addRelocation(section->name, offset, t, symbol, add); addRelocation(section->name, offset, t, symbol, add);
@@ -605,6 +616,15 @@ int ElfLinker::addSection(const char *sname)
else else
{ {
Section *section = findSection(sect); Section *section = findSection(sect);
if (section->align) {
unsigned const v = ~0u << section->align;
assert(tail);
if (unsigned const l = ~v & -(tail->offset + tail->size)) {
align(l);
tail->size += l;
outputlen += l;
}
}
memcpy(output + outputlen, section->input, section->size); memcpy(output + outputlen, section->input, section->size);
section->output = output + outputlen; section->output = output + outputlen;
outputlen += section->size; outputlen += section->size;
@@ -625,13 +645,13 @@ int ElfLinker::addSection(const char *sname)
return outputlen; return outputlen;
} }
void ElfLinker::addSection(const char *sname, const void *sdata, int slen) void ElfLinker::addSection(const char *sname, const void *sdata, int slen, int align)
{ {
assert(!frozen); assert(!frozen);
sections = static_cast<Section **>(realloc(sections, (nsections + 1) sections = static_cast<Section **>(realloc(sections, (nsections + 1)
* sizeof(Section *))); * sizeof(Section *)));
assert(sections); assert(sections);
sections[nsections++] = new Section(sname, sdata, slen); sections[nsections++] = new Section(sname, sdata, slen, align);
} }
void ElfLinker::freeze() void ElfLinker::freeze()
@@ -814,12 +834,25 @@ void ElfLinkerPpc32::relocate1(Relocation *rel, upx_byte *location,
// FIXME: more relocs // FIXME: more relocs
if (strcmp(type, "8") == 0) // Note that original (*location).displ is ignored.
*location += value; if (strcmp(type, "24") == 0) {
else if (strcmp(type, "16") == 0) if (3& value) {
set_le16(location, get_le16(location) + value); printf("unaligned word diplacement");
else if (strcmp(type, "32") == 0) abort();
set_le32(location, get_le32(location) + value); }
// FIXME: displacment overflow?
set_be32(location, (0xfc000003 & get_be32(location)) +
(0x03fffffc & value));
}
else if (strcmp(type, "14") == 0) {
if (3& value) {
printf("unaligned word diplacement");
abort();
}
// FIXME: displacment overflow?
set_be32(location, (0xffff0003 & get_be32(location)) +
(0x0000fffc & value));
}
else else
super::relocate1(rel, location, value, type); super::relocate1(rel, location, value, type);
} }
+6 -5
View File
@@ -49,7 +49,7 @@ public:
virtual void init(const void *pdata, int plen, int pinfo) = 0; virtual void init(const void *pdata, int plen, int pinfo) = 0;
virtual void setLoaderAlignOffset(int phase) = 0; virtual void setLoaderAlignOffset(int phase) = 0;
virtual int addSection(const char *sname) = 0; virtual int addSection(const char *sname) = 0;
virtual void addSection(const char *sname, const void *sdata, int slen) = 0; virtual void addSection(const char *sname, const void *sdata, int slen, int align) = 0;
virtual void freeze() = 0; virtual void freeze() = 0;
virtual int getSection(const char *sname, int *slen=NULL) = 0; virtual int getSection(const char *sname, int *slen=NULL) = 0;
virtual unsigned char *getLoader(int *llen=NULL) = 0; virtual unsigned char *getLoader(int *llen=NULL) = 0;
@@ -83,7 +83,7 @@ public:
virtual void init(const void *pdata, int plen, int pinfo); virtual void init(const void *pdata, int plen, int pinfo);
virtual void setLoaderAlignOffset(int phase); virtual void setLoaderAlignOffset(int phase);
virtual int addSection(const char *sname); virtual int addSection(const char *sname);
virtual void addSection(const char *sname, const void *sdata, int slen); virtual void addSection(const char *sname, const void *sdata, int slen, int align);
virtual void freeze(); virtual void freeze();
virtual int getSection(const char *sname, int *slen=NULL); virtual int getSection(const char *sname, int *slen=NULL);
virtual unsigned char *getLoader(int *llen=NULL); virtual unsigned char *getLoader(int *llen=NULL);
@@ -130,7 +130,7 @@ public:
virtual void init(const void *pdata, int plen, int pinfo); virtual void init(const void *pdata, int plen, int pinfo);
virtual void setLoaderAlignOffset(int phase); virtual void setLoaderAlignOffset(int phase);
virtual int addSection(const char *sname); virtual int addSection(const char *sname);
virtual void addSection(const char *sname, const void *sdata, int slen); virtual void addSection(const char *sname, const void *sdata, int slen, int align);
virtual void freeze(); virtual void freeze();
virtual int getSection(const char *sname, int *slen=NULL); virtual int getSection(const char *sname, int *slen=NULL);
virtual unsigned char *getLoader(int *llen=NULL); virtual unsigned char *getLoader(int *llen=NULL);
@@ -199,7 +199,7 @@ protected:
virtual void init(const void *pdata, int plen, int); virtual void init(const void *pdata, int plen, int);
virtual void setLoaderAlignOffset(int phase); virtual void setLoaderAlignOffset(int phase);
virtual int addSection(const char *sname); virtual int addSection(const char *sname);
virtual void addSection(const char *sname, const void *sdata, int slen); virtual void addSection(const char *sname, const void *sdata, int slen, int align);
virtual void freeze(); virtual void freeze();
virtual int getSection(const char *sname, int *slen=NULL); virtual int getSection(const char *sname, int *slen=NULL);
virtual upx_byte *getLoader(int *llen=NULL); virtual upx_byte *getLoader(int *llen=NULL);
@@ -225,9 +225,10 @@ struct ElfLinker::Section : private nocopy
upx_byte *output; upx_byte *output;
unsigned size; unsigned size;
unsigned offset; unsigned offset;
unsigned char align; // log2
Section *next; Section *next;
Section(const char *n, const void *i, unsigned s); Section(const char *n, const void *i, unsigned s, unsigned a=0);
~Section(); ~Section();
}; };
+168 -191
View File
@@ -160,16 +160,44 @@ Linker *PackLinuxElf::newLinker() const
return new ElfLinker; return new ElfLinker;
} }
void PackLinuxElf::pack3(OutputFile *fo, Filter &ft)
{
unsigned disp;
unsigned const zero = 0;
unsigned len = fo->getBytesWritten();
fo->write(&zero, 3& -len); // ALIGN_UP
len += (3& -len);
set_native32(&disp, len); // FIXME? -(sz_elf_hdrs+sizeof(l_info)+sizeof(p_info))
fo->write(&disp, sizeof(disp));
sz_pack2 = 4+ len;
super::pack3(fo, ft);
}
void PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
{
super::pack3(fo, ft);
set_native32(&elfout.phdr[0].p_filesz, sz_pack2);
}
void PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
{
super::pack3(fo, ft);
set_native64(&elfout.phdr[0].p_filesz, sz_pack2);
}
void void
PackLinuxElf::addStubEntrySections( PackLinuxElf::addStubEntrySections(Filter const *)
upx_byte const *const proto,
unsigned const szproto
)
{ {
linker->addSection("ELFMAINX", proto, szproto);
addLoader("ELFMAINX", NULL); addLoader("ELFMAINX", NULL);
} }
void
PackLinuxElf::addLinkerSymbols(Filter const *)
{
// empty
}
PackLinuxElf32::PackLinuxElf32(InputFile *f) PackLinuxElf32::PackLinuxElf32(InputFile *f)
: super(f), phdri(NULL), : super(f), phdri(NULL),
dynseg(NULL), hashtab(NULL), dynsym(NULL) dynseg(NULL), hashtab(NULL), dynsym(NULL)
@@ -196,6 +224,19 @@ Linker* PackLinuxElf64amd::newLinker() const
return new ElfLinkerAMD64; return new ElfLinkerAMD64;
} }
void PackLinuxElf64amd::addStubEntrySections(Filter const *)
{
addLoader("ELFMAINX", NULL);
//addLoader(getDecompressorSections(), NULL);
addLoader(
( M_IS_NRV2E(ph.method) ? "NRV_COMMON,NRV2E"
: M_IS_NRV2D(ph.method) ? "NRV_COMMON,NRV2D"
: M_IS_NRV2B(ph.method) ? "NRV_COMMON,NRV2B"
: M_IS_LZMA(ph.method) ? "LZMA_ELF00,LZMA_DEC20,LZMA_DEC30"
: NULL), NULL);
addLoader("ELFMAINY,IDENTSTR,ELFMAINZ,FOLDEXEC", NULL);
}
int const * int const *
PackLinuxElf::getCompressionMethods(int method, int level) const PackLinuxElf::getCompressionMethods(int method, int level) const
{ {
@@ -207,12 +248,18 @@ int const *
PackLinuxElf32ppc::getCompressionMethods(int method, int level) const PackLinuxElf32ppc::getCompressionMethods(int method, int level) const
{ {
// No real dependency on LE32. // No real dependency on LE32.
static const int m_nrv2e[] = { M_NRV2E_LE32, -1 }; static const int m_nrv2b[] = { M_NRV2B_LE32, M_NRV2E_LE32, M_LZMA, -1 };
static const int m_nrv2b[] = { M_NRV2B_LE32, -1 }; static const int m_nrv2e[] = { M_NRV2E_LE32, M_NRV2B_LE32, M_LZMA, -1 };
static const int m_lzma[] = { M_LZMA,-1 };
/*return Packer::getDefaultCompressionMethods_le32(method, level);*/ if (M_IS_NRV2B(method))
// 2005-04-23 FIXME: stub/l_lx_elfppc32.S hardwires ppc_d_nrv2e.S return m_nrv2b;
UNUSED(method); UNUSED(level); UNUSED(m_nrv2b); if (M_IS_NRV2E(method))
return m_nrv2e;
if (M_IS_LZMA(method))
return m_lzma;
if (1==level)
return m_nrv2b;
return m_nrv2e; return m_nrv2e;
} }
@@ -295,7 +342,7 @@ PackLinuxElf32ppc::PackLinuxElf32ppc(InputFile *f)
e_machine = Elf32_Ehdr::EM_PPC; e_machine = Elf32_Ehdr::EM_PPC;
ei_class = Elf32_Ehdr::ELFCLASS32; ei_class = Elf32_Ehdr::ELFCLASS32;
ei_data = Elf32_Ehdr::ELFDATA2MSB; ei_data = Elf32_Ehdr::ELFDATA2MSB;
ei_osabi = Elf32_Ehdr::ELFOSABI_NONE; ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX;
} }
PackLinuxElf32ppc::~PackLinuxElf32ppc() PackLinuxElf32ppc::~PackLinuxElf32ppc()
@@ -313,7 +360,7 @@ PackLinuxElf64amd::PackLinuxElf64amd(InputFile *f)
e_machine = Elf64_Ehdr::EM_X86_64; e_machine = Elf64_Ehdr::EM_X86_64;
ei_class = Elf64_Ehdr::ELFCLASS64; ei_class = Elf64_Ehdr::ELFCLASS64;
ei_data = Elf64_Ehdr::ELFDATA2LSB; ei_data = Elf64_Ehdr::ELFDATA2LSB;
ei_osabi = Elf32_Ehdr::ELFOSABI_NONE; ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX;
} }
PackLinuxElf64amd::~PackLinuxElf64amd() PackLinuxElf64amd::~PackLinuxElf64amd()
@@ -329,65 +376,8 @@ umax(unsigned a, unsigned b)
return a; return a;
} }
int void PackLinuxElf32x86::addStubEntrySections(Filter const *ft)
PackLinuxElf32x86::buildLinuxLoader(
upx_byte const *const proto,
unsigned const szproto,
upx_byte const *const fold,
unsigned const szfold,
Filter const *ft
)
{ {
initLoader(proto, szproto);
struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0;
if (0 < szfold) {
cprElfHdr1 const *const hf = (cprElfHdr1 const *)fold;
fold_hdrlen = sizeof(hf->ehdr) +
get_native16(&hf->ehdr.e_phentsize) * get_native16(&hf->ehdr.e_phnum) +
sizeof(l_info);
if (0 == get_le32(fold_hdrlen + fold)) {
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
fold_hdrlen = umax(0x80, fold_hdrlen);
}
h.sz_unc = (szfold < fold_hdrlen) ? 0 : (szfold - fold_hdrlen);
h.b_method = (unsigned char) ph.method; // FIXME: endian trouble
h.b_ftid = (unsigned char) ph.filter;
h.b_cto8 = (unsigned char) ph.filter_cto;
}
unsigned char const *const uncLoader = fold_hdrlen + fold;
h.sz_cpr = MemBuffer::getSizeForCompression(h.sz_unc);
unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_cpr];
if (0 < szfold) {
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &h.sz_cpr,
NULL, ph.method, 10, NULL, NULL );
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
throwInternalError("loader compression failed");
#if 0 //{ debugging only
if (M_LZMA==ph.method) {
ucl_uint tmp_len = h.sz_unc; // LZMA uses this as EOF
unsigned char *tmp = new unsigned char[tmp_len];
memset(tmp, 0, tmp_len);
r = upx_decompress(sizeof(h) + cprLoader, h.sz_cpr, tmp, &tmp_len, h.b_method, NULL);
printf("\n%d %d: %d %d %d\n", h.b_method, r, h.sz_cpr, h.sz_unc, tmp_len);
for (unsigned j=0; j < h.sz_unc; ++j) if (tmp[j]!=uncLoader[j]) {
printf("%d: %x %x\n", j, tmp[j], uncLoader[j]);
}
delete[] tmp;
}
#endif //}
}
unsigned const sz_cpr = h.sz_cpr;
set_native32(&h.sz_cpr, h.sz_cpr);
set_native32(&h.sz_unc, h.sz_unc);
memcpy(cprLoader, &h, sizeof(h));
// This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
// 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?
// Here is a quick summary of the format of the output file: // Here is a quick summary of the format of the output file:
@@ -406,6 +396,7 @@ PackLinuxElf32x86::buildLinuxLoader(
sizeof(p_info) + sizeof(p_info) +
// compressed data // compressed data
b_len + ph.c_len ); b_len + ph.c_len );
// entry to stub // entry to stub
addLoader("LEXEC000", NULL); addLoader("LEXEC000", NULL);
@@ -462,20 +453,16 @@ PackLinuxElf32x86::buildLinuxLoader(
addLoader("IDENTSTR", NULL); addLoader("IDENTSTR", NULL);
addLoader("LEXEC020", NULL); addLoader("LEXEC020", NULL);
addLoader("FOLDEXEC", NULL); addLoader("FOLDEXEC", NULL);
}
freezeLoader(); void PackLinuxElf32x86::addLinkerSymbols(Filter const *ft)
{
upx_byte *ptr_cto = getLoader(); upx_byte *ptr_cto = getLoader();
int sz_cto = getLoaderSize(); int sz_cto = getLoaderSize();
if (0x20==(ft->id & 0xF0) || 0x30==(ft->id & 0xF0)) { // push byte '?' ; cto8 if (0x20==(ft->id & 0xF0) || 0x30==(ft->id & 0xF0)) { // push byte '?' ; cto8
patch_le16(ptr_cto, sz_cto, "\x6a?", 0x6a + (ft->cto << 8)); patch_le16(ptr_cto, sz_cto, "\x6a?", 0x6a + (ft->cto << 8));
checkPatch(NULL, 0, 0, 0); // reset checkPatch(NULL, 0, 0, 0); // reset
} }
// PackHeader and overlay_offset at the end of the output file,
// after the compressed data.
unsigned const lsize = getLoaderSize();
linker->relocate();
return lsize;
} }
int int
@@ -484,16 +471,10 @@ PackLinuxElf32::buildLinuxLoader(
unsigned const szproto, unsigned const szproto,
upx_byte const *const fold, upx_byte const *const fold,
unsigned const szfold, unsigned const szfold,
Filter const */*ft*/ Filter const *ft
) )
{ {
{ initLoader(proto, szproto);
int const MAX_LOADER_LEN = 8000;
int *const eof_empty = new int[MAX_LOADER_LEN/sizeof(int)];
eof_empty[0] = -1;
initLoader(eof_empty, MAX_LOADER_LEN, 0, 0);
delete[] eof_empty;
}
struct b_info h; memset(&h, 0, sizeof(h)); struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0; unsigned fold_hdrlen = 0;
@@ -516,6 +497,19 @@ PackLinuxElf32::buildLinuxLoader(
NULL, ph.method, 10, NULL, NULL ); NULL, ph.method, 10, NULL, NULL );
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc) if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
throwInternalError("loader compression failed"); throwInternalError("loader compression failed");
#if 0 //{ debugging only
if (M_LZMA==ph.method) {
ucl_uint tmp_len = h.sz_unc; // LZMA uses this as EOF
unsigned char *tmp = new unsigned char[tmp_len];
memset(tmp, 0, tmp_len);
r = upx_decompress(sizeof(h) + cprLoader, h.sz_cpr, tmp, &tmp_len, h.b_method, NULL);
printf("\n%d %d: %d %d %d\n", h.b_method, r, h.sz_cpr, h.sz_unc, tmp_len);
for (unsigned j=0; j < h.sz_unc; ++j) if (tmp[j]!=uncLoader[j]) {
printf("%d: %x %x\n", j, tmp[j], uncLoader[j]);
}
delete[] tmp;
}
#endif //}
} }
unsigned const sz_cpr = h.sz_cpr; unsigned const sz_cpr = h.sz_cpr;
set_native32(&h.sz_cpr, h.sz_cpr); set_native32(&h.sz_cpr, h.sz_cpr);
@@ -523,16 +517,13 @@ PackLinuxElf32::buildLinuxLoader(
memcpy(cprLoader, &h, sizeof(h)); memcpy(cprLoader, &h, sizeof(h));
// 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, 0);
delete [] cprLoader; delete [] cprLoader;
//int const GAP = 128; // must match stub/l_mac_ppc.S addStubEntrySections(ft);
//segcmdo.vmsize += sz_unc - sz_cpr + GAP + 64;
addStubEntrySections(proto, szproto);
addLoader("FOLDEXEC", NULL);
freezeLoader(); freezeLoader();
addLinkerSymbols(ft);
linker->relocate(); linker->relocate();
return getLoaderSize(); return getLoaderSize();
} }
@@ -543,16 +534,10 @@ PackLinuxElf64::buildLinuxLoader(
unsigned const szproto, unsigned const szproto,
upx_byte const *const fold, upx_byte const *const fold,
unsigned const szfold, unsigned const szfold,
Filter const */*ft*/ Filter const *ft
) )
{ {
{ initLoader(proto, szproto);
int const MAX_LOADER_LEN = 8000;
int *const eof_empty = new int[MAX_LOADER_LEN/sizeof(int)];
eof_empty[0] = -1;
initLoader(eof_empty, MAX_LOADER_LEN, 0, 0);
delete[] eof_empty;
}
struct b_info h; memset(&h, 0, sizeof(h)); struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0; unsigned fold_hdrlen = 0;
@@ -582,17 +567,78 @@ PackLinuxElf64::buildLinuxLoader(
memcpy(cprLoader, &h, sizeof(h)); memcpy(cprLoader, &h, sizeof(h));
// 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, 0);
delete [] cprLoader; delete [] cprLoader;
addStubEntrySections(proto, szproto); addStubEntrySections(ft);
addLoader("FOLDEXEC", NULL);
freezeLoader(); freezeLoader();
addLinkerSymbols(ft);
linker->relocate(); linker->relocate();
return getLoaderSize(); return getLoaderSize();
} }
void
PackLinuxElf64amd::addLinkerSymbols(Filter const *)
{
unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info);
unsigned len = sz_pack2;
#define PAGE_MASK (~0u<<12)
#define PAGE_SIZE (-PAGE_MASK)
lsize = /*getLoaderSize()*/ 64 * 1024; // upper bound; avoid circularity
acc_uint64l_t const lo_va_user = 0x400000; // XXX
acc_uint64l_t lo_va_stub = elfout.phdr[0].p_vaddr;
acc_uint64l_t adrc;
acc_uint64l_t adrm;
acc_uint64l_t adru;
acc_uint64l_t adrx;
unsigned cntc;
unsigned lenm;
unsigned lenu;
len += (7&-lsize) + lsize;
bool const is_big = (lo_va_user < (lo_va_stub + len + 2*PAGE_SIZE));
if (is_big) {
set_native64( &elfout.ehdr.e_entry,
get_native64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
set_native64(&elfout.phdr[0].p_vaddr, lo_va_user);
set_native64(&elfout.phdr[0].p_paddr, lo_va_user);
lo_va_stub = lo_va_user;
adrc = lo_va_stub;
adrm = getbrk(phdri, get_native16(&ehdri.e_phnum));
adru = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrx = adru + hlen;
lenm = PAGE_SIZE + len;
lenu = PAGE_SIZE + len;
cntc = len >> 3;
}
else {
adrm = lo_va_stub + len;
adrc = adrm;
adru = lo_va_stub;
adrx = lo_va_stub + hlen;
lenm = PAGE_SIZE;
lenu = PAGE_SIZE + len;
cntc = 0;
}
adrm = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrc = PAGE_MASK & (~PAGE_MASK + adrc); // round up to page boundary
//avoid circularity linker->defineSymbol("LENX", sz_pack2 - hlen);
linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion
linker->defineSymbol("CNTC", cntc); // count for copy
linker->defineSymbol("LENU", lenu); // len for unmap
linker->defineSymbol("ADRC", adrc); // addr for copy
linker->defineSymbol("ADRU", adru); // addr for unmap
linker->defineSymbol("JMPU", 12 + lo_va_user); // trampoline for unmap
linker->defineSymbol("LENM", lenm); // len for map
linker->defineSymbol("ADRM", adrm); // addr for map
#undef PAGE_SIZE
#undef PAGE_MASK
}
static const static const
#include "stub/i386-linux.elf-entry.h" #include "stub/i386-linux.elf-entry.h"
static const static const
@@ -771,6 +817,26 @@ PackLinuxElf32ppc::buildLoader(const Filter *ft)
linux_elfppc32_fold, sizeof(linux_elfppc32_fold), ft ); linux_elfppc32_fold, sizeof(linux_elfppc32_fold), ft );
} }
void
PackLinuxElf32ppc::addStubEntrySections(Filter const *)
{
addLoader("ELFMAINX", NULL);
//addLoader(getDecompressorSections(), NULL);
addLoader(
( M_IS_NRV2E(ph.method) ? "NRV_COMMON,NRV2E"
: M_IS_NRV2D(ph.method) ? "NRV_COMMON,NRV2D"
: M_IS_NRV2B(ph.method) ? "NRV_COMMON,NRV2B"
: M_IS_LZMA(ph.method) ? "LZMA_ELF00,LZMA_DEC20,LZMA_DEC30"
: NULL), NULL);
addLoader("ELFMAINY,IDENTSTR,ELFMAINZ,FOLDEXEC", NULL);
}
void
PackLinuxElf32ppc::addLinkerSymbols(Filter const *)
{
// empty
}
static const static const
#include "stub/amd64-linux.elf-entry.h" #include "stub/amd64-linux.elf-entry.h"
static const static const
@@ -1344,7 +1410,6 @@ void PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
if ((off_t)total_in != file_size) if ((off_t)total_in != file_size)
throwEOFException(); throwEOFException();
set_native32(&elfout.phdr[0].p_filesz, fo->getBytesWritten());
} }
// Determine length of gap between PT_LOAD phdr[k] and closest PT_LOAD // Determine length of gap between PT_LOAD phdr[k] and closest PT_LOAD
@@ -1446,89 +1511,6 @@ void PackLinuxElf64::pack2(OutputFile *fo, Filter &ft)
if ((off_t)total_in != file_size) if ((off_t)total_in != file_size)
throwEOFException(); throwEOFException();
set_native64(&elfout.phdr[0].p_filesz, fo->getBytesWritten());
}
void PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
{
unsigned disp;
unsigned const zero = 0;
unsigned len = fo->getBytesWritten();
fo->write(&zero, 3& -len); // align to 0 mod 4
len += (3& -len);
set_native32(&disp, len); // FIXME? -(sz_elf_hdrs+sizeof(l_info)+sizeof(p_info))
fo->write(&disp, sizeof(disp));
super::pack3(fo, ft);
}
void PackLinuxElf64amd::pack3(OutputFile *fo, Filter &ft)
{
char zero[8];
unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info);
unsigned const len0 = fo->getBytesWritten();
unsigned len = len0;
unsigned const frag = 7 & -len; // align to 0 mod 8
memset(zero, 0, sizeof(zero));
fo->write(&zero, frag);
len += frag;
#define PAGE_MASK (~0u<<12)
#define PAGE_SIZE (-PAGE_MASK)
upx_byte *const p = getLoader();
lsize = getLoaderSize();
acc_uint64l_t const lo_va_user = 0x400000; // XXX
acc_uint64l_t lo_va_stub = elfout.phdr[0].p_vaddr;
acc_uint64l_t adrc;
acc_uint64l_t adrm;
acc_uint64l_t adru;
acc_uint64l_t adrx;
unsigned cntc;
unsigned lenm;
unsigned lenu;
len += (7&-lsize) + lsize;
bool const is_big = (lo_va_user < (lo_va_stub + len + 2*PAGE_SIZE));
if (is_big) {
set_native64( &elfout.ehdr.e_entry,
get_native64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
set_native64(&elfout.phdr[0].p_vaddr, lo_va_user);
set_native64(&elfout.phdr[0].p_paddr, lo_va_user);
lo_va_stub = lo_va_user;
adrc = lo_va_stub;
adrm = getbrk(phdri, get_native16(&ehdri.e_phnum));
adru = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrx = adru + hlen;
lenm = PAGE_SIZE + len;
lenu = PAGE_SIZE + len;
cntc = len >> 3;
}
else {
adrm = lo_va_stub + len;
adrc = adrm;
adru = lo_va_stub;
adrx = lo_va_stub + hlen;
lenm = PAGE_SIZE;
lenu = PAGE_SIZE + len;
cntc = 0;
}
adrm = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrc = PAGE_MASK & (~PAGE_MASK + adrc); // round up to page boundary
// patch in order of descending address
patch_le32(p,lsize,"LENX", len0 - hlen);
patch_le32(p,lsize,"ADRX", adrx); // compressed input for eXpansion
patch_le32(p,lsize,"CNTC", cntc); // count for copy
patch_le32(p,lsize,"LENU", lenu); // len for unmap
patch_le32(p,lsize,"ADRC", adrc); // addr for copy
patch_le32(p,lsize,"ADRU", adru); // addr for unmap
patch_le32(p,lsize,"JMPU", 12 + lo_va_user); // trampoline for unmap
patch_le32(p,lsize,"LENM", lenm); // len for map
patch_le32(p,lsize,"ADRM", adrm); // addr for map
#undef PAGE_SIZE
#undef PAGE_MASK
super::pack3(fo, ft);
} }
#include "bele.h" #include "bele.h"
@@ -1703,11 +1685,6 @@ void PackLinuxElf32armBe::pack3(OutputFile *fo, Filter &ft)
ARM_pack3(fo, ft, true); ARM_pack3(fo, ft, true);
} }
void PackLinuxElf::pack4(OutputFile *fo, Filter &ft)
{
super::pack4(fo, ft);
}
void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft) void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft)
{ {
overlay_offset = sz_elf_hdrs + sizeof(linfo); overlay_offset = sz_elf_hdrs + sizeof(linfo);
+14 -13
View File
@@ -51,8 +51,8 @@ protected:
virtual void pack1(OutputFile *, Filter &) = 0; // generate executable header virtual void pack1(OutputFile *, Filter &) = 0; // generate executable header
virtual void pack2(OutputFile *, Filter &) = 0; // append compressed data virtual void pack2(OutputFile *, Filter &) = 0; // append compressed data
//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 Linker* newLinker() const;
virtual void generateElfHdr( virtual void generateElfHdr(
@@ -60,7 +60,8 @@ protected:
void const *proto, void const *proto,
unsigned const brka unsigned const brka
) = 0; ) = 0;
virtual void addStubEntrySections(upx_byte const *, unsigned); virtual void addLinkerSymbols(Filter const *);
virtual void addStubEntrySections(Filter const *);
virtual void unpack(OutputFile *fo) = 0; virtual void unpack(OutputFile *fo) = 0;
protected: protected:
@@ -69,6 +70,7 @@ protected:
unsigned sz_phdrs; // sizeof Phdr[] unsigned sz_phdrs; // sizeof Phdr[]
unsigned sz_elf_hdrs; // all Elf headers unsigned sz_elf_hdrs; // all Elf headers
unsigned sz_pack2; // after pack2(), before loader
unsigned short e_machine; unsigned short e_machine;
unsigned char ei_class; unsigned char ei_class;
@@ -176,7 +178,7 @@ protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack2(OutputFile *, Filter &); // append compressed data virtual void pack2(OutputFile *, Filter &); // append compressed data
//virtual void pack3(OutputFile *, Filter &); // append loader virtual void pack3(OutputFile *, Filter &); // append loader
virtual void pack4(OutputFile *, Filter &); // append pack header virtual void pack4(OutputFile *, Filter &); // append pack header
virtual void unpack(OutputFile *fo); virtual void unpack(OutputFile *fo);
@@ -284,10 +286,12 @@ public:
virtual bool canPack(); virtual bool canPack();
protected: protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header virtual void pack1(OutputFile *, Filter &); // generate executable header
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 void addStubEntrySections(Filter const *);
virtual Linker* newLinker() const; virtual Linker* newLinker() const;
virtual void addLinkerSymbols(Filter const *);
}; };
/************************************************************************* /*************************************************************************
@@ -307,7 +311,9 @@ protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header virtual void pack1(OutputFile *, Filter &); // generate executable header
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 void addStubEntrySections(Filter const *);
virtual Linker* newLinker() const; virtual Linker* newLinker() const;
virtual void addLinkerSymbols(Filter const *);
}; };
/************************************************************************* /*************************************************************************
@@ -330,14 +336,9 @@ 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 void addStubEntrySections(Filter const *);
virtual Linker* newLinker() const; virtual Linker* newLinker() const;
virtual int buildLinuxLoader( virtual void addLinkerSymbols(Filter const *);
upx_byte const *const proto, // assembly-only sections
unsigned const szproto,
upx_byte const *const fold, // linked assembly + C section
unsigned const szfold,
Filter const *ft
);
}; };
class PackBSDElf32x86 : public PackLinuxElf32x86 class PackBSDElf32x86 : public PackLinuxElf32x86
@@ -378,8 +379,8 @@ public:
PackOpenBSDElf32x86(InputFile *f); PackOpenBSDElf32x86(InputFile *f);
virtual ~PackOpenBSDElf32x86(); virtual ~PackOpenBSDElf32x86();
virtual int buildLoader(const Filter *ft);
protected: protected:
virtual int buildLoader(const Filter *ft);
virtual void generateElfHdr( virtual void generateElfHdr(
OutputFile *, OutputFile *,
void const *proto, void const *proto,
+1 -1
View File
@@ -280,7 +280,7 @@ PackLinuxI386::buildLinuxLoader(
} }
// This adds the definition to the "library", to be used later. // This adds the definition to the "library", to be used later.
// NOTE: the stub is NOT compressed! The savings is not worth it. // NOTE: the stub is NOT compressed! The savings is not worth it.
linker->addSection("FOLDEXEC", fold + fold_hdrlen, szfold - fold_hdrlen); linker->addSection("FOLDEXEC", fold + fold_hdrlen, szfold - fold_hdrlen, 0);
n_mru = ft->n_mru; n_mru = ft->n_mru;
+1 -1
View File
@@ -148,7 +148,7 @@ void PackLinuxElf32x86interp::pack3(OutputFile *fo, Filter &/*ft*/)
elfout.phdr[0].p_paddr = elfout.phdr[0].p_vaddr = base - sz; elfout.phdr[0].p_paddr = elfout.phdr[0].p_vaddr = base - sz;
if (opt->o_unix.make_ptinterp) { if (opt->o_unix.make_ptinterp) {
initLoader(linux_i386pti_loader, sizeof(linux_i386pti_loader)); initLoader(linux_i386pti_loader, sizeof(linux_i386pti_loader));
linker->addSection("FOLDEXEC", linux_i386pti_fold, sizeof(linux_i386pti_fold)); linker->addSection("FOLDEXEC", linux_i386pti_fold, sizeof(linux_i386pti_fold), 0);
addLoader("LXPTI000", NULL); addLoader("LXPTI000", NULL);
+2 -2
View File
@@ -98,13 +98,13 @@ PackMachPPC32::buildMachLoader(
memcpy(cprLoader, &h, sizeof(h)); memcpy(cprLoader, &h, sizeof(h));
// 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) + h.sz_cpr); linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + h.sz_cpr, 0);
delete [] cprLoader; delete [] cprLoader;
int const GAP = 128; // must match stub/l_mac_ppc.S int const GAP = 128; // must match stub/l_mac_ppc.S
segcmdo.vmsize += h.sz_unc - h.sz_cpr + GAP + 64; segcmdo.vmsize += h.sz_unc - h.sz_cpr + GAP + 64;
linker->addSection("MACOS000", proto, szproto); linker->addSection("MACOS000", proto, szproto, 0);
addLoader("MACOS000", NULL); addLoader("MACOS000", NULL);
addLoader("FOLDEXEC", NULL); addLoader("FOLDEXEC", NULL);
+1 -1
View File
@@ -1069,7 +1069,7 @@ void Packer::initLoader(const void *pdata, int plen, int pinfo, int small)
unsigned size; unsigned size;
char const * const ident = getIdentstr(&size, small); char const * const ident = getIdentstr(&size, small);
linker->addSection("IDENTSTR", ident, size); linker->addSection("IDENTSTR", ident, size, 0);
} }
+27 -19
View File
@@ -349,10 +349,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) $@
@@ -384,7 +384,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
@@ -478,7 +478,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
@@ -493,9 +493,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
@@ -506,7 +508,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
@@ -525,9 +527,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
@@ -538,7 +542,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
@@ -553,9 +557,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
@@ -566,7 +572,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
@@ -680,9 +686,11 @@ tc.powerpc-linux.elf.objdump = $(call tc,m-objdump)
tc.powerpc-linux.elf.objstrip = $(call tc,objcopy) -R .comment -R .note tc.powerpc-linux.elf.objstrip = $(call tc,objcopy) -R .comment -R .note
powerpc-linux.elf-entry.h : $(srcdir)/src/$$T.S powerpc-linux.elf-entry.h : $(srcdir)/src/$$T.S
$(call tc,gcc) -c $< -o tmp/$T.o $(call tc,gcc) -c $< -o tmp/$T.bin
$(call tc,objstrip) tmp/$T.o $(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,ld) --oformat binary tmp/$T.o -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_elfppc32_loader tmp/$T.bin $@ $(call tc,bin2h) --ident=linux_elfppc32_loader tmp/$T.bin $@
powerpc-linux.elf-fold.h : tmp/$$T.o tmp/powerpc-linux.elf-main.o $(srcdir)/src/$$T.lds powerpc-linux.elf-fold.h : tmp/$$T.o tmp/powerpc-linux.elf-main.o $(srcdir)/src/$$T.lds
+747 -195
View File
@@ -1,4 +1,4 @@
/* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 3066 (0xbfa) bytes /* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 11892 (0x2e74) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -27,201 +27,753 @@
*/ */
#define LINUX_ELF64AMD_LOADER_SIZE 3066 #define LINUX_ELF64AMD_LOADER_SIZE 11892
#define LINUX_ELF64AMD_LOADER_ADLER32 0x7a3e6996 #define LINUX_ELF64AMD_LOADER_ADLER32 0x4635c9f5
#define LINUX_ELF64AMD_LOADER_CRC32 0x5bbfae22 #define LINUX_ELF64AMD_LOADER_CRC32 0x440aaf64
unsigned char linux_elf64amd_loader[3066] = { unsigned char linux_elf64amd_loader[11892] = {
127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */
1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */
0, 0, 0, 0, 0, 0, 0, 0, 40, 3, 0, 0, 0, 0, 0, 0, /* 0x 20 */ 0, 0, 0, 0, 0, 0, 0, 0,216, 23, 0, 0, 0, 0, 0, 0, /* 0x 20 */
0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 6, 0, 3, 0, /* 0x 30 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 20, 0, 17, 0, /* 0x 30 */
232,178, 2, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 72,137,254, /* 0x 40 */ 232, 0, 0, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 0, 0, 0, /* 0x 40 */
72,137,215, 49,219, 49,201, 72,131,205,255,232,129, 1, 0, 0, /* 0x 50 */ 72,137,254, 72,137,215, 49,219, 49,201, 72,131,205,255,232, 85, /* 0x 50 */
1,219,116, 2,243,195,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 60 */ 0, 0, 0, 0, 0, 0, 0, 0, 1,219,116, 2,243,195,139, 30, /* 0x 60 */
243,195, 72,141, 4, 47,131,249, 5,138, 16,118, 33, 72,131,253, /* 0x 70 */ 72,131,238,252, 17,219,138, 22,243,195, 72,141, 4, 47,131,249, /* 0x 70 */
252,119, 27,131,233, 4,139, 16, 72,131,192, 4,131,233, 4,137, /* 0x 80 */ 5,138, 16,118, 33, 72,131,253,252,119, 27,131,233, 4,139, 16, /* 0x 80 */
23, 72,141,127, 4,115,239,131,193, 4,138, 16,116, 16, 72,255, /* 0x 90 */ 72,131,192, 4,131,233, 4,137, 23, 72,141,127, 4,115,239,131, /* 0x 90 */
192,136, 23,131,233, 1,138, 16, 72,141,127, 1,117,240,243,195, /* 0x a0 */ 193, 4,138, 16,116, 16, 72,255,192,136, 23,131,233, 1,138, 16, /* 0x a0 */
72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x b0 */ 72,141,127, 1,117,240,243,195,252, 65, 91, 0, 0, 0, 0, 0, /* 0x b0 */
72,131,238,252, 17,219,138, 22,114,230,141, 65, 1,235, 7,255, /* 0x c0 */ 65,128,248, 8,116, 18,233,177, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x c0 */
200, 65,255,211, 17,192, 65,255,211, 17,192, 1,219,117, 10,139, /* 0x d0 */ 72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x d0 */
30, 72,131,238,252, 17,219,138, 22,115,228,131,232, 3,114, 29, /* 0x e0 */ 72,131,238,252, 17,219,138, 22,114,230,141, 65, 1,235, 7,255, /* 0x e0 */
193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, /* 0x f0 */ 200, 65,255,211, 17,192, 65,255,211, 17,192, 1,219,117, 10,139, /* 0x f0 */
244, 0, 0, 0,209,248, 72, 99,232,114, 56,235, 14, 1,219,117, /* 0x 100 */ 30, 72,131,238,252, 17,219,138, 22,115,228,131,232, 3,114, 29, /* 0x 100 */
8,139, 30, 72,131,238,252, 17,219,114, 40,255,193, 1,219,117, /* 0x 110 */ 193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, /* 0x 110 */
8,139, 30, 72,131,238,252, 17,219,114, 24, 65,255,211, 17,201, /* 0x 120 */ 0, 0, 0, 0,209,248, 72, 99,232,114, 56,235, 14, 1,219,117, /* 0x 120 */
1,219,117, 8,139, 30, 72,131,238,252, 17,219,115,237,131,193, /* 0x 130 */ 8,139, 30, 72,131,238,252, 17,219,114, 40,255,193, 1,219,117, /* 0x 130 */
2,235, 5, 65,255,211, 17,201, 72,129,253, 0,251,255,255,131, /* 0x 140 */ 8,139, 30, 72,131,238,252, 17,219,114, 24, 65,255,211, 17,201, /* 0x 140 */
209, 2,232, 27,255,255,255,233, 92,255,255,255, 0, 0, 0, 0, /* 0x 150 */ 1,219,117, 8,139, 30, 72,131,238,252, 17,219,115,237,131,193, /* 0x 150 */
72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x 160 */ 2,235, 5, 65,255,211, 17,201, 72,129,253, 0,251,255,255,131, /* 0x 160 */
72,131,238,252, 17,219,138, 22,114,230,141, 65, 1, 65,255,211, /* 0x 170 */ 209, 2,232, 0, 0, 0, 0,233, 92,255,255,255, 0, 0, 0, 0, /* 0x 170 */
17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 180 */ 65,128,248, 2,116, 18,233,138, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 180 */
115,235,131,232, 3,114, 19,193,224, 8, 15,182,210, 9,208, 72, /* 0x 190 */ 72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x 190 */
255,198,131,240,255,116, 81, 72, 99,232,141, 65, 1, 65,255,211, /* 0x 1a0 */ 72,131,238,252, 17,219,138, 22,114,230,141, 65, 1, 65,255,211, /* 0x 1a0 */
17,201, 65,255,211, 17,201,117, 24,137,193,131,192, 2, 65,255, /* 0x 1b0 */ 17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 1b0 */
211, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, 17,219,115, /* 0x 1c0 */ 115,235,131,232, 3,114, 23,193,224, 8, 15,182,210, 9,208, 72, /* 0x 1c0 */
237, 72,129,253, 0,243,255,255, 17,193,232,147,254,255,255,235, /* 0x 1d0 */ 255,198,131,240,255, 15,132, 0, 0, 0, 0, 72, 99,232,141, 65, /* 0x 1d0 */
135,252, 65, 91, 65,131,248, 8, 15,132,202,254,255,255, 65,131, /* 0x 1e0 */ 1, 65,255,211, 17,201, 65,255,211, 17,201,117, 24,137,193,131, /* 0x 1e0 */
248, 2, 15,132,112,255,255,255, 89, 72,137,240, 72, 41,200, 90, /* 0x 1f0 */ 192, 2, 65,255,211, 17,201, 1,219,117, 8,139, 30, 72,131,238, /* 0x 1f0 */
72, 41,215, 89,137, 57, 91, 93,195, 10, 36, 73,100, 58, 32, 85, /* 0x 200 */ 252, 17,219,115,237, 72,129,253, 0,243,255,255, 17,193,232, 0, /* 0x 200 */
80, 88, 32, 40, 67, 41, 32, 49, 57, 57, 54, 45, 50, 48, 48, 54, /* 0x 210 */ 0, 0, 0,235,131, 65,128,248, 14, 15,133, 0, 0, 0, 0, 85, /* 0x 210 */
32,116,104,101, 32, 85, 80, 88, 32, 84,101, 97,109, 46, 32, 65, /* 0x 220 */ 72,137,229, 68,139, 9, 73,137,208, 72,137,242, 72,141,119, 2, /* 0x 220 */
108,108, 32, 82,105,103,104,116,115, 32, 82,101,115,101,114,118, /* 0x 230 */ 86,138, 7,255,202,136,193, 36, 7,192,233, 3, 72,199,195, 0, /* 0x 230 */
101,100, 46, 32,104,116,116,112, 58, 47, 47,117,112,120, 46,115, /* 0x 240 */ 253,255,255, 72,211,227,136,193, 72,141,156, 92,136,241,255,255, /* 0x 240 */
102, 46,110,101,116, 32, 36, 10, 0,104, 30, 0, 0, 0, 90,232, /* 0x 250 */ 72,131,227,192,106, 0, 72, 57,220,117,249, 83, 72,141,123, 8, /* 0x 250 */
30, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, 69, 67,124, 80, 82, /* 0x 260 */ 138, 78,255,255,202,136, 71, 2,136,200,192,233, 4,136, 79, 1, /* 0x 260 */
79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105,108,101,100, 46, /* 0x 270 */ 36, 15,136, 7, 72,141, 79,252, 80, 65, 87, 72,141, 71, 4, 69, /* 0x 270 */
10, 0, 94,106, 2, 95,106, 1, 88, 15, 5,106,127, 95,106, 60, /* 0x 280 */ 49,255, 65, 86, 65,190, 1, 0, 0, 0, 65, 85, 69, 49,237, 65, /* 0x 280 */
88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, 90,190, 0, 0, 0, /* 0x 290 */ 84, 85, 83, 72,137, 76, 36,240, 72,137, 68, 36,216,184, 1, 0, /* 0x 290 */
0,106, 50, 65, 90, 69, 41,192,106, 9, 88, 15, 5, 57,199,117, /* 0x 2a0 */ 0, 0, 72,137,116, 36,248, 76,137, 68, 36,232,137,195, 68,137, /* 0x 2a0 */
168,104, 0, 0, 0, 0,104, 0, 0, 0, 0,190, 0, 0, 0, 0, /* 0x 2b0 */ 76, 36,228, 15,182, 79, 2,211,227,137,217, 72,139, 92, 36, 56, /* 0x 2b0 */
104, 0, 0, 0, 0,185, 0, 0, 0, 0,104, 0, 0, 0, 0,104, /* 0x 2c0 */ 255,201,137, 76, 36,212, 15,182, 79, 1,211,224, 72,139, 76, 36, /* 0x 2c0 */
0, 0, 0, 0,137,250, 41,242, 1,213, 1,211,252,243, 72,165, /* 0x 2d0 */ 240,255,200,137, 68, 36,208, 15,182, 7,199, 1, 0, 0, 0, 0, /* 0x 2d0 */
151,137,222, 80,146,173, 80, 72,137,225,173,151,173, 68, 15,182, /* 0x 2e0 */ 199, 68, 36,200, 0, 0, 0, 0,199, 68, 36,196, 1, 0, 0, 0, /* 0x 2e0 */
192,135,254,255,213, 89,195, 93,232,150,255,255,255, 0, 46,115, /* 0x 2f0 */ 199, 68, 36,192, 1, 0, 0, 0,199, 68, 36,188, 1, 0, 0, 0, /* 0x 2f0 */
121,109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115, /* 0x 300 */ 199, 3, 0, 0, 0, 0,137, 68, 36,204, 15,182, 79, 1, 1,193, /* 0x 300 */
104,115,116,114,116, 97, 98, 0, 46,114,101,108, 97, 76, 69, 88, /* 0x 310 */ 184, 0, 3, 0, 0,211,224, 49,201,141,184, 54, 7, 0, 0, 65, /* 0x 310 */
69, 67, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 320 */ 57,255,115, 19, 72,139, 92, 36,216,137,200,255,193, 57,249,102, /* 0x 320 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 330 */ 199, 4, 67, 0, 4,235,235, 72,139,124, 36,248,137,208, 69, 49, /* 0x 330 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 340 */ 210, 65,131,203,255, 49,210, 73,137,252, 73, 1,196, 76, 57,231, /* 0x 340 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 350 */ 15,132,239, 8, 0, 0, 15,182, 7, 65,193,226, 8,255,194, 72, /* 0x 350 */
0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, /* 0x 360 */ 255,199, 65, 9,194,131,250, 4,126,227, 68, 59,124, 36,228, 15, /* 0x 360 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 370 */ 131,218, 8, 0, 0,139, 68, 36,212, 72, 99, 92, 36,200, 72,139, /* 0x 370 */
64, 0, 0, 0, 0, 0, 0, 0,189, 2, 0, 0, 0, 0, 0, 0, /* 0x 380 */ 84, 36,216, 68, 33,248,137, 68, 36,184, 72, 99,108, 36,184, 72, /* 0x 380 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 390 */ 137,216, 72,193,224, 4, 72, 1,232, 65,129,251,255,255,255, 0, /* 0x 390 */
0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, /* 0x 3a0 */ 76,141, 12, 66,119, 26, 76, 57,231, 15,132,150, 8, 0, 0, 15, /* 0x 3a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3b0 */ 182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, /* 0x 3b0 */
0, 6, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, /* 0x 3c0 */ 65, 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15,175,193, /* 0x 3c0 */
4, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 3d0 */ 65, 57,194, 15,131,197, 1, 0, 0, 65,137,195,184, 0, 8, 0, /* 0x 3d0 */
24, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, /* 0x 3e0 */ 0, 72,139, 92, 36,216, 41,200, 15,182, 76, 36,204,190, 1, 0, /* 0x 3e0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3f0 */ 0, 0,193,248, 5,141, 4, 2, 65, 15,182,213,102, 65,137, 1, /* 0x 3f0 */
253, 2, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, /* 0x 400 */ 139, 68, 36,208, 68, 33,248,211,224,185, 8, 0, 0, 0, 43, 76, /* 0x 400 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x 410 */ 36,204,211,250, 1,208,105,192, 0, 3, 0, 0,131,124, 36,200, /* 0x 410 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, /* 0x 420 */ 6,137,192, 76,141,140, 67,108, 14, 0, 0, 15,142,184, 0, 0, /* 0x 420 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 430 */ 0, 72,139, 84, 36,232, 68,137,248, 68, 41,240, 15,182, 44, 2, /* 0x 430 */
168, 4, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, /* 0x 440 */ 1,237, 72, 99,214,137,235,129,227, 0, 1, 0, 0, 65,129,251, /* 0x 440 */
5, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 450 */ 255,255,255, 0, 72, 99,195, 73,141, 4, 65, 76,141, 4, 80,119, /* 0x 450 */
24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, /* 0x 460 */ 26, 76, 57,231, 15,132,219, 7, 0, 0, 15,182, 7, 65,193,226, /* 0x 460 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 470 */ 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183,144, 0, /* 0x 470 */
200, 5, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, /* 0x 480 */ 2, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, /* 0x 480 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x 490 */ 57,194,115, 32, 65,137,195,184, 0, 8, 0, 0, 1,246, 41,200, /* 0x 490 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4a0 */ 193,248, 5,133,219,141, 4, 2,102, 65,137,128, 0, 2, 0, 0, /* 0x 4a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4b0 */ 116, 33,235, 45, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, /* 0x 4b0 */
0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4c0 */ 141,116, 54, 1,102, 41,194,133,219,102, 65,137,144, 0, 2, 0, /* 0x 4c0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0, /* 0x 4d0 */ 0,116, 14,129,254,255, 0, 0, 0, 15,142, 97,255,255,255,235, /* 0x 4d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4e0 */ 120,129,254,255, 0, 0, 0,127,112, 72, 99,198, 65,129,251,255, /* 0x 4e0 */
8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4f0 */ 255,255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132, 67, 7, /* 0x 4f0 */
0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, /* 0x 500 */ 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, /* 0x 500 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 510 */ 65, 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15,183,202, /* 0x 510 */
18, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 520 */ 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, 0, /* 0x 520 */
0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 16, 0, 0, 0, /* 0x 530 */ 1,246, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0,235,161, /* 0x 530 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 540 */ 65, 41,195, 65, 41,194,137,208,102,193,232, 5,141,116, 54, 1, /* 0x 540 */
28, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 550 */ 102, 41,194,102, 65,137, 16,235,136, 72,139, 76, 36,232, 68,137, /* 0x 550 */
0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 16, 0, 0, 0, /* 0x 560 */ 248, 65,255,199, 65,137,245, 64,136, 52, 1,131,124, 36,200, 3, /* 0x 560 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 570 */ 127, 13,199, 68, 36,200, 0, 0, 0, 0,233,166, 6, 0, 0,139, /* 0x 570 */
38, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 580 */ 84, 36,200,139, 68, 36,200,131,234, 3,131,232, 6,131,124, 36, /* 0x 580 */
0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 16, 0, 0, 0, /* 0x 590 */ 200, 9, 15, 79,208,137, 84, 36,200,233,135, 6, 0, 0, 65, 41, /* 0x 590 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5a0 */ 195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 72,139, 68, /* 0x 5a0 */
48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5b0 */ 36,216, 65,129,251,255,255,255, 0,102, 65,137, 17, 72,141, 52, /* 0x 5b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x 5c0 */ 88,119, 26, 76, 57,231, 15,132,121, 6, 0, 0, 15,182, 7, 65, /* 0x 5c0 */
65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x 5d0 */ 193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150, /* 0x 5d0 */
68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x 5e0 */ 128, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, /* 0x 5e0 */
84, 67, 0, 65, 68, 82, 88, 0, 76, 69, 78, 88, 0, 0, 0, 0, /* 0x 5f0 */ 65, 57,194,115, 78, 65,137,195,184, 0, 8, 0, 0, 76,139, 76, /* 0x 5f0 */
85, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, /* 0x 600 */ 36,216, 41,200,139, 76, 36,196, 68,137,116, 36,196,193,248, 5, /* 0x 600 */
0, 0, 0, 0, 0, 0, 0, 0, 93, 2, 0, 0, 0, 0, 0, 0, /* 0x 610 */ 141, 4, 2,139, 84, 36,192,137, 76, 36,192,102,137,134,128, 1, /* 0x 610 */
10, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 620 */ 0, 0, 49,192,131,124, 36,200, 6,137, 84, 36,188, 15,159,192, /* 0x 620 */
114, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 5, 0, 0, 0, /* 0x 630 */ 73,129,193,100, 6, 0, 0,141, 4, 64,137, 68, 36,200,233, 84, /* 0x 630 */
0, 0, 0, 0, 0, 0, 0, 0,119, 2, 0, 0, 0, 0, 0, 0, /* 0x 640 */ 2, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, /* 0x 640 */
10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 650 */ 41,194, 65,129,251,255,255,255, 0,102,137,150,128, 1, 0, 0, /* 0x 650 */
124, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, /* 0x 660 */ 119, 26, 76, 57,231, 15,132,218, 5, 0, 0, 15,182, 7, 65,193, /* 0x 660 */
0, 0, 0, 0, 0, 0, 0, 0,129, 2, 0, 0, 0, 0, 0, 0, /* 0x 670 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150,152, /* 0x 670 */
10, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 680 */ 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, /* 0x 680 */
134, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, /* 0x 690 */ 57,194, 15,131,208, 0, 0, 0, 65,184, 0, 8, 0, 0, 65,137, /* 0x 690 */
0, 0, 0, 0, 0, 0, 0, 0,139, 2, 0, 0, 0, 0, 0, 0, /* 0x 6a0 */ 195, 72,193,227, 5, 68,137,192, 41,200,193,248, 5,141, 4, 2, /* 0x 6a0 */
10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6b0 */ 102,137,134,152, 1, 0, 0, 72,139, 68, 36,216, 72, 1,216, 65, /* 0x 6b0 */
144, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, /* 0x 6c0 */ 129,251,255,255,255, 0, 72,141, 52,104,119, 26, 76, 57,231, 15, /* 0x 6c0 */
0, 0, 0, 0, 0, 0, 0, 0, 10,116,109,112, 47, 97,109,100, /* 0x 6d0 */ 132,112, 5, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, /* 0x 6d0 */
54, 52, 45,108,105,110,117,120, 46,101,108,102, 45,101,110,116, /* 0x 6e0 */ 72,255,199, 65, 9,194, 15,183,150,224, 1, 0, 0, 68,137,216, /* 0x 6e0 */
114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32,102,105,108,101, /* 0x 6f0 */ 193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 79, 65, 41, /* 0x 6f0 */
32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, /* 0x 700 */ 200, 65,137,195, 65,193,248, 5, 69,133,255, 66,141, 4, 2,102, /* 0x 700 */
54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, /* 0x 710 */ 137,134,224, 1, 0, 0, 15,132, 41, 5, 0, 0, 49,192,131,124, /* 0x 710 */
73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 720 */ 36,200, 6, 72,139, 92, 36,232, 15,159,192,141, 68, 0, 9,137, /* 0x 720 */
32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, /* 0x 730 */ 68, 36,200, 68,137,248, 68, 41,240, 68, 15,182, 44, 3, 68,137, /* 0x 730 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x 740 */ 248, 65,255,199, 68,136, 44, 3,233,216, 4, 0, 0, 65, 41,195, /* 0x 740 */
65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 750 */ 65, 41,194,137,208,102,193,232, 5,102, 41,194,102,137,150,224, /* 0x 750 */
70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, /* 0x 760 */ 1, 0, 0,233, 17, 1, 0, 0, 65, 41,195, 65, 41,194,137,208, /* 0x 760 */
70,108, 97,103,115, 10, 32, 32, 48, 32, 76, 69, 88, 69, 67, 48, /* 0x 770 */ 102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102,137, /* 0x 770 */
48, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 50, 98,100, /* 0x 780 */ 150,152, 1, 0, 0,119, 26, 76, 57,231, 15,132,181, 4, 0, 0, /* 0x 780 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 790 */ 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9, /* 0x 790 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 7a0 */ 194, 15,183,150,176, 1, 0, 0, 68,137,216,193,232, 11, 15,183, /* 0x 7a0 */
48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, /* 0x 7b0 */ 202, 15,175,193, 65, 57,194,115, 32, 65,137,195,184, 0, 8, 0, /* 0x 7b0 */
50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x 7c0 */ 0, 41,200,193,248, 5,141, 4, 2,102,137,134,176, 1, 0, 0, /* 0x 7c0 */
82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x 7d0 */ 139, 68, 36,196,233,152, 0, 0, 0, 65, 41,195, 65, 41,194,137, /* 0x 7d0 */
83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, /* 0x 7e0 */ 208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102, /* 0x 7e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x 7f0 */ 137,150,176, 1, 0, 0,119, 26, 76, 57,231, 15,132, 68, 4, 0, /* 0x 7f0 */
32, 32, 32, 32,100, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, /* 0x 800 */ 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, /* 0x 800 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 810 */ 9,194, 15,183,150,200, 1, 0, 0, 68,137,216,193,232, 11, 15, /* 0x 810 */
32, 76, 69, 88, 69, 67, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, /* 0x 820 */ 183,202, 15,175,193, 65, 57,194,115, 29, 65,137,195,184, 0, 8, /* 0x 820 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, /* 0x 830 */ 0, 0, 41,200,193,248, 5,141, 4, 2,102,137,134,200, 1, 0, /* 0x 830 */
32, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, 48, 48, 48, 48, /* 0x 840 */ 0,139, 68, 36,192,235, 34, 65, 41,195, 65, 41,194,137,208,102, /* 0x 840 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, /* 0x 850 */ 193,232, 5,102, 41,194,139, 68, 36,188,102,137,150,200, 1, 0, /* 0x 850 */
97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 860 */ 0,139, 84, 36,192,137, 84, 36,188,139, 76, 36,196,137, 76, 36, /* 0x 860 */
48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x 870 */ 192, 68,137,116, 36,196, 65,137,198, 49,192,131,124, 36,200, 6, /* 0x 870 */
68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 880 */ 76,139, 76, 36,216, 15,159,192, 73,129,193,104, 10, 0, 0,141, /* 0x 880 */
48, 48, 48, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x 890 */ 68, 64, 8,137, 68, 36,200, 65,129,251,255,255,255, 0,119, 26, /* 0x 890 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x 8a0 */ 76, 57,231, 15,132,156, 3, 0, 0, 15,182, 7, 65,193,226, 8, /* 0x 8a0 */
32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 8b0 */ 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 17, 68,137, /* 0x 8b0 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 77, 10, 48, 48, /* 0x 8c0 */ 216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 39, 65, /* 0x 8c0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x 8d0 */ 137,195,184, 0, 8, 0, 0, 69, 49,237, 41,200,193,248, 5,141, /* 0x 8d0 */
32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, /* 0x 8e0 */ 4, 2,102, 65,137, 1, 72, 99, 68, 36,184, 72,193,224, 4, 77, /* 0x 8e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 74, 77, /* 0x 8f0 */ 141, 68, 1, 4,235,120, 65, 41,195, 65, 41,194,137,208,102,193, /* 0x 8f0 */
80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 900 */ 232, 5,102, 41,194, 65,129,251,255,255,255, 0,102, 65,137, 17, /* 0x 900 */
48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, /* 0x 910 */ 119, 26, 76, 57,231, 15,132, 42, 3, 0, 0, 15,182, 7, 65,193, /* 0x 910 */
42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 920 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 81, /* 0x 920 */
48, 48, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 930 */ 2, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194, /* 0x 930 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 940 */ 115, 52, 65,137,195,184, 0, 8, 0, 0, 65,189, 8, 0, 0, 0, /* 0x 940 */
32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 950 */ 41,200,193,248, 5,141, 4, 2,102, 65,137, 65, 2, 72, 99, 68, /* 0x 950 */
48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 67, 10, 48, 48, 48, /* 0x 960 */ 36,184, 72,193,224, 4, 77,141,132, 1, 4, 1, 0, 0, 65,185, /* 0x 960 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, /* 0x 970 */ 3, 0, 0, 0,235, 39, 65, 41,195, 65, 41,194,137,208,102,193, /* 0x 970 */
32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, /* 0x 980 */ 232, 5, 77,141,129, 4, 2, 0, 0, 65,189, 16, 0, 0, 0,102, /* 0x 980 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, /* 0x 990 */ 41,194,102, 65,137, 81, 2, 65,185, 8, 0, 0, 0, 68,137,203, /* 0x 990 */
85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9a0 */ 189, 1, 0, 0, 0, 72, 99,197, 65,129,251,255,255,255, 0, 73, /* 0x 9a0 */
48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, /* 0x 9b0 */ 141, 52, 64,119, 26, 76, 57,231, 15,132,135, 2, 0, 0, 15,182, /* 0x 9b0 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9c0 */ 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15, /* 0x 9c0 */
48, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9d0 */ 183, 14, 68,137,216,193,232, 11, 15,183,209, 15,175,194, 65, 57, /* 0x 9d0 */
48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 9e0 */ 194,115, 23, 65,137,195,184, 0, 8, 0, 0, 1,237, 41,208,193, /* 0x 9e0 */
42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9f0 */ 248, 5,141, 4, 1,102,137, 6,235, 22, 65, 41,195, 65, 41,194, /* 0x 9f0 */
48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 88, 10, 48, 48, 48, 48, /* 0x a00 */ 137,200,102,193,232, 5,141,108, 45, 1,102, 41,193,102,137, 14, /* 0x a00 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, /* 0x a10 */ 255,203,117,145,184, 1, 0, 0, 0, 68,137,201,211,224, 41,197, /* 0x a10 */
32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, /* 0x a20 */ 68, 1,237,131,124, 36,200, 3, 15,143,194, 1, 0, 0,131, 68, /* 0x a20 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 88, /* 0x a30 */ 36,200, 7,184, 3, 0, 0, 0,131,253, 4, 15, 76,197, 72,139, /* 0x a30 */
10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x a40 */ 92, 36,216, 65,184, 1, 0, 0, 0, 72,152, 72,193,224, 7, 76, /* 0x a40 */
67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 69, 88, 69, 67, /* 0x a50 */ 141,140, 3, 96, 3, 0, 0,187, 6, 0, 0, 0, 73, 99,192, 65, /* 0x a50 */
48, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, /* 0x a60 */ 129,251,255,255,255, 0, 73,141, 52, 65,119, 26, 76, 57,231, 15, /* 0x a60 */
32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x a70 */ 132,208, 1, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, /* 0x a70 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, /* 0x a80 */ 72,255,199, 65, 9,194, 15,183, 22, 68,137,216,193,232, 11, 15, /* 0x a80 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 53, 53, /* 0x a90 */ 183,202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, /* 0x a90 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x aa0 */ 0, 0, 69, 1,192, 41,200,193,248, 5,141, 4, 2,102,137, 6, /* 0x aa0 */
32, 32, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ab0 */ 235, 23, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, 71,141, /* 0x ab0 */
48, 48, 48, 48, 48, 50, 53,100, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x ac0 */ 68, 0, 1,102, 41,194,102,137, 22,255,203,117,143, 65,131,232, /* 0x ac0 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 77, 10, /* 0x ad0 */ 64, 65,131,248, 3, 69,137,198, 15,142, 13, 1, 0, 0, 65,131, /* 0x ad0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 55, 50, /* 0x ae0 */ 230, 1, 68,137,192,209,248, 65,131,206, 2, 65,131,248, 13,141, /* 0x ae0 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x af0 */ 112,255,127, 35,137,241, 72,139, 92, 36,216, 73, 99,192, 65,211, /* 0x af0 */
32, 32, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b00 */ 230, 72, 1,192, 68,137,242, 72,141, 20, 83, 72, 41,194, 76,141, /* 0x b00 */
48, 48, 48, 48, 48, 50, 55, 55, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x b10 */ 138, 94, 5, 0, 0,235, 81,141,112,251, 65,129,251,255,255,255, /* 0x b10 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 85, 10, /* 0x b20 */ 0,119, 26, 76, 57,231, 15,132, 25, 1, 0, 0, 15,182, 7, 65, /* 0x b20 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 55, 99, /* 0x b30 */ 193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65,209,235, /* 0x b30 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x b40 */ 69, 1,246, 69, 57,218,114, 7, 69, 41,218, 65,131,206, 1,255, /* 0x b40 */
32, 32, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b50 */ 206,117,199, 76,139, 76, 36,216, 65,193,230, 4,190, 4, 0, 0, /* 0x b50 */
48, 48, 48, 48, 48, 50, 56, 49, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x b60 */ 0, 73,129,193, 68, 6, 0, 0, 65,189, 1, 0, 0, 0,187, 1, /* 0x b60 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 85, 10, /* 0x b70 */ 0, 0, 0, 72, 99,195, 65,129,251,255,255,255, 0, 77,141, 4, /* 0x b70 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 56, 54, /* 0x b80 */ 65,119, 26, 76, 57,231, 15,132,185, 0, 0, 0, 15,182, 7, 65, /* 0x b80 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x b90 */ 193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, /* 0x b90 */
32, 32, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ba0 */ 16, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194, /* 0x ba0 */
48, 48, 48, 48, 48, 50, 56, 98, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x bb0 */ 115, 24, 65,137,195,184, 0, 8, 0, 0, 1,219, 41,200,193,248, /* 0x bb0 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 88, 10, /* 0x bc0 */ 5,141, 4, 2,102, 65,137, 0,235, 26, 65, 41,195, 65, 41,194, /* 0x bc0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 57, 48, /* 0x bd0 */ 137,208,102,193,232, 5,141, 92, 27, 1, 69, 9,238,102, 41,194, /* 0x bd0 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x be0 */ 102, 65,137, 16, 69, 1,237,255,206,117,136, 65,255,198,116, 64, /* 0x be0 */
32, 32, 32, 76, 69, 78, 88, 10, 10, 10 /* 0x bf0 */ 131,197, 2, 69, 57,254,119, 77, 72,139, 84, 36,232, 68,137,248, /* 0x bf0 */
68, 41,240, 68, 15,182, 44, 2, 68,137,248, 65,255,199,255,205, /* 0x c00 */
68,136, 44, 2, 15,149,194, 49,192, 68, 59,124, 36,228, 15,146, /* 0x c10 */
192,133,194,117,211, 68, 59,124, 36,228, 15,130, 69,247,255,255, /* 0x c20 */
65,129,251,255,255,255, 0,119, 22, 76, 57,231,184, 1, 0, 0, /* 0x c30 */
0,116, 35,235, 7,184, 1, 0, 0, 0,235, 26, 72,255,199,137, /* 0x c40 */
248, 43, 68, 36,248, 72,139, 76, 36,240, 72,139, 92, 36, 56,137, /* 0x c50 */
1, 68,137, 59, 49,192, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95, /* 0x c60 */
65, 87, 72,141, 71, 4, 69, 49,255, 65, 86, 65,190, 1, 0, 0, /* 0x c70 */
0, 65, 85, 69, 49,237, 65, 84, 85, 83, 72,137, 76, 36,240, 72, /* 0x c80 */
137, 68, 36,216,184, 1, 0, 0, 0, 72,137,116, 36,248, 76,137, /* 0x c90 */
68, 36,232,137,195, 68,137, 76, 36,228, 15,182, 79, 2,211,227, /* 0x ca0 */
137,217, 72,139, 92, 36, 56,255,201,137, 76, 36,212, 15,182, 79, /* 0x cb0 */
1,211,224, 72,139, 76, 36,240,255,200,137, 68, 36,208, 15,182, /* 0x cc0 */
7,199, 1, 0, 0, 0, 0,199, 68, 36,200, 0, 0, 0, 0,199, /* 0x cd0 */
68, 36,196, 1, 0, 0, 0,199, 68, 36,192, 1, 0, 0, 0,199, /* 0x ce0 */
68, 36,188, 1, 0, 0, 0,199, 3, 0, 0, 0, 0,137, 68, 36, /* 0x cf0 */
204, 15,182, 79, 1, 1,193,184, 0, 3, 0, 0,211,224, 49,201, /* 0x d00 */
141,184, 54, 7, 0, 0, 65, 57,255,115, 19, 72,139, 92, 36,216, /* 0x d10 */
137,200,255,193, 57,249,102,199, 4, 67, 0, 4,235,235, 72,139, /* 0x d20 */
124, 36,248,137,208, 69, 49,210, 65,131,203,255, 49,210, 73,137, /* 0x d30 */
252, 73, 1,196, 76, 57,231, 15,132,239, 8, 0, 0, 15,182, 7, /* 0x d40 */
65,193,226, 8,255,194, 72,255,199, 65, 9,194,131,250, 4,126, /* 0x d50 */
227, 68, 59,124, 36,228, 15,131,218, 8, 0, 0,139, 68, 36,212, /* 0x d60 */
72, 99, 92, 36,200, 72,139, 84, 36,216, 68, 33,248,137, 68, 36, /* 0x d70 */
184, 72, 99,108, 36,184, 72,137,216, 72,193,224, 4, 72, 1,232, /* 0x d80 */
65,129,251,255,255,255, 0, 76,141, 12, 66,119, 26, 76, 57,231, /* 0x d90 */
15,132,150, 8, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, /* 0x da0 */
8, 72,255,199, 65, 9,194, 65, 15,183, 17, 68,137,216,193,232, /* 0x db0 */
11, 15,183,202, 15,175,193, 65, 57,194, 15,131,197, 1, 0, 0, /* 0x dc0 */
65,137,195,184, 0, 8, 0, 0, 72,139, 92, 36,216, 41,200, 15, /* 0x dd0 */
182, 76, 36,204,190, 1, 0, 0, 0,193,248, 5,141, 4, 2, 65, /* 0x de0 */
15,182,213,102, 65,137, 1,139, 68, 36,208, 68, 33,248,211,224, /* 0x df0 */
185, 8, 0, 0, 0, 43, 76, 36,204,211,250, 1,208,105,192, 0, /* 0x e00 */
3, 0, 0,131,124, 36,200, 6,137,192, 76,141,140, 67,108, 14, /* 0x e10 */
0, 0, 15,142,184, 0, 0, 0, 72,139, 84, 36,232, 68,137,248, /* 0x e20 */
68, 41,240, 15,182, 44, 2, 1,237, 72, 99,214,137,235,129,227, /* 0x e30 */
0, 1, 0, 0, 65,129,251,255,255,255, 0, 72, 99,195, 73,141, /* 0x e40 */
4, 65, 76,141, 4, 80,119, 26, 76, 57,231, 15,132,219, 7, 0, /* 0x e50 */
0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, /* 0x e60 */
9,194, 65, 15,183,144, 0, 2, 0, 0, 68,137,216,193,232, 11, /* 0x e70 */
15,183,202, 15,175,193, 65, 57,194,115, 32, 65,137,195,184, 0, /* 0x e80 */
8, 0, 0, 1,246, 41,200,193,248, 5,133,219,141, 4, 2,102, /* 0x e90 */
65,137,128, 0, 2, 0, 0,116, 33,235, 45, 65, 41,195, 65, 41, /* 0x ea0 */
194,137,208,102,193,232, 5,141,116, 54, 1,102, 41,194,133,219, /* 0x eb0 */
102, 65,137,144, 0, 2, 0, 0,116, 14,129,254,255, 0, 0, 0, /* 0x ec0 */
15,142, 97,255,255,255,235,120,129,254,255, 0, 0, 0,127,112, /* 0x ed0 */
72, 99,198, 65,129,251,255,255,255, 0, 77,141, 4, 65,119, 26, /* 0x ee0 */
76, 57,231, 15,132, 67, 7, 0, 0, 15,182, 7, 65,193,226, 8, /* 0x ef0 */
65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 16, 68,137, /* 0x f00 */
216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 24, 65, /* 0x f10 */
137,195,184, 0, 8, 0, 0, 1,246, 41,200,193,248, 5,141, 4, /* 0x f20 */
2,102, 65,137, 0,235,161, 65, 41,195, 65, 41,194,137,208,102, /* 0x f30 */
193,232, 5,141,116, 54, 1,102, 41,194,102, 65,137, 16,235,136, /* 0x f40 */
72,139, 76, 36,232, 68,137,248, 65,255,199, 65,137,245, 64,136, /* 0x f50 */
52, 1,131,124, 36,200, 3,127, 13,199, 68, 36,200, 0, 0, 0, /* 0x f60 */
0,233,166, 6, 0, 0,139, 84, 36,200,139, 68, 36,200,131,234, /* 0x f70 */
3,131,232, 6,131,124, 36,200, 9, 15, 79,208,137, 84, 36,200, /* 0x f80 */
233,135, 6, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, /* 0x f90 */
5,102, 41,194, 72,139, 68, 36,216, 65,129,251,255,255,255, 0, /* 0x fa0 */
102, 65,137, 17, 72,141, 52, 88,119, 26, 76, 57,231, 15,132,121, /* 0x fb0 */
6, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, /* 0x fc0 */
199, 65, 9,194, 15,183,150,128, 1, 0, 0, 68,137,216,193,232, /* 0x fd0 */
11, 15,183,202, 15,175,193, 65, 57,194,115, 78, 65,137,195,184, /* 0x fe0 */
0, 8, 0, 0, 76,139, 76, 36,216, 41,200,139, 76, 36,196, 68, /* 0x ff0 */
137,116, 36,196,193,248, 5,141, 4, 2,139, 84, 36,192,137, 76, /* 0x1000 */
36,192,102,137,134,128, 1, 0, 0, 49,192,131,124, 36,200, 6, /* 0x1010 */
137, 84, 36,188, 15,159,192, 73,129,193,100, 6, 0, 0,141, 4, /* 0x1020 */
64,137, 68, 36,200,233, 84, 2, 0, 0, 65, 41,195, 65, 41,194, /* 0x1030 */
137,208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0, /* 0x1040 */
102,137,150,128, 1, 0, 0,119, 26, 76, 57,231, 15,132,218, 5, /* 0x1050 */
0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, /* 0x1060 */
65, 9,194, 15,183,150,152, 1, 0, 0, 68,137,216,193,232, 11, /* 0x1070 */
15,183,202, 15,175,193, 65, 57,194, 15,131,208, 0, 0, 0, 65, /* 0x1080 */
184, 0, 8, 0, 0, 65,137,195, 72,193,227, 5, 68,137,192, 41, /* 0x1090 */
200,193,248, 5,141, 4, 2,102,137,134,152, 1, 0, 0, 72,139, /* 0x10a0 */
68, 36,216, 72, 1,216, 65,129,251,255,255,255, 0, 72,141, 52, /* 0x10b0 */
104,119, 26, 76, 57,231, 15,132,112, 5, 0, 0, 15,182, 7, 65, /* 0x10c0 */
193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150, /* 0x10d0 */
224, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, /* 0x10e0 */
65, 57,194,115, 79, 65, 41,200, 65,137,195, 65,193,248, 5, 69, /* 0x10f0 */
133,255, 66,141, 4, 2,102,137,134,224, 1, 0, 0, 15,132, 41, /* 0x1100 */
5, 0, 0, 49,192,131,124, 36,200, 6, 72,139, 92, 36,232, 15, /* 0x1110 */
159,192,141, 68, 0, 9,137, 68, 36,200, 68,137,248, 68, 41,240, /* 0x1120 */
68, 15,182, 44, 3, 68,137,248, 65,255,199, 68,136, 44, 3,233, /* 0x1130 */
216, 4, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, /* 0x1140 */
102, 41,194,102,137,150,224, 1, 0, 0,233, 17, 1, 0, 0, 65, /* 0x1150 */
41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65,129, /* 0x1160 */
251,255,255,255, 0,102,137,150,152, 1, 0, 0,119, 26, 76, 57, /* 0x1170 */
231, 15,132,181, 4, 0, 0, 15,182, 7, 65,193,226, 8, 65,193, /* 0x1180 */
227, 8, 72,255,199, 65, 9,194, 15,183,150,176, 1, 0, 0, 68, /* 0x1190 */
137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 32, /* 0x11a0 */
65,137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4, 2, /* 0x11b0 */
102,137,134,176, 1, 0, 0,139, 68, 36,196,233,152, 0, 0, 0, /* 0x11c0 */
65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65, /* 0x11d0 */
129,251,255,255,255, 0,102,137,150,176, 1, 0, 0,119, 26, 76, /* 0x11e0 */
57,231, 15,132, 68, 4, 0, 0, 15,182, 7, 65,193,226, 8, 65, /* 0x11f0 */
193,227, 8, 72,255,199, 65, 9,194, 15,183,150,200, 1, 0, 0, /* 0x1200 */
68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, /* 0x1210 */
29, 65,137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4, /* 0x1220 */
2,102,137,134,200, 1, 0, 0,139, 68, 36,192,235, 34, 65, 41, /* 0x1230 */
195, 65, 41,194,137,208,102,193,232, 5,102, 41,194,139, 68, 36, /* 0x1240 */
188,102,137,150,200, 1, 0, 0,139, 84, 36,192,137, 84, 36,188, /* 0x1250 */
139, 76, 36,196,137, 76, 36,192, 68,137,116, 36,196, 65,137,198, /* 0x1260 */
49,192,131,124, 36,200, 6, 76,139, 76, 36,216, 15,159,192, 73, /* 0x1270 */
129,193,104, 10, 0, 0,141, 68, 64, 8,137, 68, 36,200, 65,129, /* 0x1280 */
251,255,255,255, 0,119, 26, 76, 57,231, 15,132,156, 3, 0, 0, /* 0x1290 */
15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9, /* 0x12a0 */
194, 65, 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15,175, /* 0x12b0 */
193, 65, 57,194,115, 39, 65,137,195,184, 0, 8, 0, 0, 69, 49, /* 0x12c0 */
237, 41,200,193,248, 5,141, 4, 2,102, 65,137, 1, 72, 99, 68, /* 0x12d0 */
36,184, 72,193,224, 4, 77,141, 68, 1, 4,235,120, 65, 41,195, /* 0x12e0 */
65, 41,194,137,208,102,193,232, 5,102, 41,194, 65,129,251,255, /* 0x12f0 */
255,255, 0,102, 65,137, 17,119, 26, 76, 57,231, 15,132, 42, 3, /* 0x1300 */
0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, /* 0x1310 */
65, 9,194, 65, 15,183, 81, 2, 68,137,216,193,232, 11, 15,183, /* 0x1320 */
202, 15,175,193, 65, 57,194,115, 52, 65,137,195,184, 0, 8, 0, /* 0x1330 */
0, 65,189, 8, 0, 0, 0, 41,200,193,248, 5,141, 4, 2,102, /* 0x1340 */
65,137, 65, 2, 72, 99, 68, 36,184, 72,193,224, 4, 77,141,132, /* 0x1350 */
1, 4, 1, 0, 0, 65,185, 3, 0, 0, 0,235, 39, 65, 41,195, /* 0x1360 */
65, 41,194,137,208,102,193,232, 5, 77,141,129, 4, 2, 0, 0, /* 0x1370 */
65,189, 16, 0, 0, 0,102, 41,194,102, 65,137, 81, 2, 65,185, /* 0x1380 */
8, 0, 0, 0, 68,137,203,189, 1, 0, 0, 0, 72, 99,197, 65, /* 0x1390 */
129,251,255,255,255, 0, 73,141, 52, 64,119, 26, 76, 57,231, 15, /* 0x13a0 */
132,135, 2, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, /* 0x13b0 */
72,255,199, 65, 9,194, 15,183, 14, 68,137,216,193,232, 11, 15, /* 0x13c0 */
183,209, 15,175,194, 65, 57,194,115, 23, 65,137,195,184, 0, 8, /* 0x13d0 */
0, 0, 1,237, 41,208,193,248, 5,141, 4, 1,102,137, 6,235, /* 0x13e0 */
22, 65, 41,195, 65, 41,194,137,200,102,193,232, 5,141,108, 45, /* 0x13f0 */
1,102, 41,193,102,137, 14,255,203,117,145,184, 1, 0, 0, 0, /* 0x1400 */
68,137,201,211,224, 41,197, 68, 1,237,131,124, 36,200, 3, 15, /* 0x1410 */
143,194, 1, 0, 0,131, 68, 36,200, 7,184, 3, 0, 0, 0,131, /* 0x1420 */
253, 4, 15, 76,197, 72,139, 92, 36,216, 65,184, 1, 0, 0, 0, /* 0x1430 */
72,152, 72,193,224, 7, 76,141,140, 3, 96, 3, 0, 0,187, 6, /* 0x1440 */
0, 0, 0, 73, 99,192, 65,129,251,255,255,255, 0, 73,141, 52, /* 0x1450 */
65,119, 26, 76, 57,231, 15,132,208, 1, 0, 0, 15,182, 7, 65, /* 0x1460 */
193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183, 22, /* 0x1470 */
68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, /* 0x1480 */
24, 65,137,195,184, 0, 8, 0, 0, 69, 1,192, 41,200,193,248, /* 0x1490 */
5,141, 4, 2,102,137, 6,235, 23, 65, 41,195, 65, 41,194,137, /* 0x14a0 */
208,102,193,232, 5, 71,141, 68, 0, 1,102, 41,194,102,137, 22, /* 0x14b0 */
255,203,117,143, 65,131,232, 64, 65,131,248, 3, 69,137,198, 15, /* 0x14c0 */
142, 13, 1, 0, 0, 65,131,230, 1, 68,137,192,209,248, 65,131, /* 0x14d0 */
206, 2, 65,131,248, 13,141,112,255,127, 35,137,241, 72,139, 92, /* 0x14e0 */
36,216, 73, 99,192, 65,211,230, 72, 1,192, 68,137,242, 72,141, /* 0x14f0 */
20, 83, 72, 41,194, 76,141,138, 94, 5, 0, 0,235, 81,141,112, /* 0x1500 */
251, 65,129,251,255,255,255, 0,119, 26, 76, 57,231, 15,132, 25, /* 0x1510 */
1, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, /* 0x1520 */
199, 65, 9,194, 65,209,235, 69, 1,246, 69, 57,218,114, 7, 69, /* 0x1530 */
41,218, 65,131,206, 1,255,206,117,199, 76,139, 76, 36,216, 65, /* 0x1540 */
193,230, 4,190, 4, 0, 0, 0, 73,129,193, 68, 6, 0, 0, 65, /* 0x1550 */
189, 1, 0, 0, 0,187, 1, 0, 0, 0, 72, 99,195, 65,129,251, /* 0x1560 */
255,255,255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132,185, /* 0x1570 */
0, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, /* 0x1580 */
199, 65, 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15,183, /* 0x1590 */
202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, /* 0x15a0 */
0, 1,219, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0,235, /* 0x15b0 */
26, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,141, 92, 27, /* 0x15c0 */
1, 69, 9,238,102, 41,194,102, 65,137, 16, 69, 1,237,255,206, /* 0x15d0 */
117,136, 65,255,198,116, 64,131,197, 2, 69, 57,254,119, 77, 72, /* 0x15e0 */
139, 84, 36,232, 68,137,248, 68, 41,240, 68, 15,182, 44, 2, 68, /* 0x15f0 */
137,248, 65,255,199,255,205, 68,136, 44, 2, 15,149,194, 49,192, /* 0x1600 */
68, 59,124, 36,228, 15,146,192,133,194,117,211, 68, 59,124, 36, /* 0x1610 */
228, 15,130, 69,247,255,255, 65,129,251,255,255,255, 0,119, 22, /* 0x1620 */
76, 57,231,184, 1, 0, 0, 0,116, 35,235, 7,184, 1, 0, 0, /* 0x1630 */
0,235, 26, 72,255,199,137,248, 43, 68, 36,248, 72,139, 76, 36, /* 0x1640 */
240, 72,139, 92, 36, 56,137, 1, 68,137, 59, 49,192, 91, 93, 65, /* 0x1650 */
92, 65, 93, 65, 94, 65, 95, 72,139,117,248, 72,139,125, 16,139, /* 0x1660 */
75, 4, 72, 1,206,139, 19, 72, 1,215,201, 89, 72,137,240, 72, /* 0x1670 */
41,200, 90, 72, 41,215, 89,137, 57, 91, 93,195,104, 30, 0, 0, /* 0x1680 */
0, 90,232, 0, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, 69, 67, /* 0x1690 */
124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105,108, /* 0x16a0 */
101,100, 46, 10, 0, 94,106, 2, 95,106, 1, 88, 15, 5,106,127, /* 0x16b0 */
95,106, 60, 88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, 90,190, /* 0x16c0 */
0, 0, 0, 0,106, 50, 65, 90, 69, 41,192,106, 9, 88, 15, 5, /* 0x16d0 */
57,199, 15,133, 0, 0, 0, 0,104, 0, 0, 0, 0,104, 0, 0, /* 0x16e0 */
0, 0,190, 0, 0, 0, 0,104, 0, 0, 0, 0,185, 0, 0, 0, /* 0x16f0 */
0,104, 0, 0, 0, 0, 65, 87,137,250, 41,242, 1,213, 1,211, /* 0x1700 */
252,243, 72,165,151,137,222, 80,146,173, 80, 72,137,225,173,151, /* 0x1710 */
173, 68, 15,182,192,135,254,255,213, 89,195, 93, 68,139,125,247, /* 0x1720 */
65,129,239,200, 0, 0, 0,232,138,255,255,255, 0, 46,115,121, /* 0x1730 */
109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,104, /* 0x1740 */
115,116,114,116, 97, 98, 0, 46,114,101,108, 97, 69, 76, 70, 77, /* 0x1750 */
65, 73, 78, 88, 0, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 0, /* 0x1760 */
46,114,101,108, 97, 78, 82, 86, 50, 69, 0, 46,114,101,108, 97, /* 0x1770 */
78, 82, 86, 50, 66, 0, 46,114,101,108, 97, 76, 90, 77, 65, 95, /* 0x1780 */
69, 76, 70, 48, 48, 0, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, /* 0x1790 */
0, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 0, 76, 90, 77, 65, /* 0x17a0 */
95, 68, 69, 67, 51, 48, 0, 46,114,101,108, 97, 69, 76, 70, 77, /* 0x17b0 */
65, 73, 78, 89, 0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, /* 0x17c0 */
78, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17e0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17f0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1800 */
0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, /* 0x1810 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1820 */
64, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, /* 0x1830 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1840 */
0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, /* 0x1850 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1860 */
232, 30, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1870 */
18, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1880 */
24, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 1, 0, 0, 0, /* 0x1890 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18a0 */
80, 0, 0, 0, 0, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, /* 0x18b0 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x18c0 */
0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 1, 0, 0, 0, /* 0x18d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18e0 */
192, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, /* 0x18f0 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1900 */
0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, /* 0x1910 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1920 */
0, 31, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, /* 0x1930 */
18, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1940 */
24, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 1, 0, 0, 0, /* 0x1950 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1960 */
128, 1, 0, 0, 0, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, /* 0x1970 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1980 */
0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 4, 0, 0, 0, /* 0x1990 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x19a0 */
48, 31, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, /* 0x19b0 */
18, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x19c0 */
24, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 1, 0, 0, 0, /* 0x19d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x19e0 */
21, 2, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, /* 0x19f0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1a00 */
0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 4, 0, 0, 0, /* 0x1a10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a20 */
96, 31, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1a30 */
18, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1a40 */
24, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 1, 0, 0, 0, /* 0x1a50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a60 */
121, 2, 0, 0, 0, 0, 0, 0,247, 9, 0, 0, 0, 0, 0, 0, /* 0x1a70 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1a80 */
0, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, 0, 1, 0, 0, 0, /* 0x1a90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1aa0 */
112, 12, 0, 0, 0, 0, 0, 0,247, 9, 0, 0, 0, 0, 0, 0, /* 0x1ab0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1ac0 */
0, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0, 1, 0, 0, 0, /* 0x1ad0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ae0 */
103, 22, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, /* 0x1af0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1b00 */
0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, /* 0x1b10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1b20 */
123, 22, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, /* 0x1b30 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1b40 */
0, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 4, 0, 0, 0, /* 0x1b50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1b60 */
120, 31, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1b70 */
18, 0, 0, 0, 13, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1b80 */
24, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 1, 0, 0, 0, /* 0x1b90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ba0 */
181, 22, 0, 0, 0, 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, /* 0x1bb0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1bc0 */
0, 0, 0, 0, 0, 0, 0, 0,137, 0, 0, 0, 4, 0, 0, 0, /* 0x1bd0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1be0 */
144, 31, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, /* 0x1bf0 */
18, 0, 0, 0, 15, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1c00 */
24, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, /* 0x1c10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1c20 */
60, 23, 0, 0, 0, 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, /* 0x1c30 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1c40 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, /* 0x1c50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1c60 */
216, 28, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, /* 0x1c70 */
19, 0, 0, 0, 11, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1c80 */
24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, /* 0x1c90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ca0 */
184, 30, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, /* 0x1cb0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1cc0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1cd0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ce0 */
0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1cf0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 12, 0, /* 0x1d00 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d10 */
0, 0, 0, 0, 3, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d20 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 15, 0, /* 0x1d30 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d40 */
0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, /* 0x1d60 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d70 */
0, 0, 0, 0, 3, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d80 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 8, 0, /* 0x1d90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1da0 */
0, 0, 0, 0, 3, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1db0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 11, 0, /* 0x1dc0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1dd0 */
1, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1de0 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, /* 0x1df0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e00 */
13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e10 */
0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 16, 0, 0, 0, /* 0x1e20 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e30 */
23, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e40 */
0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 16, 0, 0, 0, /* 0x1e50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e60 */
33, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e70 */
0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 16, 0, 0, 0, /* 0x1e80 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e90 */
43, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ea0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x1eb0 */
65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x1ec0 */
68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x1ed0 */
84, 67, 0, 65, 68, 82, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1ee0 */
2, 0, 0, 0, 4, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, /* 0x1ef0 */
179, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x1f00 */
38, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, /* 0x1f10 */
2, 0, 0, 0, 3, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x1f20 */
143, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x1f30 */
38, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, /* 0x1f40 */
2, 0, 0, 0, 3, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x1f50 */
6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, /* 0x1f60 */
16, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1f70 */
2, 0, 0, 0, 4, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x1f80 */
19, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, /* 0x1f90 */
0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, /* 0x1fa0 */
10, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1fb0 */
52, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, /* 0x1fc0 */
0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, /* 0x1fd0 */
10, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1fe0 */
62, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 16, 0, 0, 0, /* 0x1ff0 */
0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, /* 0x2000 */
10, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x2010 */
72, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 18, 0, 0, 0, /* 0x2020 */
0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, /* 0x2030 */
10, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x2040 */
47, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, /* 0x2050 */
13, 0, 0, 0, 0, 0, 0, 0, 10,116,109,112, 47, 97,109,100, /* 0x2060 */
54, 52, 45,108,105,110,117,120, 46,101,108,102, 45,101,110,116, /* 0x2070 */
114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32,102,105,108,101, /* 0x2080 */
32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, /* 0x2090 */
54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, /* 0x20a0 */
73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x20b0 */
32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, /* 0x20c0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x20d0 */
65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x20e0 */
70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, /* 0x20f0 */
70,108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, /* 0x2100 */
78, 88, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48,100, /* 0x2110 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2120 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2130 */
48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, /* 0x2140 */
50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x2150 */
82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x2160 */
32, 32, 49, 32, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 32, 32, /* 0x2170 */
32, 32, 48, 48, 48, 48, 48, 48, 54, 98, 32, 32, 48, 48, 48, 48, /* 0x2180 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x2190 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x21a0 */
48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 51, 32, 32, /* 0x21b0 */
67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, /* 0x21c0 */
76, 89, 10, 32, 32, 50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, /* 0x21d0 */
32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 98, 99, 32, 32, 48, /* 0x21e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x21f0 */
32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2200 */
48, 32, 32, 48, 48, 48, 48, 48, 48, 99, 48, 32, 32, 50, 42, 42, /* 0x2210 */
51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, /* 0x2220 */
79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, /* 0x2230 */
32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, /* 0x2240 */
48, 48, 48, 48, 48, 57, 53, 32, 32, 48, 48, 48, 48, 48, 48, 48, /* 0x2250 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x2260 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, /* 0x2270 */
48, 48, 49, 56, 48, 32, 32, 50, 42, 42, 51, 32, 32, 67, 79, 78, /* 0x2280 */
84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, /* 0x2290 */
65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 76, 90, 77, 65, 95, /* 0x22a0 */
69, 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 54, /* 0x22b0 */
52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x22c0 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x22d0 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 49, 53, 32, /* 0x22e0 */
32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, /* 0x22f0 */
32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, /* 0x2300 */
10, 32, 32, 53, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, /* 0x2310 */
32, 32, 32, 48, 48, 48, 48, 48, 57,102, 55, 32, 32, 48, 48, 48, /* 0x2320 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x2330 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2340 */
32, 48, 48, 48, 48, 48, 50, 55, 57, 32, 32, 50, 42, 42, 48, 32, /* 0x2350 */
32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, /* 0x2360 */
78, 76, 89, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2370 */
50, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 57,102, 55, 32, 32, /* 0x2380 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2390 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x23a0 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 99, 55, 48, 32, 32, 50, 42, /* 0x23b0 */
42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, /* 0x23c0 */
65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 95, /* 0x23d0 */
68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49, /* 0x23e0 */
52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x23f0 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2400 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 54, 54, 55, 32, /* 0x2410 */
32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, /* 0x2420 */
32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56, 32, 69, 76, /* 0x2430 */
70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, /* 0x2440 */
48, 48, 51, 97, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2450 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2460 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 54, /* 0x2470 */
55, 98, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, /* 0x2480 */
84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, /* 0x2490 */
78, 76, 89, 10, 32, 32, 57, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x24a0 */
32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 56, 55, 32, 32, /* 0x24b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x24c0 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x24d0 */
48, 48, 32, 32, 48, 48, 48, 48, 49, 54, 98, 53, 32, 32, 50, 42, /* 0x24e0 */
42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, /* 0x24f0 */
76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, /* 0x2500 */
77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, /* 0x2510 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2520 */
32, 32,100, 32, 32, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 9, /* 0x2530 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2540 */
32, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 10, 48, 48, 48, 48, /* 0x2550 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2560 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 9, /* 0x2570 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2580 */
32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, 48, 48, 48, 48, /* 0x2590 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x25a0 */
32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, 48, 48, /* 0x25b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, /* 0x25c0 */
76, 70, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x25d0 */
48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x25e0 */
32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48, /* 0x25f0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, /* 0x2600 */
73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2610 */
48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, /* 0x2620 */
77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2630 */
48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, /* 0x2640 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2650 */
32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, /* 0x2660 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2670 */
78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2680 */
48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, /* 0x2690 */
82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x26a0 */
48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, /* 0x26b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x26c0 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 9, /* 0x26d0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x26e0 */
32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, /* 0x26f0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2700 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, /* 0x2710 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2720 */
32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, /* 0x2730 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2740 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 9, /* 0x2750 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2760 */
32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, /* 0x2770 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, /* 0x2780 */
32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, /* 0x2790 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95, /* 0x27a0 */
115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x27b0 */
48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, /* 0x27c0 */
85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x27d0 */
48, 48, 48, 48, 48, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, /* 0x27e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, /* 0x27f0 */
32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, /* 0x2800 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 77, 10, /* 0x2810 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2820 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, /* 0x2830 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2840 */
74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2850 */
48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, /* 0x2860 */
78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2870 */
48, 48, 48, 48, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, /* 0x2880 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x2890 */
32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x28a0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 67, 10, 48, /* 0x28b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x28c0 */
32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, /* 0x28d0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, /* 0x28e0 */
69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x28f0 */
48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x2900 */
68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2910 */
48, 48, 48, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2920 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x2930 */
32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2940 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 88, 10, 10, 10, /* 0x2950 */
82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x2960 */
68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x2970 */
93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, /* 0x2980 */
32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2990 */
32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, /* 0x29a0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, /* 0x29b0 */
88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x29c0 */
69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, 48, 48, /* 0x29d0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 50, 10, 10, 10, 82, 69, /* 0x29e0 */
76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, /* 0x29f0 */
32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, /* 0x2a00 */
70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, /* 0x2a10 */
89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2a20 */
32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2a30 */
48, 48, 48, 48, 48, 48, 98, 51, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x2a40 */
52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 78, 82, 86, 95, 67, /* 0x2a50 */
79, 77, 77, 79, 78, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2a60 */
48, 48, 48, 48, 48, 48, 50, 54, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2a70 */
48, 48, 48, 48, 48, 48, 48, 54, 48, 32, 82, 95, 88, 56, 54, 95, /* 0x2a80 */
54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, /* 0x2a90 */
65, 73, 78, 89, 43, 48,120,102,102,102,102,102,102,102,102,102, /* 0x2aa0 */
102,102,102,102,102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, /* 0x2ab0 */
84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, /* 0x2ac0 */
32, 91, 78, 82, 86, 50, 66, 93, 58, 10, 79, 70, 70, 83, 69, 84, /* 0x2ad0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, /* 0x2ae0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, /* 0x2af0 */
85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2b00 */
48, 48, 56,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, /* 0x2b10 */
51, 50, 32, 32, 32, 32, 32, 78, 82, 86, 95, 67, 79, 77, 77, 79, /* 0x2b20 */
78, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2b30 */
48, 48, 50, 54, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2b40 */
48, 48, 48, 53, 55, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x2b50 */
67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, /* 0x2b60 */
43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x2b70 */
102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x2b80 */
32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, /* 0x2b90 */
77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, /* 0x2ba0 */
84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, /* 0x2bb0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, /* 0x2bc0 */
76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2bd0 */
48, 48, 48, 48, 54, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x2be0 */
67, 51, 50, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2bf0 */
51, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2c00 */
48, 48, 48, 49, 48, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, /* 0x2c10 */
79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, /* 0x2c20 */
69, 76, 70, 77, 65, 73, 78, 89, 93, 58, 10, 79, 70, 70, 83, 69, /* 0x2c30 */
84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, /* 0x2c40 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, /* 0x2c50 */
76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2c60 */
48, 48, 48, 49, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x2c70 */
67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x2c80 */
43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x2c90 */
102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x2ca0 */
32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, /* 0x2cb0 */
70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, /* 0x2cc0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x2cd0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x2ce0 */
69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2cf0 */
48, 49, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2d00 */
32, 32, 32, 32, 32, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, /* 0x2d10 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 98, 32, 82, 95, 88, 56, /* 0x2d20 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, /* 0x2d30 */
78, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2d40 */
48, 51, 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2d50 */
32, 32, 32, 32, 32, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, /* 0x2d60 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 57, 32, 82, 95, 88, 56, /* 0x2d70 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, /* 0x2d80 */
82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2d90 */
48, 51,101, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2da0 */
32, 32, 32, 32, 32, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, /* 0x2db0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 51, 32, 82, 95, 88, 56, /* 0x2dc0 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, /* 0x2dd0 */
78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2de0 */
48, 52, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2df0 */
32, 32, 32, 32, 32, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, /* 0x2e00 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 52,100, 32, 82, 95, 88, 56, /* 0x2e10 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, /* 0x2e20 */
82, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2e30 */
48, 50,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, /* 0x2e40 */
50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 43, 48, /* 0x2e50 */
120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2e60 */
100, 10, 10, 10 /* 0x2e70 */
}; };
+3303 -2863
View File
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
+588 -43
View File
@@ -1,4 +1,4 @@
/* powerpc-linux.elf-entry.h -- created from powerpc-linux.elf-entry.bin, 604 (0x25c) bytes /* powerpc-linux.elf-entry.h -- created from powerpc-linux.elf-entry.bin, 9316 (0x2464) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -27,47 +27,592 @@
*/ */
#define LINUX_ELFPPC32_LOADER_SIZE 604 #define LINUX_ELFPPC32_LOADER_SIZE 9316
#define LINUX_ELFPPC32_LOADER_ADLER32 0x0a8bbdb5 #define LINUX_ELFPPC32_LOADER_ADLER32 0xf98c7322
#define LINUX_ELFPPC32_LOADER_CRC32 0xcfe347e7 #define LINUX_ELFPPC32_LOADER_CRC32 0xfe9cda55
unsigned char linux_elfppc32_loader[604] = { unsigned char linux_elfppc32_loader[9316] = {
72, 0, 2, 77,124, 0, 41,236,144,166, 0, 0,124,132, 26, 20, /* 0x 0 */ 127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */
60, 0,128, 0, 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, /* 0x 10 */ 0, 1, 0, 20, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */
57, 64,255,255,125,168, 2,166, 72, 0, 1, 12, 57, 32, 0, 1, /* 0x 20 */ 0, 0, 23,160, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, /* 0x 20 */
125, 41, 28, 44, 56, 99, 0, 4,124, 9, 0, 64,125, 41, 72, 20, /* 0x 30 */ 0, 20, 0, 17, 72, 0, 0,125,124, 0, 41,236,125,168, 2,166, /* 0x 30 */
97, 41, 0, 1, 78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1, /* 0x 40 */ 40, 7, 0, 8, 64,130, 1, 60,144,166, 0, 0,124,132, 26, 20, /* 0x 40 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255,213, 65,129,255,236, /* 0x 50 */ 60, 0,128, 0, 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, /* 0x 50 */
56,224, 0, 1, 72, 0, 0, 20, 56,231,255,255,125, 41, 72, 21, /* 0x 60 */ 57, 64,255,255, 72, 0, 1, 12, 57, 32, 0, 1,125, 41, 28, 44, /* 0x 60 */
65,162,255,189,124,231, 57, 20,125, 41, 72, 21, 65,162,255,177, /* 0x 70 */ 56, 99, 0, 4,124, 9, 0, 64,125, 41, 72, 20, 97, 41, 0, 1, /* 0x 70 */
124,231, 57, 20,124, 9, 0, 64,125, 41, 74, 20, 65,162,255,161, /* 0x 80 */ 78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1,124, 9, 0, 64, /* 0x 80 */
65,160,255,216, 57, 0, 0, 0, 52,231,255,253, 84,231, 64, 46, /* 0x 90 */ 125, 41, 74, 20, 65,162,255,213, 65,129,255,236, 56,224, 0, 1, /* 0x 90 */
65,128, 0, 32,140, 67, 0, 1,124,234, 16,249,125, 74, 14,112, /* 0x a0 */ 72, 0, 0, 20, 56,231,255,255,125, 41, 72, 21, 65,162,255,189, /* 0x a0 */
65,130, 0,148,112, 66, 0, 1, 65,162, 0, 80, 72, 0, 0, 20, /* 0x b0 */ 124,231, 57, 20,125, 41, 72, 21, 65,162,255,177,124,231, 57, 20, /* 0x b0 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255,101, 65,161, 0, 60, /* 0x c0 */ 124, 9, 0, 64,125, 41, 74, 20, 65,162,255,161, 65,160,255,216, /* 0x c0 */
57, 0, 0, 1,124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 81, /* 0x d0 */ 57, 0, 0, 0, 52,231,255,253, 84,231, 64, 46, 65,128, 0, 32, /* 0x d0 */
65,161, 0, 40,125, 41, 72, 21, 65,162,255, 69,125, 8, 65, 20, /* 0x e0 */ 140, 67, 0, 1,124,234, 16,249,125, 74, 14,112, 65,130, 0, 0, /* 0x e0 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 53, 65,160,255,232, /* 0x f0 */ 112, 66, 0, 1, 65,162, 0, 80, 72, 0, 0, 20,124, 9, 0, 64, /* 0x f0 */
57, 8, 0, 2, 72, 0, 0, 16,125, 41, 72, 21, 65,162,255, 33, /* 0x 100 */ 125, 41, 74, 20, 65,162,255,101, 65,161, 0, 60, 57, 0, 0, 1, /* 0x 100 */
125, 8, 65, 20, 32,234,250,255, 57, 8, 0, 2,125, 8, 1,148, /* 0x 110 */ 124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 81, 65,161, 0, 40, /* 0x 110 */
124,234, 42, 20,125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1, /* 0x 120 */ 125, 41, 72, 21, 65,162,255, 69,125, 8, 65, 20,124, 9, 0, 64, /* 0x 120 */
66, 0,255,248, 56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44, /* 0x 130 */ 125, 41, 74, 20, 65,162,255, 53, 65,160,255,232, 57, 8, 0, 2, /* 0x 130 */
75,255,255, 16,128, 6, 0, 0,125,168, 3,166, 56,165, 0, 1, /* 0x 140 */ 72, 0, 0, 16,125, 41, 72, 21, 65,162,255, 33,125, 8, 65, 20, /* 0x 140 */
56, 99, 0, 1,124,160, 40, 80,124,100, 24, 80,144,166, 0, 0, /* 0x 150 */ 32,234,250,255, 57, 8, 0, 2,125, 8, 1,148,124,234, 42, 20, /* 0x 150 */
78,128, 0, 32, 10, 36, 73,100, 58, 32, 85, 80, 88, 32, 40, 67, /* 0x 160 */ 125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1, 66, 0,255,248, /* 0x 160 */
41, 32, 49, 57, 57, 54, 45, 50, 48, 48, 54, 32,116,104,101, 32, /* 0x 170 */ 56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44, 75,255,255, 16, /* 0x 170 */
85, 80, 88, 32, 84,101, 97,109, 46, 32, 65,108,108, 32, 82,105, /* 0x 180 */ 124, 0, 41,236,125,168, 2,166, 40, 7, 0, 2, 64,130, 0,228, /* 0x 180 */
103,104,116,115, 32, 82,101,115,101,114,118,101,100, 46, 32,104, /* 0x 190 */ 144,166, 0, 0,124,132, 26, 20, 60, 0,128, 0, 61, 32,128, 0, /* 0x 190 */
116,116,112, 58, 47, 47,117,112,120, 46,115,102, 46,110,101,116, /* 0x 1a0 */ 56, 99,255,255, 56,165,255,255, 57, 64,255,255, 72, 0, 0,180, /* 0x 1a0 */
32, 36, 10, 0, 72, 0, 0, 37, 80, 82, 79, 84, 95, 69, 88, 69, /* 0x 1b0 */ 124, 9, 0, 64,125, 41, 72, 20, 76,162, 0, 32, 57, 32, 0, 1, /* 0x 1b0 */
67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105, /* 0x 1c0 */ 125, 41, 28, 44, 56, 99, 0, 4,124, 9, 0, 64,125, 41, 73, 20, /* 0x 1c0 */
108,101,100, 46, 10, 0, 0, 0, 56,160, 0, 32,124,136, 2,166, /* 0x 1d0 */ 78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1, 75,255,255,213, /* 0x 1d0 */
56, 96, 0, 2, 56, 0, 0, 4, 68, 0, 0, 2, 56, 96, 0,127, /* 0x 1e0 */ 65,129,255,244, 56,224, 0, 1, 75,255,255,201,124,231, 57, 21, /* 0x 1e0 */
56, 0, 0, 1, 68, 0, 0, 2,127,200, 2,166, 57, 0, 0, 0, /* 0x 1f0 */ 75,255,255,193, 65,160,255,244, 52,231,255,253, 57, 0, 0, 0, /* 0x 1f0 */
56,224,255,255,128,126, 0, 4, 56,192, 0, 50, 56,160, 0, 7, /* 0x 200 */ 65,128, 0, 20,140, 67, 0, 1, 84,231, 64, 46,124,234, 16,249, /* 0x 200 */
56,128, 16, 0,124, 99,242, 20, 56, 0, 0, 90, 56, 99, 16, 11, /* 0x 210 */ 65,130, 0, 0, 75,255,255,157,125, 8, 65, 21, 75,255,255,149, /* 0x 210 */
84, 99, 0, 38, 68, 0, 0, 2, 65,163,255,140,127,233, 3,166, /* 0x 220 */ 125, 8, 65, 21, 56,224, 0, 1, 64,130, 0, 28, 56,224, 0, 3, /* 0x 220 */
136,254, 0, 8, 56,193, 0,124,124,101, 27,120,124,104, 3,166, /* 0x 230 */ 57, 0, 0, 1, 75,255,255,125,125, 8, 65, 21, 75,255,255,117, /* 0x 230 */
128,158, 0, 4, 56,126, 0, 12, 78,128, 4, 32,148, 33,255,128, /* 0x 240 */ 65,160,255,244, 32, 74,242,255,125, 8, 57, 20,124,234, 42, 20, /* 0x 240 */
188, 65, 0, 4,127,232, 2,166, 75,255,255,161 /* 0x 250 */ 125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1, 66, 0,255,248, /* 0x 250 */
56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44, 75,255,255,112, /* 0x 260 */
124,128, 0, 8, 40, 7, 0, 14, 64,130, 0, 12,124, 8, 2,166, /* 0x 270 */
129, 6, 0, 0,124,167, 43,120, 56,164,255,254, 56,131, 0, 2, /* 0x 280 */
144, 1, 0, 4,136, 3, 0, 0, 84, 11,232,254, 84, 2, 7,126, /* 0x 290 */
56, 96,250, 0,124, 99, 88, 48, 56, 99,241,128,124, 38, 11,120, /* 0x 2a0 */
124, 33, 26, 20, 84, 33, 0, 52,124,195, 51,120, 56, 0, 0, 0, /* 0x 2b0 */
148, 3,255,252,124, 1, 24, 64, 65,128,255,248,144,193, 0, 0, /* 0x 2c0 */
136, 4,255,255, 57, 33, 0, 8, 56,193, 0, 12, 56, 97, 0, 16, /* 0x 2d0 */
84, 11,225, 62, 84, 0, 7, 62,152, 67, 0, 2,153, 99, 0, 1, /* 0x 2e0 */
152, 3, 0, 0,124, 8, 2,166,148, 33,255,160,189,193, 0, 24, /* 0x 2f0 */
144, 1, 0,100, 59, 32, 0, 0,137, 67, 0, 2,137, 99, 0, 1, /* 0x 300 */
138, 67, 0, 0,147, 38, 0, 0,147, 41, 0, 0,136, 3, 0, 1, /* 0x 310 */
125, 40, 3,166,124, 18, 2, 20, 57, 32, 3, 0,125, 41, 0, 48, /* 0x 320 */
56, 9, 7, 54,127,153, 0, 64, 57, 32, 0, 1,125, 43, 88, 48, /* 0x 330 */
125, 41, 80, 48, 57, 41,255,255, 57,107,255,255,145, 33, 0, 8, /* 0x 340 */
124,206, 51,120,124,147, 35,120,124,245, 59,120,125, 20, 67,120, /* 0x 350 */
145, 97, 0, 12, 59, 3, 0, 4, 59,224, 0, 0, 58,224, 0, 0, /* 0x 360 */
59, 64, 0, 1, 58, 32, 0, 1, 58, 0, 0, 1, 57,224, 0, 1, /* 0x 370 */
57, 32, 0, 0, 64,156, 0, 28,124, 9, 3,166, 57, 96, 4, 0, /* 0x 380 */
85, 32, 8, 60,125,120, 3, 46, 57, 41, 0, 1, 66, 0,255,244, /* 0x 390 */
127,179, 42, 20,126,108,155,120, 56,160, 0, 0, 57, 0,255,255, /* 0x 3a0 */
57, 96, 0, 0,127,140,232, 0, 57,107, 0, 1, 47, 11, 0, 4, /* 0x 3b0 */
84,169, 64, 46, 65,158, 8,156,136, 12, 0, 0, 57,140, 0, 1, /* 0x 3c0 */
125, 37, 3,120, 64,153,255,224,127,153,160, 64, 64,156, 8,100, /* 0x 3d0 */
62,192, 0,255, 98,214,255,255,128, 1, 0, 8,127,136,176, 64, /* 0x 3e0 */
127, 35, 0, 56, 86,224, 32, 54,124, 0, 26, 20, 84, 6, 8, 60, /* 0x 3f0 */
65,157, 0, 32,127,140,232, 0, 65,158, 8, 88,137, 44, 0, 0, /* 0x 400 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x 410 */
124,230,194, 46, 85, 0,170,254,125, 64, 57,214,127,133, 80, 64, /* 0x 420 */
64,156, 1,172,128, 1, 0, 12, 47,151, 0, 6,127, 41, 0, 56, /* 0x 430 */
32, 18, 0, 8,127,224, 6, 48,125, 41,144, 48,125, 41, 2, 20, /* 0x 440 */
29, 41, 6, 0, 32, 7, 8, 0,124, 0, 46,112,124, 7, 2, 20, /* 0x 450 */
125, 56, 74, 20,124, 6,195, 46,125, 72, 83,120, 56,201, 14,108, /* 0x 460 */
56, 96, 0, 1, 64,157, 0,180,124, 26,200, 80, 63, 96, 0,255, /* 0x 470 */
127,245, 0,174, 99,123,255,255, 87,255, 8, 60, 87,252, 5,238, /* 0x 480 */
127,136,216, 64, 87,128, 8, 60, 84,100, 8, 60,124, 6, 2, 20, /* 0x 490 */
127, 12,232, 0, 84,169, 64, 46,124,224, 34, 20, 65,157, 0, 24, /* 0x 4a0 */
65,154, 7,176,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x 4b0 */
125, 37, 3,120,161,103, 2, 0, 85, 0,170,254,125, 64, 89,214, /* 0x 4c0 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x 4d0 */
124, 11, 2, 20, 47, 28, 0, 0,125,105, 88, 80,124,131, 35,120, /* 0x 4e0 */
125, 10, 64, 80, 64,156, 0, 20,176, 7, 2, 0,125, 72, 83,120, /* 0x 4f0 */
65,186, 0, 24, 72, 0, 0, 28,177,103, 2, 0,124,170, 40, 80, /* 0x 500 */
56,100, 0, 1, 65,154, 0, 12, 47,131, 0,255, 64,157,255,108, /* 0x 510 */
47,131, 0,255, 65,157, 0,132, 63,224, 0,255, 99,255,255,255, /* 0x 520 */
127,136,248, 64, 84,103, 8, 60,127, 12,232, 0, 84,169, 64, 46, /* 0x 530 */
124,227, 59,120, 65,157, 0, 24, 65,154, 7, 24,136, 12, 0, 0, /* 0x 540 */
85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, /* 0x 550 */
85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64, /* 0x 560 */
124, 0, 46,112, 85,105,217,126,124, 11, 2, 20,125, 10, 64, 80, /* 0x 570 */
125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, /* 0x 580 */
72, 0, 0, 16,124,170, 40, 80,125,102, 59, 46, 56,103, 0, 1, /* 0x 590 */
47,131, 0,255, 64,157,255,140, 47,151, 0, 3, 84,127, 6, 62, /* 0x 5a0 */
127,249,169,174, 59, 57, 0, 1, 65,157, 0, 12, 58,224, 0, 0, /* 0x 5b0 */
72, 0, 6,120, 47,151, 0, 9, 65,157, 0, 12, 58,247,255,253, /* 0x 5c0 */
72, 0, 6,104, 58,247,255,250, 72, 0, 6, 96,125, 10, 64, 80, /* 0x 5d0 */
127,136,176, 64, 84,224,217,126,124, 0, 56, 80, 86,233, 8, 60, /* 0x 5e0 */
124, 6,195, 46,124,170, 40, 80,124,248, 74, 20, 65,157, 0, 32, /* 0x 5f0 */
127,140,232, 0, 65,158, 6, 92,137, 44, 0, 0, 84,160, 64, 46, /* 0x 600 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,128, /* 0x 610 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 64, /* 0x 620 */
32, 11, 8, 0, 47,151, 0, 6,124, 0, 46,112,124, 11, 2, 20, /* 0x 630 */
176, 7, 1,128,126, 15,131,120,125, 72, 83,120,126, 48,139,120, /* 0x 640 */
56, 0, 0, 0,127, 81,211,120, 64,157, 0, 8, 56, 0, 0, 3, /* 0x 650 */
124, 23, 3,120, 56,216, 6,100, 72, 0, 2, 24,125, 10, 64, 80, /* 0x 660 */
127,136,176, 64, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x 670 */
176, 7, 1,128, 65,157, 0, 32,127,140,232, 0, 65,158, 5,212, /* 0x 680 */
137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x 690 */
57,140, 0, 1,161,103, 1,152, 85, 0,170,254,125, 64, 89,214, /* 0x 6a0 */
127,133, 80, 64, 64,156, 0,188, 32, 11, 8, 0,127,138,176, 64, /* 0x 6b0 */
124, 0, 46,112, 86,233, 40, 52,124, 11, 2, 20,125, 56, 74, 20, /* 0x 6c0 */
84,107, 8, 60,176, 7, 1,152,125, 72, 83,120,124,233, 90, 20, /* 0x 6d0 */
65,157, 0, 32,127,140,232, 0, 65,158, 5,120,137, 44, 0, 0, /* 0x 6e0 */
84,160, 64, 46,124, 5, 75,120, 85, 72, 64, 46, 57,140, 0, 1, /* 0x 6f0 */
161,103, 1,224, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x 700 */
64,156, 0, 72, 32, 11, 8, 0, 47,153, 0, 0,124, 0, 46,112, /* 0x 710 */
124, 11, 2, 20,176, 7, 1,224,125, 72, 83,120, 65,158, 5, 52, /* 0x 720 */
47,151, 0, 6, 57, 32, 0, 9, 64,157, 0, 8, 57, 32, 0, 11, /* 0x 730 */
124, 26,200, 80,127,245, 0,174,125, 55, 75,120,127,249,169,174, /* 0x 740 */
59, 57, 0, 1, 72, 0, 4,228, 85, 96,217,126,124, 0, 88, 80, /* 0x 750 */
124,170, 40, 80,125, 10, 64, 80,176, 7, 1,224, 72, 0, 0,252, /* 0x 760 */
125, 10, 64, 80,127,136,176, 64, 85, 96,217,126,124, 0, 88, 80, /* 0x 770 */
124,170, 40, 80,176, 7, 1,152, 65,157, 0, 32,127,140,232, 0, /* 0x 780 */
65,158, 4,208,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x 790 */
85, 8, 64, 46, 57,140, 0, 1,161,103, 1,176, 85, 0,170,254, /* 0x 7a0 */
125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0, /* 0x 7b0 */
124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120,126, 41,139,120, /* 0x 7c0 */
176, 7, 1,176, 72, 0, 0,140,125, 10, 64, 80,127,136,176, 64, /* 0x 7d0 */
85, 96,217,126,124, 0, 88, 80,124,170, 40, 80,176, 7, 1,176, /* 0x 7e0 */
65,157, 0, 32,127,140,232, 0, 65,158, 4,104,137, 44, 0, 0, /* 0x 7f0 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x 800 */
161,103, 1,200, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x 810 */
64,156, 0, 32, 32, 11, 8, 0,124, 0, 46,112,124, 11, 2, 20, /* 0x 820 */
125, 72, 83,120,126, 9,131,120,176, 7, 1,200, 72, 0, 0, 32, /* 0x 830 */
85, 96,217,126,124, 0, 88, 80,125,233,123,120,176, 7, 1,200, /* 0x 840 */
124,170, 40, 80,125, 10, 64, 80,126, 15,131,120,126, 48,139,120, /* 0x 850 */
127, 81,211,120,125, 58, 75,120, 47,151, 0, 6, 56, 0, 0, 8, /* 0x 860 */
64,157, 0, 8, 56, 0, 0, 11,124, 23, 3,120, 56,216, 10,104, /* 0x 870 */
127,136,176, 64, 65,157, 0, 32,127,140,232, 0, 65,158, 3,212, /* 0x 880 */
137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x 890 */
57,140, 0, 1,161,102, 0, 0, 85, 0,170,254,125, 64, 89,214, /* 0x 8a0 */
127,133, 80, 64, 64,156, 0, 48, 32, 11, 8, 0, 84,105, 32, 54, /* 0x 8b0 */
125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, /* 0x 8c0 */
56,137, 0, 4, 59,128, 0, 0, 59, 96, 0, 3,176, 6, 0, 0, /* 0x 8d0 */
72, 0, 0,156,125, 10, 64, 80,127,136,176, 64, 85, 96,217,126, /* 0x 8e0 */
124, 0, 88, 80,124,170, 40, 80,176, 6, 0, 0, 65,157, 0, 32, /* 0x 8f0 */
127,140,232, 0, 65,158, 3, 92,137, 44, 0, 0, 84,160, 64, 46, /* 0x 900 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,102, 0, 2, /* 0x 910 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48, /* 0x 920 */
32, 11, 8, 0, 84,105, 32, 54,125, 38, 74, 20,124, 0, 46,112, /* 0x 930 */
124, 11, 2, 20,125, 72, 83,120, 56,137, 1, 4, 59,128, 0, 8, /* 0x 940 */
59, 96, 0, 3,176, 6, 0, 2, 72, 0, 0, 36, 85, 96,217,126, /* 0x 950 */
124, 0, 88, 80,124,170, 40, 80,176, 6, 0, 2,125, 10, 64, 80, /* 0x 960 */
56,134, 2, 4, 59,128, 0, 16, 59, 96, 0, 8,127,105, 3,166, /* 0x 970 */
63,224, 0,255, 99,255,255,255, 56, 96, 0, 1,127,136,248, 64, /* 0x 980 */
84,103, 8, 60,127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, /* 0x 990 */
65,157, 0, 24, 65,154, 2,188,136, 12, 0, 0, 85, 8, 64, 46, /* 0x 9a0 */
57,140, 0, 1,125, 37, 3,120,125,100, 58, 46, 85, 0,170,254, /* 0x 9b0 */
125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, /* 0x 9c0 */
85,105,217,126,124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, /* 0x 9d0 */
64,156, 0, 16,125, 72, 83,120,124, 4, 59, 46, 72, 0, 0, 16, /* 0x 9e0 */
124,170, 40, 80, 56,103, 0, 1,125,100, 59, 46, 66, 0,255,144, /* 0x 9f0 */
56, 0, 0, 1, 47,151, 0, 3,124, 0,216, 48,124, 96, 24, 80, /* 0x a00 */
124, 99,226, 20, 65,157, 1,232, 47,131, 0, 3, 58,247, 0, 7, /* 0x a10 */
124,105, 27,120, 64,157, 0, 8, 57, 32, 0, 3, 85, 41, 56, 48, /* 0x a20 */
125, 56, 74, 20, 56,201, 3, 96, 57, 32, 0, 6,125, 41, 3,166, /* 0x a30 */
63,224, 0,255, 99,255,255,255, 56,128, 0, 1,127,136,248, 64, /* 0x a40 */
84,135, 8, 60,127, 12,232, 0, 84,169, 64, 46,124,228, 59,120, /* 0x a50 */
65,157, 0, 24, 65,154, 1,252,136, 12, 0, 0, 85, 8, 64, 46, /* 0x a60 */
57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, 85, 0,170,254, /* 0x a70 */
125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, /* 0x a80 */
85,105,217,126,124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, /* 0x a90 */
64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16, /* 0x aa0 */
124,170, 40, 80, 56,135, 0, 1,125,102, 59, 46, 66, 0,255,144, /* 0x ab0 */
56,132,255,192, 47,132, 0, 3,124,154, 35,120, 64,157, 1, 40, /* 0x ac0 */
47,132, 0, 13,124,137, 14,112, 84,128, 7,254, 57,105,255,255, /* 0x ad0 */
96, 26, 0, 2,125,105, 3,166, 65,157, 0, 32,127, 90, 88, 48, /* 0x ae0 */
87, 73, 8, 60,125, 56, 74, 20, 84,128, 8, 60,125, 32, 72, 80, /* 0x af0 */
56,201, 5, 94, 72, 0, 0,100, 57, 41,255,251,125, 41, 3,166, /* 0x b00 */
61, 96, 0,255, 97,107,255,255,127,136, 88, 64,127, 12,232, 0, /* 0x b10 */
84,169, 64, 46, 87, 90, 8, 60, 65,157, 0, 24, 65,154, 1, 52, /* 0x b20 */
136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x b30 */
85, 8,248,126,127,133, 64, 64, 65,156, 0, 12,124,168, 40, 80, /* 0x b40 */
99, 90, 0, 1, 66, 0,255,196, 56, 0, 0, 4,124, 9, 3,166, /* 0x b50 */
87, 90, 32, 54, 56,216, 6, 68, 60,128, 0,255, 96,132,255,255, /* 0x b60 */
59,128, 0, 1, 59,224, 0, 1,127,136, 32, 64, 87,231, 8, 60, /* 0x b70 */
127, 12,232, 0, 84,169, 64, 46,124,255, 59,120, 65,157, 0, 24, /* 0x b80 */
65,154, 0,208,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x b90 */
125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x ba0 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x bb0 */
124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x bc0 */
125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 20,124,170, 40, 80, /* 0x bd0 */
59,231, 0, 1,125,102, 59, 46,127, 90,227,120, 87,156, 8, 60, /* 0x be0 */
66, 0,255,136, 55, 90, 0, 1, 65,130, 0, 72,127,154,200, 64, /* 0x bf0 */
56, 99, 0, 2, 65,157, 0, 92,124, 26,200, 80,127,245, 0,174, /* 0x c00 */
56, 99,255,255,127,249,169,174, 59, 57, 0, 1, 49, 99,255,255, /* 0x c10 */
125, 43, 25, 16,124, 20,200, 16,124, 0, 1, 16,124, 0, 0,208, /* 0x c20 */
125, 43, 0, 57, 64,130,255,212,127,153,160, 64, 65,156,247,172, /* 0x c30 */
60, 0, 0,255, 96, 0,255,255,127,136, 0, 64, 65,157, 0, 32, /* 0x c40 */
127,140,232, 0, 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, /* 0x c50 */
56, 96, 0, 1, 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166, /* 0x c60 */
124, 19, 96, 80,144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0, /* 0x c70 */
128, 1, 0,100,185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96, /* 0x c80 */
124, 8, 2,166,148, 33,255,160,189,193, 0, 24,144, 1, 0,100, /* 0x c90 */
59, 32, 0, 0,137, 67, 0, 2,137, 99, 0, 1,138, 67, 0, 0, /* 0x ca0 */
147, 38, 0, 0,147, 41, 0, 0,136, 3, 0, 1,125, 40, 3,166, /* 0x cb0 */
124, 18, 2, 20, 57, 32, 3, 0,125, 41, 0, 48, 56, 9, 7, 54, /* 0x cc0 */
127,153, 0, 64, 57, 32, 0, 1,125, 43, 88, 48,125, 41, 80, 48, /* 0x cd0 */
57, 41,255,255, 57,107,255,255,145, 33, 0, 8,124,206, 51,120, /* 0x ce0 */
124,147, 35,120,124,245, 59,120,125, 20, 67,120,145, 97, 0, 12, /* 0x cf0 */
59, 3, 0, 4, 59,224, 0, 0, 58,224, 0, 0, 59, 64, 0, 1, /* 0x d00 */
58, 32, 0, 1, 58, 0, 0, 1, 57,224, 0, 1, 57, 32, 0, 0, /* 0x d10 */
64,156, 0, 28,124, 9, 3,166, 57, 96, 4, 0, 85, 32, 8, 60, /* 0x d20 */
125,120, 3, 46, 57, 41, 0, 1, 66, 0,255,244,127,179, 42, 20, /* 0x d30 */
126,108,155,120, 56,160, 0, 0, 57, 0,255,255, 57, 96, 0, 0, /* 0x d40 */
127,140,232, 0, 57,107, 0, 1, 47, 11, 0, 4, 84,169, 64, 46, /* 0x d50 */
65,158, 8,156,136, 12, 0, 0, 57,140, 0, 1,125, 37, 3,120, /* 0x d60 */
64,153,255,224,127,153,160, 64, 64,156, 8,100, 62,192, 0,255, /* 0x d70 */
98,214,255,255,128, 1, 0, 8,127,136,176, 64,127, 35, 0, 56, /* 0x d80 */
86,224, 32, 54,124, 0, 26, 20, 84, 6, 8, 60, 65,157, 0, 32, /* 0x d90 */
127,140,232, 0, 65,158, 8, 88,137, 44, 0, 0, 84,160, 64, 46, /* 0x da0 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,124,230,194, 46, /* 0x db0 */
85, 0,170,254,125, 64, 57,214,127,133, 80, 64, 64,156, 1,172, /* 0x dc0 */
128, 1, 0, 12, 47,151, 0, 6,127, 41, 0, 56, 32, 18, 0, 8, /* 0x dd0 */
127,224, 6, 48,125, 41,144, 48,125, 41, 2, 20, 29, 41, 6, 0, /* 0x de0 */
32, 7, 8, 0,124, 0, 46,112,124, 7, 2, 20,125, 56, 74, 20, /* 0x df0 */
124, 6,195, 46,125, 72, 83,120, 56,201, 14,108, 56, 96, 0, 1, /* 0x e00 */
64,157, 0,180,124, 26,200, 80, 63, 96, 0,255,127,245, 0,174, /* 0x e10 */
99,123,255,255, 87,255, 8, 60, 87,252, 5,238,127,136,216, 64, /* 0x e20 */
87,128, 8, 60, 84,100, 8, 60,124, 6, 2, 20,127, 12,232, 0, /* 0x e30 */
84,169, 64, 46,124,224, 34, 20, 65,157, 0, 24, 65,154, 7,176, /* 0x e40 */
136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x e50 */
161,103, 2, 0, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x e60 */
127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x e70 */
47, 28, 0, 0,125,105, 88, 80,124,131, 35,120,125, 10, 64, 80, /* 0x e80 */
64,156, 0, 20,176, 7, 2, 0,125, 72, 83,120, 65,186, 0, 24, /* 0x e90 */
72, 0, 0, 28,177,103, 2, 0,124,170, 40, 80, 56,100, 0, 1, /* 0x ea0 */
65,154, 0, 12, 47,131, 0,255, 64,157,255,108, 47,131, 0,255, /* 0x eb0 */
65,157, 0,132, 63,224, 0,255, 99,255,255,255,127,136,248, 64, /* 0x ec0 */
84,103, 8, 60,127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, /* 0x ed0 */
65,157, 0, 24, 65,154, 7, 24,136, 12, 0, 0, 85, 8, 64, 46, /* 0x ee0 */
57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, 85, 0,170,254, /* 0x ef0 */
125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, /* 0x f00 */
85,105,217,126,124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, /* 0x f10 */
64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16, /* 0x f20 */
124,170, 40, 80,125,102, 59, 46, 56,103, 0, 1, 47,131, 0,255, /* 0x f30 */
64,157,255,140, 47,151, 0, 3, 84,127, 6, 62,127,249,169,174, /* 0x f40 */
59, 57, 0, 1, 65,157, 0, 12, 58,224, 0, 0, 72, 0, 6,120, /* 0x f50 */
47,151, 0, 9, 65,157, 0, 12, 58,247,255,253, 72, 0, 6,104, /* 0x f60 */
58,247,255,250, 72, 0, 6, 96,125, 10, 64, 80,127,136,176, 64, /* 0x f70 */
84,224,217,126,124, 0, 56, 80, 86,233, 8, 60,124, 6,195, 46, /* 0x f80 */
124,170, 40, 80,124,248, 74, 20, 65,157, 0, 32,127,140,232, 0, /* 0x f90 */
65,158, 6, 92,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x fa0 */
85, 8, 64, 46, 57,140, 0, 1,161,103, 1,128, 85, 0,170,254, /* 0x fb0 */
125, 64, 89,214,127,133, 80, 64, 64,156, 0, 64, 32, 11, 8, 0, /* 0x fc0 */
47,151, 0, 6,124, 0, 46,112,124, 11, 2, 20,176, 7, 1,128, /* 0x fd0 */
126, 15,131,120,125, 72, 83,120,126, 48,139,120, 56, 0, 0, 0, /* 0x fe0 */
127, 81,211,120, 64,157, 0, 8, 56, 0, 0, 3,124, 23, 3,120, /* 0x ff0 */
56,216, 6,100, 72, 0, 2, 24,125, 10, 64, 80,127,136,176, 64, /* 0x1000 */
85, 96,217,126,124, 0, 88, 80,124,170, 40, 80,176, 7, 1,128, /* 0x1010 */
65,157, 0, 32,127,140,232, 0, 65,158, 5,212,137, 44, 0, 0, /* 0x1020 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1030 */
161,103, 1,152, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x1040 */
64,156, 0,188, 32, 11, 8, 0,127,138,176, 64,124, 0, 46,112, /* 0x1050 */
86,233, 40, 52,124, 11, 2, 20,125, 56, 74, 20, 84,107, 8, 60, /* 0x1060 */
176, 7, 1,152,125, 72, 83,120,124,233, 90, 20, 65,157, 0, 32, /* 0x1070 */
127,140,232, 0, 65,158, 5,120,137, 44, 0, 0, 84,160, 64, 46, /* 0x1080 */
124, 5, 75,120, 85, 72, 64, 46, 57,140, 0, 1,161,103, 1,224, /* 0x1090 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 72, /* 0x10a0 */
32, 11, 8, 0, 47,153, 0, 0,124, 0, 46,112,124, 11, 2, 20, /* 0x10b0 */
176, 7, 1,224,125, 72, 83,120, 65,158, 5, 52, 47,151, 0, 6, /* 0x10c0 */
57, 32, 0, 9, 64,157, 0, 8, 57, 32, 0, 11,124, 26,200, 80, /* 0x10d0 */
127,245, 0,174,125, 55, 75,120,127,249,169,174, 59, 57, 0, 1, /* 0x10e0 */
72, 0, 4,228, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x10f0 */
125, 10, 64, 80,176, 7, 1,224, 72, 0, 0,252,125, 10, 64, 80, /* 0x1100 */
127,136,176, 64, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x1110 */
176, 7, 1,152, 65,157, 0, 32,127,140,232, 0, 65,158, 4,208, /* 0x1120 */
137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x1130 */
57,140, 0, 1,161,103, 1,176, 85, 0,170,254,125, 64, 89,214, /* 0x1140 */
127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0,124, 0, 46,112, /* 0x1150 */
124, 11, 2, 20,125, 72, 83,120,126, 41,139,120,176, 7, 1,176, /* 0x1160 */
72, 0, 0,140,125, 10, 64, 80,127,136,176, 64, 85, 96,217,126, /* 0x1170 */
124, 0, 88, 80,124,170, 40, 80,176, 7, 1,176, 65,157, 0, 32, /* 0x1180 */
127,140,232, 0, 65,158, 4,104,137, 44, 0, 0, 84,160, 64, 46, /* 0x1190 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,200, /* 0x11a0 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32, /* 0x11b0 */
32, 11, 8, 0,124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, /* 0x11c0 */
126, 9,131,120,176, 7, 1,200, 72, 0, 0, 32, 85, 96,217,126, /* 0x11d0 */
124, 0, 88, 80,125,233,123,120,176, 7, 1,200,124,170, 40, 80, /* 0x11e0 */
125, 10, 64, 80,126, 15,131,120,126, 48,139,120,127, 81,211,120, /* 0x11f0 */
125, 58, 75,120, 47,151, 0, 6, 56, 0, 0, 8, 64,157, 0, 8, /* 0x1200 */
56, 0, 0, 11,124, 23, 3,120, 56,216, 10,104,127,136,176, 64, /* 0x1210 */
65,157, 0, 32,127,140,232, 0, 65,158, 3,212,137, 44, 0, 0, /* 0x1220 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1230 */
161,102, 0, 0, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x1240 */
64,156, 0, 48, 32, 11, 8, 0, 84,105, 32, 54,125, 38, 74, 20, /* 0x1250 */
124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, 56,137, 0, 4, /* 0x1260 */
59,128, 0, 0, 59, 96, 0, 3,176, 6, 0, 0, 72, 0, 0,156, /* 0x1270 */
125, 10, 64, 80,127,136,176, 64, 85, 96,217,126,124, 0, 88, 80, /* 0x1280 */
124,170, 40, 80,176, 6, 0, 0, 65,157, 0, 32,127,140,232, 0, /* 0x1290 */
65,158, 3, 92,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x12a0 */
85, 8, 64, 46, 57,140, 0, 1,161,102, 0, 2, 85, 0,170,254, /* 0x12b0 */
125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48, 32, 11, 8, 0, /* 0x12c0 */
84,105, 32, 54,125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20, /* 0x12d0 */
125, 72, 83,120, 56,137, 1, 4, 59,128, 0, 8, 59, 96, 0, 3, /* 0x12e0 */
176, 6, 0, 2, 72, 0, 0, 36, 85, 96,217,126,124, 0, 88, 80, /* 0x12f0 */
124,170, 40, 80,176, 6, 0, 2,125, 10, 64, 80, 56,134, 2, 4, /* 0x1300 */
59,128, 0, 16, 59, 96, 0, 8,127,105, 3,166, 63,224, 0,255, /* 0x1310 */
99,255,255,255, 56, 96, 0, 1,127,136,248, 64, 84,103, 8, 60, /* 0x1320 */
127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, 65,157, 0, 24, /* 0x1330 */
65,154, 2,188,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1340 */
125, 37, 3,120,125,100, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x1350 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x1360 */
124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x1370 */
125, 72, 83,120,124, 4, 59, 46, 72, 0, 0, 16,124,170, 40, 80, /* 0x1380 */
56,103, 0, 1,125,100, 59, 46, 66, 0,255,144, 56, 0, 0, 1, /* 0x1390 */
47,151, 0, 3,124, 0,216, 48,124, 96, 24, 80,124, 99,226, 20, /* 0x13a0 */
65,157, 1,232, 47,131, 0, 3, 58,247, 0, 7,124,105, 27,120, /* 0x13b0 */
64,157, 0, 8, 57, 32, 0, 3, 85, 41, 56, 48,125, 56, 74, 20, /* 0x13c0 */
56,201, 3, 96, 57, 32, 0, 6,125, 41, 3,166, 63,224, 0,255, /* 0x13d0 */
99,255,255,255, 56,128, 0, 1,127,136,248, 64, 84,135, 8, 60, /* 0x13e0 */
127, 12,232, 0, 84,169, 64, 46,124,228, 59,120, 65,157, 0, 24, /* 0x13f0 */
65,154, 1,252,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1400 */
125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x1410 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x1420 */
124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x1430 */
125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16,124,170, 40, 80, /* 0x1440 */
56,135, 0, 1,125,102, 59, 46, 66, 0,255,144, 56,132,255,192, /* 0x1450 */
47,132, 0, 3,124,154, 35,120, 64,157, 1, 40, 47,132, 0, 13, /* 0x1460 */
124,137, 14,112, 84,128, 7,254, 57,105,255,255, 96, 26, 0, 2, /* 0x1470 */
125,105, 3,166, 65,157, 0, 32,127, 90, 88, 48, 87, 73, 8, 60, /* 0x1480 */
125, 56, 74, 20, 84,128, 8, 60,125, 32, 72, 80, 56,201, 5, 94, /* 0x1490 */
72, 0, 0,100, 57, 41,255,251,125, 41, 3,166, 61, 96, 0,255, /* 0x14a0 */
97,107,255,255,127,136, 88, 64,127, 12,232, 0, 84,169, 64, 46, /* 0x14b0 */
87, 90, 8, 60, 65,157, 0, 24, 65,154, 1, 52,136, 12, 0, 0, /* 0x14c0 */
85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, 85, 8,248,126, /* 0x14d0 */
127,133, 64, 64, 65,156, 0, 12,124,168, 40, 80, 99, 90, 0, 1, /* 0x14e0 */
66, 0,255,196, 56, 0, 0, 4,124, 9, 3,166, 87, 90, 32, 54, /* 0x14f0 */
56,216, 6, 68, 60,128, 0,255, 96,132,255,255, 59,128, 0, 1, /* 0x1500 */
59,224, 0, 1,127,136, 32, 64, 87,231, 8, 60,127, 12,232, 0, /* 0x1510 */
84,169, 64, 46,124,255, 59,120, 65,157, 0, 24, 65,154, 0,208, /* 0x1520 */
136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x1530 */
125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x1540 */
127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x1550 */
125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120, /* 0x1560 */
124, 6, 59, 46, 72, 0, 0, 20,124,170, 40, 80, 59,231, 0, 1, /* 0x1570 */
125,102, 59, 46,127, 90,227,120, 87,156, 8, 60, 66, 0,255,136, /* 0x1580 */
55, 90, 0, 1, 65,130, 0, 72,127,154,200, 64, 56, 99, 0, 2, /* 0x1590 */
65,157, 0, 92,124, 26,200, 80,127,245, 0,174, 56, 99,255,255, /* 0x15a0 */
127,249,169,174, 59, 57, 0, 1, 49, 99,255,255,125, 43, 25, 16, /* 0x15b0 */
124, 20,200, 16,124, 0, 1, 16,124, 0, 0,208,125, 43, 0, 57, /* 0x15c0 */
64,130,255,212,127,153,160, 64, 65,156,247,172, 60, 0, 0,255, /* 0x15d0 */
96, 0,255,255,127,136, 0, 64, 65,157, 0, 32,127,140,232, 0, /* 0x15e0 */
56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1, /* 0x15f0 */
72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80, /* 0x1600 */
144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100, /* 0x1610 */
185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96,128, 33, 0, 0, /* 0x1620 */
128, 1, 0, 4,124, 8, 3,166,128, 6, 0, 0,125,168, 3,166, /* 0x1630 */
56,165, 0, 1, 56, 99, 0, 1,124,160, 40, 80,124,100, 24, 80, /* 0x1640 */
144,166, 0, 0, 78,128, 0, 32, 72, 0, 0, 1, 80, 82, 79, 84, /* 0x1650 */
95, 69, 88, 69, 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, /* 0x1660 */
32,102, 97,105,108,101,100, 46, 10, 0, 0, 0, 56,160, 0, 30, /* 0x1670 */
124,136, 2,166, 56, 96, 0, 2, 56, 0, 0, 4, 68, 0, 0, 2, /* 0x1680 */
56, 96, 0,127, 56, 0, 0, 1, 68, 0, 0, 2,127,200, 2,166, /* 0x1690 */
57, 0, 0, 0, 56,224,255,255,128,126, 0, 4, 56,192, 0, 50, /* 0x16a0 */
56,160, 0, 7, 56,128, 16, 0,124, 99,242, 20, 56, 0, 0, 90, /* 0x16b0 */
56, 99, 16, 11, 84, 99, 0, 38, 68, 0, 0, 2, 65,131, 0, 32, /* 0x16c0 */
127,233, 3,166,128, 30, 0, 0,136,254, 0, 8, 56,193, 0,124, /* 0x16d0 */
144, 1, 0,124,124,101, 27,120,124,104, 3,166,128,158, 0, 4, /* 0x16e0 */
56,126, 0, 12, 78,128, 4, 32,148, 33,255,128,188, 65, 0, 4, /* 0x16f0 */
127,232, 2,166, 75,255,255,153, 0, 46,115,121,109,116, 97, 98, /* 0x1700 */
0, 46,115,116,114,116, 97, 98, 0, 46,115,104,115,116,114,116, /* 0x1710 */
97, 98, 0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x1720 */
0, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 0, 46,114,101,108, /* 0x1730 */
97, 78, 82, 86, 50, 69, 0, 46,114,101,108, 97, 78, 82, 86, 50, /* 0x1740 */
66, 0, 46,114,101,108, 97, 76, 90, 77, 65, 95, 69, 76, 70, 48, /* 0x1750 */
48, 0, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 0, 76, 90, 77, /* 0x1760 */
65, 95, 68, 69, 67, 50, 48, 0, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x1770 */
51, 48, 0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, 78, 89, /* 0x1780 */
0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, 78, 90, 0, 0, /* 0x1790 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, /* 0x17c0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 4, /* 0x17d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x17e0 */
0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17f0 */
0, 0, 27,136, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 1, /* 0x1800 */
0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, 41, 0, 0, 0, 1, /* 0x1810 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, /* 0x1820 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x1830 */
0, 0, 0, 57, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1840 */
0, 0, 0, 56, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1850 */
0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 4, /* 0x1860 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,148, 0, 0, 0, 12, /* 0x1870 */
0, 0, 0, 18, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 12, /* 0x1880 */
0, 0, 0, 68, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1890 */
0, 0, 1,128, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18a0 */
0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 4, /* 0x18b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,160, 0, 0, 0, 12, /* 0x18c0 */
0, 0, 0, 18, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 12, /* 0x18d0 */
0, 0, 0, 79, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18e0 */
0, 0, 2,112, 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18f0 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 4, /* 0x1900 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,172, 0, 0, 0, 12, /* 0x1910 */
0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 12, /* 0x1920 */
0, 0, 0, 90, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1930 */
0, 0, 2,244, 0, 0, 9,156, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1940 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, 0, 1, /* 0x1950 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,144, 0, 0, 9,156, /* 0x1960 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, /* 0x1970 */
0, 0, 0,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1980 */
0, 0, 22, 44, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1990 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 1, /* 0x19a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 56, 0, 0, 0, 68, /* 0x19b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x19c0 */
0, 0, 0,123, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x19d0 */
0, 0, 27,184, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, /* 0x19e0 */
0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0,142, 0, 0, 0, 1, /* 0x19f0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,124, 0, 0, 0,140, /* 0x1a00 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x1a10 */
0, 0, 0,137, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a20 */
0, 0, 27,196, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 15, /* 0x1a30 */
0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, 17, 0, 0, 0, 3, /* 0x1a40 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 8, 0, 0, 0,151, /* 0x1a50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, /* 0x1a60 */
0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a70 */
0, 0, 26,192, 0, 0, 0,192, 0, 0, 0, 19, 0, 0, 0, 11, /* 0x1a80 */
0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 3, /* 0x1a90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,128, 0, 0, 0, 8, /* 0x1aa0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, /* 0x1ab0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ac0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 12, /* 0x1ad0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 13, /* 0x1ae0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 15, /* 0x1af0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, /* 0x1b00 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, /* 0x1b10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, /* 0x1b20 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 6, /* 0x1b30 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 8, /* 0x1b40 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 10, /* 0x1b50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 11, /* 0x1b60 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, /* 0x1b70 */
0, 95,115,116, 97,114,116, 0, 0, 0, 0, 0, 0, 0, 3, 10, /* 0x1b80 */
0, 0, 0,124, 0, 0, 0,180, 0, 0, 2, 11, 0, 0, 0, 0, /* 0x1b90 */
0, 0, 0,144, 0, 0, 2, 11, 0, 0, 0, 0, 0, 0, 0, 8, /* 0x1ba0 */
0, 0, 1, 11, 0, 0, 0, 12, 0, 0, 0, 32, 0, 0, 3, 10, /* 0x1bb0 */
0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 2, 11, 0, 0, 0, 32, /* 0x1bc0 */
10,116,109,112, 47,112,111,119,101,114,112, 99, 45,108,105,110, /* 0x1bd0 */
117,120, 46,101,108,102, 45,101,110,116,114,121, 46, 98,105,110, /* 0x1be0 */
58, 32, 32, 32, 32, 32,102,105,108,101, 32,102,111,114,109, 97, /* 0x1bf0 */
116, 32,101,108,102, 51, 50, 45,112,111,119,101,114,112, 99, 10, /* 0x1c00 */
10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, 32, 78, /* 0x1c10 */
97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122, /* 0x1c20 */
101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, /* 0x1c30 */
32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32, /* 0x1c40 */
111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, /* 0x1c50 */
10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, /* 0x1c60 */
32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, /* 0x1c70 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1c80 */
32, 48, 48, 48, 48, 48, 48, 51, 52, 32, 32, 50, 42, 42, 50, 32, /* 0x1c90 */
32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, /* 0x1ca0 */
44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 78, /* 0x1cb0 */
82, 86, 95, 67, 79, 77, 77, 79, 78, 32, 32, 32, 32, 48, 48, 48, /* 0x1cc0 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1cd0 */
32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1ce0 */
48, 51, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, /* 0x1cf0 */
78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, /* 0x1d00 */
50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1d10 */
48, 48, 48, 48, 48, 49, 52, 56, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1d20 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1d30 */
48, 48, 48, 48, 51, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, /* 0x1d40 */
78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, /* 0x1d50 */
69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, /* 0x1d60 */
66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1d70 */
102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1d80 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 56, 48, /* 0x1d90 */
32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x1da0 */
44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x1db0 */
89, 10, 32, 32, 52, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, /* 0x1dc0 */
32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 56, 52, 32, 32, 48, 48, /* 0x1dd0 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1de0 */
32, 32, 48, 48, 48, 48, 48, 50, 55, 48, 32, 32, 50, 42, 42, 48, /* 0x1df0 */
32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, /* 0x1e00 */
67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, 32, /* 0x1e10 */
76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, 48, /* 0x1e20 */
48, 48, 48, 57, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1e30 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x1e40 */
48, 50,102, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x1e50 */
69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x1e60 */
32, 54, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, /* 0x1e70 */
32, 48, 48, 48, 48, 48, 57, 57, 99, 32, 32, 48, 48, 48, 48, 48, /* 0x1e80 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x1e90 */
48, 48, 48, 48, 99, 57, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x1ea0 */
79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x1eb0 */
89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, /* 0x1ec0 */
32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 99, 32, 32, 48, 48, /* 0x1ed0 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1ee0 */
32, 32, 48, 48, 48, 48, 49, 54, 50, 99, 32, 32, 50, 42, 42, 48, /* 0x1ef0 */
32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, /* 0x1f00 */
79, 78, 76, 89, 10, 32, 32, 56, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x1f10 */
89, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 52, 52, 32, /* 0x1f20 */
32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1f30 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 54, 51, 56, 32, 32, 50, /* 0x1f40 */
42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, /* 0x1f50 */
69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x1f60 */
32, 57, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, /* 0x1f70 */
32, 48, 48, 48, 48, 48, 48, 56, 99, 32, 32, 48, 48, 48, 48, 48, /* 0x1f80 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x1f90 */
48, 48, 48, 49, 54, 55, 99, 32, 32, 50, 42, 42, 50, 32, 32, 67, /* 0x1fa0 */
79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, /* 0x1fb0 */
82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, 77, 66, 79, 76, 32, /* 0x1fc0 */
84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1fd0 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x1fe0 */
51, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x1ff0 */
95, 68, 69, 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2000 */
108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, /* 0x2010 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, /* 0x2020 */
78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, /* 0x2030 */
32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, 48, 48, /* 0x2040 */
48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, /* 0x2050 */
48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, /* 0x2060 */
69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x2070 */
48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, /* 0x2080 */
48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, /* 0x2090 */
67, 79, 77, 77, 79, 78, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x20a0 */
78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 10, 48, 48, 48, 48, 48, /* 0x20b0 */
48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, /* 0x20c0 */
69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, /* 0x20d0 */
10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, /* 0x20e0 */
32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x20f0 */
32, 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2100 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, /* 0x2110 */
48, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x2120 */
95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2130 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2140 */
49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x2150 */
95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2160 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2170 */
50, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x2180 */
95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2190 */
103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x21a0 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, 97,114,116, /* 0x21b0 */
10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x21c0 */
67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, /* 0x21d0 */
73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, /* 0x21e0 */
89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x21f0 */
32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2200 */
32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32, 32, 32, 32, /* 0x2210 */
32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, /* 0x2220 */
48, 48, 48, 48, 55, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, /* 0x2230 */
73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, /* 0x2240 */
91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, /* 0x2250 */
32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2260 */
32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, /* 0x2270 */
48, 98, 52, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 49, 52, 32, /* 0x2280 */
32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 10, /* 0x2290 */
10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, /* 0x22a0 */
82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 66, 93, 58, /* 0x22b0 */
10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x22c0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x22d0 */
69, 32, 10, 48, 48, 48, 48, 48, 48, 57, 48, 32, 82, 95, 80, 80, /* 0x22e0 */
67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32, 69, 76, /* 0x22f0 */
70, 77, 65, 73, 78, 89, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, /* 0x2300 */
73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, /* 0x2310 */
91, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, /* 0x2320 */
70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x2330 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, /* 0x2340 */
48, 48, 48, 48, 48, 48, 48, 56, 32, 82, 95, 80, 80, 67, 95, 82, /* 0x2350 */
69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, /* 0x2360 */
68, 69, 67, 51, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 99, /* 0x2370 */
10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x2380 */
67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, /* 0x2390 */
73, 78, 89, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, /* 0x23a0 */
89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x23b0 */
32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 50, 48, /* 0x23c0 */
32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32, 32, 32, 32, /* 0x23d0 */
32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 10, 82, 69, /* 0x23e0 */
76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, /* 0x23f0 */
32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, /* 0x2400 */
10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x2410 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x2420 */
69, 32, 10, 48, 48, 48, 48, 48, 48, 53, 48, 32, 82, 95, 80, 80, /* 0x2430 */
67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32, 69, 76, /* 0x2440 */
70, 77, 65, 73, 78, 89, 43, 48,120, 48, 48, 48, 48, 48, 48, 50, /* 0x2450 */
48, 10, 10, 10 /* 0x2460 */
}; };
+112 -111
View File
@@ -1,4 +1,4 @@
/* powerpc-linux.elf-fold.h -- created from powerpc-linux.elf-fold.bin, 1936 (0x790) bytes /* powerpc-linux.elf-fold.h -- created from powerpc-linux.elf-fold.bin, 1944 (0x798) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -27,17 +27,17 @@
*/ */
#define LINUX_ELFPPC32_FOLD_SIZE 1936 #define LINUX_ELFPPC32_FOLD_SIZE 1944
#define LINUX_ELFPPC32_FOLD_ADLER32 0x1a2f7017 #define LINUX_ELFPPC32_FOLD_ADLER32 0x727175e2
#define LINUX_ELFPPC32_FOLD_CRC32 0xf69d4404 #define LINUX_ELFPPC32_FOLD_CRC32 0xe344893c
unsigned char linux_elfppc32_fold[1936] = { unsigned char linux_elfppc32_fold[1944] = {
127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */ 127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */
0, 2, 0, 20, 0, 0, 0, 1, 0, 16, 0,128, 0, 0, 0, 52, /* 0x 10 */ 0, 2, 0, 20, 0, 0, 0, 1, 0, 16, 0,128, 0, 0, 0, 52, /* 0x 10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 32, 0, 2, 0, 0, /* 0x 20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 32, 0, 2, 0, 0, /* 0x 20 */
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 16, 0, 0, /* 0x 30 */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 16, 0, 0, /* 0x 30 */
0, 16, 0, 0, 0, 0, 7,144, 0, 0, 7,144, 0, 0, 0, 5, /* 0x 40 */ 0, 16, 0, 0, 0, 0, 7,152, 0, 0, 7,152, 0, 0, 0, 5, /* 0x 40 */
0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 7,144, 0, 0, 0, 0, /* 0x 50 */ 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 7,152, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */
72, 0, 0,125, 40, 6, 0,208, 76,130, 0, 32, 84,132,240,191, /* 0x 80 */ 72, 0, 0,125, 40, 6, 0,208, 76,130, 0, 32, 84,132,240,191, /* 0x 80 */
@@ -49,108 +49,109 @@ unsigned char linux_elfppc32_fold[1936] = {
66, 0,255,240, 78,128, 0, 32,128, 73, 0, 0, 57, 41, 0, 4, /* 0x e0 */ 66, 0,255,240, 78,128, 0, 32,128, 73, 0, 0, 57, 41, 0, 4, /* 0x e0 */
47,130, 0, 0, 64,158,255,244, 78,128, 0, 32,125, 8, 2,166, /* 0x f0 */ 47,130, 0, 0, 64,158,255,244, 78,128, 0, 32,125, 8, 2,166, /* 0x f0 */
129, 33, 0, 0, 75,255,255,229, 75,255,255,225,128,159,255,248, /* 0x 100 */ 129, 33, 0, 0, 75,255,255,229, 75,255,255,225,128,159,255,248, /* 0x 100 */
85, 30, 0, 38, 56,161,248, 0,127,231,251,120,124,100,248, 80, /* 0x 110 */ 85, 30, 0, 38,127,231,251,120,127,164,248, 80, 56,161,248, 0, /* 0x 110 */
56, 33,247,240, 84,125, 0, 38,128,195, 0, 24, 72, 0, 5, 13, /* 0x 120 */ 59,189,255,248, 56,132,255,140, 56,125, 0,116, 56, 33,247,240, /* 0x 120 */
124,127, 27,120,127,163,235,120,124,157,240, 80, 72, 0, 0, 81, /* 0x 130 */ 128,195, 0, 24, 72, 0, 5, 13,124,127, 27,120,127,163,235,120, /* 0x 130 */
127,232, 3,166,184, 65, 8, 20,128, 33, 8, 16, 78,128, 0, 32, /* 0x 140 */ 124,157,240, 80, 72, 0, 0, 81,127,232, 3,166,184, 65, 8, 20, /* 0x 140 */
56, 0, 0, 90, 68, 0, 0, 2, 64,163, 0, 8, 56, 96,255,255, /* 0x 150 */ 128, 33, 8, 16, 78,128, 0, 32, 56, 0, 0, 90, 68, 0, 0, 2, /* 0x 150 */
78,128, 0, 32, 56, 0, 0, 1, 75,255,255,236, 56, 0, 0, 3, /* 0x 160 */ 64,163, 0, 8, 56, 96,255,255, 78,128, 0, 32, 56, 0, 0, 1, /* 0x 160 */
75,255,255,228, 56, 0, 0, 5, 75,255,255,220, 56, 0, 0, 6, /* 0x 170 */ 75,255,255,236, 56, 0, 0, 3, 75,255,255,228, 56, 0, 0, 5, /* 0x 170 */
75,255,255,212, 56, 0, 0,125, 75,255,255,204, 56, 0, 0, 91, /* 0x 180 */ 75,255,255,220, 56, 0, 0, 6, 75,255,255,212, 56, 0, 0,125, /* 0x 180 */
75,255,255,196, 56, 0, 0, 45, 75,255,255,188,124, 8, 2,166, /* 0x 190 */ 75,255,255,204, 56, 0, 0, 91, 75,255,255,196, 56, 0, 0, 45, /* 0x 190 */
148, 33,255,240,144, 1, 0, 20,128, 3, 0, 0,129, 35, 0, 4, /* 0x 1a0 */ 75,255,255,188,124, 8, 2,166,148, 33,255,240,144, 1, 0, 20, /* 0x 1a0 */
127,128, 40, 64, 64,188, 0, 12, 56, 96, 0,127, 75,255,255,169, /* 0x 1b0 */ 128, 3, 0, 0,129, 35, 0, 4,127,128, 40, 64, 64,188, 0, 12, /* 0x 1b0 */
47,133, 0, 0, 65,158, 0, 28,124,169, 3,166,136, 9, 0, 0, /* 0x 1c0 */ 56, 96, 0,127, 75,255,255,169, 47,133, 0, 0, 65,158, 0, 28, /* 0x 1c0 */
57, 41, 0, 1,152, 4, 0, 0, 56,132, 0, 1, 66, 0,255,240, /* 0x 1d0 */ 124,169, 3,166,136, 9, 0, 0, 57, 41, 0, 1,152, 4, 0, 0, /* 0x 1d0 */
128, 3, 0, 0,129, 35, 0, 4,124, 5, 0, 80,144, 3, 0, 0, /* 0x 1e0 */ 56,132, 0, 1, 66, 0,255,240,128, 3, 0, 0,129, 35, 0, 4, /* 0x 1e0 */
128, 1, 0, 20,125, 41, 42, 20,124, 8, 3,166, 56, 33, 0, 16, /* 0x 1f0 */ 124, 5, 0, 80,144, 3, 0, 0,128, 1, 0, 20,125, 41, 42, 20, /* 0x 1f0 */
145, 35, 0, 4, 78,128, 0, 32,124, 8, 2,166,148, 33,255,192, /* 0x 200 */ 124, 8, 3,166, 56, 33, 0, 16,145, 35, 0, 4, 78,128, 0, 32, /* 0x 200 */
144, 1, 0, 68,128, 4, 0, 0,191,129, 0, 48, 47,128, 0, 0, /* 0x 210 */ 124, 8, 2,166,148, 33,255,192,144, 1, 0, 68,128, 4, 0, 0, /* 0x 210 */
124,159, 35,120,124,126, 27,120,124,188, 43,120,124,221, 51,120, /* 0x 220 */ 191,129, 0, 48, 47,128, 0, 0,124,159, 35,120,124,126, 27,120, /* 0x 220 */
65,158, 1, 36, 56,160, 0, 12,127,195,243,120, 56,129, 0, 16, /* 0x 230 */ 124,188, 43,120,124,221, 51,120, 65,158, 1, 36, 56,160, 0, 12, /* 0x 230 */
75,255,255, 93,129, 33, 0, 16,128,161, 0, 20, 47,137, 0, 0, /* 0x 240 */ 127,195,243,120, 56,129, 0, 16, 75,255,255, 93,129, 33, 0, 16, /* 0x 240 */
64,190, 0, 36, 60, 0, 33, 88, 96, 0, 80, 85,127,133, 0, 0, /* 0x 250 */ 128,161, 0, 20, 47,137, 0, 0, 64,190, 0, 36, 60, 0, 33, 88, /* 0x 250 */
64,190, 0, 28,128, 30, 0, 0, 47,128, 0, 0, 65,190, 0,232, /* 0x 260 */ 96, 0, 80, 85,127,133, 0, 0, 64,190, 0, 28,128, 30, 0, 0, /* 0x 260 */
72, 0, 0, 12, 47,133, 0, 0, 64,190, 0, 12, 56, 96, 0,127, /* 0x 270 */ 47,128, 0, 0, 65,190, 0,232, 72, 0, 0, 12, 47,133, 0, 0, /* 0x 270 */
75,255,254,229,127, 5, 72, 64, 65,185,255,244,128, 31, 0, 0, /* 0x 280 */ 64,190, 0, 12, 56, 96, 0,127, 75,255,254,229,127, 5, 72, 64, /* 0x 280 */
127,137, 0, 64, 65,189,255,232,128, 31, 0, 4, 64,152, 0,136, /* 0x 290 */ 65,185,255,244,128, 31, 0, 0,127,137, 0, 64, 65,189,255,232, /* 0x 290 */
124,164, 43,120,128,126, 0, 4,124, 5, 3,120, 56,193, 0, 32, /* 0x 2a0 */ 128, 31, 0, 4, 64,152, 0,136,124,164, 43,120,128,126, 0, 4, /* 0x 2a0 */
128,225, 0, 24,145, 33, 0, 32,127,136, 3,166, 78,128, 0, 33, /* 0x 2b0 */ 124, 5, 3,120, 56,193, 0, 32,136,225, 0, 24,145, 33, 0, 32, /* 0x 2b0 */
47,131, 0, 0, 64,190,255,184,128,129, 0, 32,128, 1, 0, 16, /* 0x 2c0 */ 127,136, 3,166, 78,128, 0, 33, 47,131, 0, 0, 64,190,255,184, /* 0x 2c0 */
127,132, 0, 0, 64,190,255,168,136,193, 0, 25, 49, 61,255,255, /* 0x 2d0 */ 128,129, 0, 32,128, 1, 0, 16,127,132, 0, 0, 64,190,255,168, /* 0x 2d0 */
124, 9,233, 16,125, 38, 0,208, 85, 41, 15,254,125, 43, 0, 57, /* 0x 2e0 */ 136,193, 0, 25, 49, 61,255,255,124, 9,233, 16,125, 38, 0,208, /* 0x 2e0 */
65,162, 0, 20,128,127, 0, 4,136,161, 0, 26,127,168, 3,166, /* 0x 2f0 */ 85, 41, 15,254,125, 43, 0, 57, 65,162, 0, 20,128,127, 0, 4, /* 0x 2f0 */
78,128, 0, 33,128, 30, 0, 4,129, 97, 0, 20,129, 62, 0, 0, /* 0x 300 */ 136,161, 0, 26,127,168, 3,166, 78,128, 0, 33,128, 30, 0, 4, /* 0x 300 */
124, 0, 90, 20,125, 43, 72, 80,144, 30, 0, 4,145, 62, 0, 0, /* 0x 310 */ 129, 97, 0, 20,129, 62, 0, 0,124, 0, 90, 20,125, 43, 72, 80, /* 0x 310 */
72, 0, 0, 16,124, 4, 3,120,127,195,243,120, 75,255,254,113, /* 0x 320 */ 144, 30, 0, 4,145, 62, 0, 0, 72, 0, 0, 16,124, 4, 3,120, /* 0x 320 */
129, 97, 0, 16,129, 63, 0, 0,128, 31, 0, 4,125, 43, 72, 80, /* 0x 330 */ 127,195,243,120, 75,255,254,113,129, 97, 0, 16,129, 63, 0, 0, /* 0x 330 */
47,137, 0, 0,124, 0, 90, 20,144, 31, 0, 4,145, 63, 0, 0, /* 0x 340 */ 128, 31, 0, 4,125, 43, 72, 80, 47,137, 0, 0,124, 0, 90, 20, /* 0x 340 */
75,255,254,224,128, 1, 0, 68,187,129, 0, 48,124, 8, 3,166, /* 0x 350 */ 144, 31, 0, 4,145, 63, 0, 0, 75,255,254,224,128, 1, 0, 68, /* 0x 350 */
56, 33, 0, 64, 78,128, 0, 32, 44, 3, 0, 0, 77,130, 0, 32, /* 0x 360 */ 187,129, 0, 48,124, 8, 3,166, 56, 33, 0, 64, 78,128, 0, 32, /* 0x 360 */
48, 4,255,255,125, 96, 33, 16,128, 3, 0, 0,127,128, 32, 0, /* 0x 370 */ 44, 3, 0, 0, 77,130, 0, 32, 48, 4,255,255,125, 96, 33, 16, /* 0x 370 */
104, 9, 0, 1, 33, 73, 0, 0,125, 42, 73, 20,125, 42, 88, 57, /* 0x 380 */ 128, 3, 0, 0,127,128, 32, 0,104, 9, 0, 1, 33, 73, 0, 0, /* 0x 380 */
65,158, 0, 8, 65,162, 0, 16,144,163, 0, 4,144,131, 0, 0, /* 0x 390 */ 125, 42, 73, 20,125, 42, 88, 57, 65,158, 0, 8, 65,162, 0, 16, /* 0x 390 */
78,128, 0, 32, 56, 99, 0, 8, 75,255,255,208,124, 8, 2,166, /* 0x 3a0 */ 144,163, 0, 4,144,131, 0, 0, 78,128, 0, 32, 56, 99, 0, 8, /* 0x 3a0 */
148, 33,255,160,144, 1, 0,100,160, 3, 0, 16,161, 67, 0, 44, /* 0x 3b0 */ 75,255,255,208,124, 8, 2,166,148, 33,255,160,144, 1, 0,100, /* 0x 3b0 */
125,128, 0, 38,129, 35, 0, 28,104, 0, 0, 3, 53, 74,255,255, /* 0x 3c0 */ 160, 3, 0, 16,161, 67, 0, 44,125,128, 0, 38,129, 35, 0, 28, /* 0x 3c0 */
124, 0, 0,208,190, 65, 0, 40,127,163, 74, 20,124,121, 27,120, /* 0x 3d0 */ 104, 0, 0, 3, 53, 74,255,255,124, 0, 0,208,190, 65, 0, 40, /* 0x 3d0 */
84, 3, 46,246,145,129, 0, 36,124,151, 35,120,124,178, 43,120, /* 0x 3e0 */ 127,163, 74, 20,124,121, 27,120, 84, 3, 46,246,145,129, 0, 36, /* 0x 3e0 */
124,211, 51,120,124,244, 59,120,125, 21, 67,120, 56, 99, 8, 34, /* 0x 3f0 */ 124,151, 35,120,124,178, 43,120,124,211, 51,120,124,244, 59,120, /* 0x 3f0 */
127,171,235,120, 59,224,255,255, 59,192, 0, 0, 65,128, 0, 68, /* 0x 400 */ 125, 21, 67,120, 56, 99, 8, 34,127,171,235,120, 59,224,255,255, /* 0x 400 */
57, 74, 0, 1,125, 73, 3,166,128, 11, 0, 0, 47,128, 0, 1, /* 0x 410 */ 59,192, 0, 0, 65,128, 0, 68, 57, 74, 0, 1,125, 73, 3,166, /* 0x 410 */
64,190, 0, 40,129, 43, 0, 8,127,137,248, 64, 64,156, 0, 8, /* 0x 420 */ 128, 11, 0, 0, 47,128, 0, 1, 64,190, 0, 40,129, 43, 0, 8, /* 0x 420 */
125, 63, 75,120,128, 11, 0, 20,124, 0, 74, 20,127,158, 0, 64, /* 0x 430 */ 127,137,248, 64, 64,156, 0, 8,125, 63, 75,120,128, 11, 0, 20, /* 0x 430 */
64,156, 0, 8,124, 30, 3,120, 57,107, 0, 32, 66, 0,255,204, /* 0x 440 */ 124, 0, 74, 20,127,158, 0, 64, 64,156, 0, 8,124, 30, 3,120, /* 0x 440 */
87,255, 0, 38,125, 63,240, 80, 57, 41, 15,255, 85, 62, 0, 38, /* 0x 450 */ 57,107, 0, 32, 66, 0,255,204, 87,255, 0, 38,125, 63,240, 80, /* 0x 450 */
124,102, 27,120,127,196,243,120,127,227,251,120, 56,160, 0, 0, /* 0x 460 */ 57, 41, 15,255, 85, 62, 0, 38,124,102, 27,120,127,196,243,120, /* 0x 460 */
56,224,255,255, 57, 0, 0, 0, 75,255,252,217,160, 25, 0, 44, /* 0x 470 */ 127,227,251,120, 56,160, 0, 0, 56,224,255,255, 57, 0, 0, 0, /* 0x 470 */
58,192, 0, 0,127,150, 0, 0,124, 3,242, 20,144, 1, 0, 8, /* 0x 480 */ 75,255,252,217,160, 25, 0, 44, 58,192, 0, 0,127,150, 0, 0, /* 0x 480 */
127, 31, 24, 80, 64,156, 1,128, 46, 23, 0, 0, 65,146, 0, 40, /* 0x 490 */ 124, 3,242, 20,144, 1, 0, 8,127, 31, 24, 80, 64,156, 1,128, /* 0x 490 */
128, 29, 0, 0, 47,128, 0, 6, 64,190, 0, 28,128,189, 0, 8, /* 0x 4a0 */ 46, 23, 0, 0, 65,146, 0, 40,128, 29, 0, 0, 47,128, 0, 6, /* 0x 4a0 */
126, 99,155,120,124,165,194, 20, 56,128, 0, 3, 75,255,254,173, /* 0x 4b0 */ 64,190, 0, 28,128,189, 0, 8,126, 99,155,120,124,165,194, 20, /* 0x 4b0 */
72, 0, 1, 64,128, 29, 0, 0, 47,128, 0, 1, 64,190, 1, 52, /* 0x 4c0 */ 56,128, 0, 3, 75,255,254,173, 72, 0, 1, 64,128, 29, 0, 0, /* 0x 4c0 */
128, 29, 0, 24,129, 93, 0, 8, 61, 32,115, 81, 84, 0, 22,250, /* 0x 4d0 */ 47,128, 0, 1, 64,190, 1, 52,128, 29, 0, 24,129, 93, 0, 8, /* 0x 4d0 */
97, 41, 98, 64,129,125, 0, 20,125, 41, 4, 48, 85, 94, 5, 62, /* 0x 4e0 */ 61, 32,115, 81, 84, 0, 22,250, 97, 41, 98, 64,129,125, 0, 20, /* 0x 4e0 */
48, 23,255,255,124,160,185, 16,128, 29, 0, 16, 85, 58, 7,126, /* 0x 4f0 */ 125, 41, 4, 48, 85, 94, 5, 62, 48, 23,255,255,124,160,185, 16, /* 0x 4f0 */
127,106, 90, 20, 84,165, 8, 60,127,254, 80, 80,144, 1, 0, 16, /* 0x 500 */ 128, 29, 0, 16, 85, 58, 7,126,127,106, 90, 20, 84,165, 8, 60, /* 0x 500 */
145, 65, 0, 20,127,128,242, 20,127,255,194, 20,127,123,194, 20, /* 0x 510 */ 127,254, 80, 80,144, 1, 0, 16,145, 65, 0, 20,127,128,242, 20, /* 0x 510 */
124,165,211,120, 65,146, 0, 12, 56,192, 0, 50, 72, 0, 0, 8, /* 0x 520 */ 127,255,194, 20,127,123,194, 20,124,165,211,120, 65,146, 0, 12, /* 0x 520 */
56,192, 0, 18, 64,146, 0, 12,126, 71,147,120, 72, 0, 0, 8, /* 0x 530 */ 56,192, 0, 50, 72, 0, 0, 8, 56,192, 0, 18, 64,146, 0, 12, /* 0x 530 */
56,224,255,255,129, 29, 0, 4,127,227,251,120,125, 30, 64, 80, /* 0x 540 */ 126, 71,147,120, 72, 0, 0, 8, 56,224,255,255,129, 29, 0, 4, /* 0x 540 */
127,132,227,120, 75,255,251,253,127,159, 24, 0, 64,158, 0,104, /* 0x 550 */ 127,227,251,120,125, 30, 64, 80,127,132,227,120, 75,255,251,253, /* 0x 550 */
65,178, 0, 24,126,227,187,120, 56,129, 0, 16,126,133,163,120, /* 0x 560 */ 127,159, 24, 0, 64,158, 0,104, 65,178, 0, 24,126,227,187,120, /* 0x 560 */
126,166,171,120, 75,255,252,149,115, 64, 0, 2,124, 28, 0,208, /* 0x 570 */ 56,129, 0, 16,126,133,163,120,126,166,171,120, 75,255,252,149, /* 0x 570 */
84, 30, 5, 62, 65,130, 0, 36, 47,158, 0, 0,125, 63,226, 20, /* 0x 580 */ 115, 64, 0, 2,124, 28, 0,208, 84, 30, 5, 62, 65,130, 0, 36, /* 0x 580 */
65,158, 0, 24,127,201, 3,166, 56, 0, 0, 0,152, 9, 0, 0, /* 0x 590 */ 47,158, 0, 0,125, 63,226, 20, 65,158, 0, 24,127,201, 3,166, /* 0x 590 */
57, 41, 0, 1, 66, 0,255,248, 65,178, 0, 36,127,227,251,120, /* 0x 5a0 */ 56, 0, 0, 0,152, 9, 0, 0, 57, 41, 0, 1, 66, 0,255,248, /* 0x 5a0 */
127,132,227,120,127, 69,211,120, 75,255,251,205, 47,131, 0, 0, /* 0x 5b0 */ 65,178, 0, 36,127,227,251,120,127,132,227,120,127, 69,211,120, /* 0x 5b0 */
65,190, 0, 12, 56, 96, 0,127, 75,255,251,157,124, 28,242, 20, /* 0x 5c0 */ 75,255,251,205, 47,131, 0, 0, 65,190, 0, 12, 56, 96, 0,127, /* 0x 5c0 */
127,255, 2, 20,127,159,216, 64, 64,188, 0, 40,124,159,216, 80, /* 0x 5d0 */ 75,255,251,157,124, 28,242, 20,127,255, 2, 20,127,159,216, 64, /* 0x 5d0 */
127, 69,211,120,127,227,251,120, 56,192, 0, 50, 56,224,255,255, /* 0x 5e0 */ 64,188, 0, 40,124,159,216, 80,127, 69,211,120,127,227,251,120, /* 0x 5e0 */
57, 0, 0, 0, 75,255,251, 93,127,159, 24, 0, 64,190,255,200, /* 0x 5f0 */ 56,192, 0, 50, 56,224,255,255, 57, 0, 0, 0, 75,255,251, 93, /* 0x 5f0 */
160, 25, 0, 44, 58,214, 0, 1,127,150, 0, 0, 59,189, 0, 32, /* 0x 600 */ 127,159, 24, 0, 64,190,255,200,160, 25, 0, 44, 58,214, 0, 1, /* 0x 600 */
75,255,254,132,128,121, 0, 24,128, 1, 0,100,129,129, 0, 36, /* 0x 610 */ 127,150, 0, 0, 59,189, 0, 32, 75,255,254,132,128,121, 0, 24, /* 0x 610 */
124, 99,194, 20,124, 8, 3,166,186, 65, 0, 40,125,128,129, 32, /* 0x 620 */ 128, 1, 0,100,129,129, 0, 36,124, 99,194, 20,124, 8, 3,166, /* 0x 620 */
56, 33, 0, 96, 78,128, 0, 32,124, 8, 2,166,148, 33,255,192, /* 0x 630 */ 186, 65, 0, 40,125,128,129, 32, 56, 33, 0, 96, 78,128, 0, 32, /* 0x 630 */
144, 1, 0, 68, 56,132,255,232, 56, 3, 0, 24,144, 1, 0, 12, /* 0x 640 */ 124, 8, 2,166,148, 33,255,192,144, 1, 0, 68, 56,132,255,232, /* 0x 640 */
144,129, 0, 8,128, 3, 0, 24,191, 97, 0, 44,129, 97, 0, 8, /* 0x 650 */ 56, 3, 0, 24,144, 1, 0, 12,144,129, 0, 8,128, 3, 0, 24, /* 0x 650 */
124,191, 43,120,129,129, 0, 12,124,229, 59,120, 56,192, 0, 0, /* 0x 660 */ 191, 97, 0, 44,129, 97, 0, 8,124,191, 43,120,129,129, 0, 12, /* 0x 660 */
56, 97, 0, 8, 56,129, 0, 16, 59,223, 0, 52,125, 61, 75,120, /* 0x 670 */ 124,229, 59,120, 56,192, 0, 0, 56, 97, 0, 8, 56,129, 0, 16, /* 0x 670 */
124,251, 59,120,144, 1, 0, 16,125, 28, 67,120,145, 97, 0, 24, /* 0x 680 */ 59,223, 0, 52,125, 61, 75,120,124,251, 59,120,144, 1, 0, 16, /* 0x 680 */
145,129, 0, 28,147,225, 0, 20, 75,255,251,113,128,190, 0, 8, /* 0x 690 */ 125, 28, 67,120,145, 97, 0, 24,145,129, 0, 28,147,225, 0, 20, /* 0x 690 */
127,163,235,120, 56,165, 0, 52, 56,128, 0, 3, 75,255,252,189, /* 0x 6a0 */ 75,255,251,113,128,190, 0, 8,127,163,235,120, 56,165, 0, 52, /* 0x 6a0 */
160,191, 0, 44,127,163,235,120, 56,128, 0, 5, 75,255,252,173, /* 0x 6b0 */ 56,128, 0, 3, 75,255,252,189,160,191, 0, 44,127,163,235,120, /* 0x 6b0 */
128,191, 0, 24,127,163,235,120, 56,128, 0, 9, 75,255,252,157, /* 0x 6c0 */ 56,128, 0, 5, 75,255,252,173,128,191, 0, 24,127,163,235,120, /* 0x 6c0 */
127,103,219,120,127,136,227,120,127,227,251,120,127,166,235,120, /* 0x 6d0 */ 56,128, 0, 9, 75,255,252,157,127,103,219,120,127,136,227,120, /* 0x 6d0 */
56,129, 0, 24, 56,160, 0, 0, 75,255,252,197,160, 31, 0, 44, /* 0x 6e0 */ 127,227,251,120,127,166,235,120, 56,129, 0, 24, 56,160, 0, 0, /* 0x 6e0 */
124,124, 27,120, 59, 96, 0, 0,127,155, 0, 0, 64,156, 0,124, /* 0x 6f0 */ 75,255,252,197,160, 31, 0, 44,124,124, 27,120, 59, 96, 0, 0, /* 0x 6f0 */
128, 30, 0, 0, 59,123, 0, 1, 47,128, 0, 3, 56,128, 0, 0, /* 0x 700 */ 127,155, 0, 0, 64,156, 0,124,128, 30, 0, 0, 59,123, 0, 1, /* 0x 700 */
56,160, 0, 0, 64,190, 0, 88,128,126, 0, 8, 75,255,250, 89, /* 0x 710 */ 47,128, 0, 3, 56,128, 0, 0, 56,160, 0, 0, 64,190, 0, 88, /* 0x 710 */
124,125, 27,121,127,228,251,120, 56,160, 2, 0, 65,128, 0, 40, /* 0x 720 */ 128,126, 0, 8, 75,255,250, 89,124,125, 27,121,127,228,251,120, /* 0x 720 */
75,255,250, 61, 47,131, 2, 0, 56,128, 0, 0,127,227,251,120, /* 0x 730 */ 56,160, 2, 0, 65,128, 0, 40, 75,255,250, 61, 47,131, 2, 0, /* 0x 730 */
127,165,235,120, 56,192, 0, 0, 56,224, 0, 0, 57, 0, 0, 0, /* 0x 740 */ 56,128, 0, 0,127,227,251,120,127,165,235,120, 56,192, 0, 0, /* 0x 740 */
65,190, 0, 12, 56, 96, 0,127, 75,255,250, 13, 75,255,252, 81, /* 0x 750 */ 56,224, 0, 0, 57, 0, 0, 0, 65,190, 0, 12, 56, 96, 0,127, /* 0x 750 */
124,124, 27,120,127,163,235,120, 75,255,250, 21,160, 31, 0, 44, /* 0x 760 */ 75,255,250, 13, 75,255,252, 81,124,124, 27,120,127,163,235,120, /* 0x 760 */
59,222, 0, 32, 75,255,255,132,128, 1, 0, 68,127,131,227,120, /* 0x 770 */ 75,255,250, 21,160, 31, 0, 44, 59,222, 0, 32, 75,255,255,132, /* 0x 770 */
124, 8, 3,166,187, 97, 0, 44, 56, 33, 0, 64, 78,128, 0, 32 /* 0x 780 */ 128, 1, 0, 68,127,131,227,120,124, 8, 3,166,187, 97, 0, 44, /* 0x 780 */
56, 33, 0, 64, 78,128, 0, 32 /* 0x 790 */
}; };
+36 -21
View File
@@ -32,6 +32,10 @@
//#include "arch/i386/macros2.ash" //#include "arch/i386/macros2.ash"
#include "arch/amd64/regs.h" #include "arch/amd64/regs.h"
#define section .section
sz_Ehdr= 64
sz_Phdr= 56
sz_l_info= 12 sz_l_info= 12
l_lsize= 8 l_lsize= 8
@@ -61,9 +65,10 @@ M_NRV2B_LE32=2 // ../conf.h
M_NRV2E_LE32=8 M_NRV2E_LE32=8
.section LEXEC000 section ELFMAINX
_start: .globl _start _start: .globl _start
call main // push &decompress call main // push &decompress
ret_main:
/* Returns 0 on success; non-zero on failure. */ /* Returns 0 on success; non-zero on failure. */
decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method) decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method)
@@ -74,6 +79,14 @@ decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint meth
#define dst %arg3 #define dst %arg3
#define ldst %arg4 /* Out: actually a reference: &len_dst */ #define ldst %arg4 /* Out: actually a reference: &len_dst */
#define meth %arg5l #define meth %arg5l
#define methb %arg5b
push %rbp; push %rbx // C callable
push ldst
push dst
addq src,lsrc; push lsrc // &input_eof
section NRV_COMMON
/* Working registers */ /* Working registers */
#define off %eax /* XXX: 2GB */ #define off %eax /* XXX: 2GB */
@@ -82,11 +95,6 @@ decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint meth
#define bits %ebx #define bits %ebx
#define disp %rbp #define disp %rbp
push %rbp; push %rbx // C callable
push ldst
push dst
addq src,lsrc; push lsrc // &input_eof
movq src,%rsi // hardware src for movsb, lodsb movq src,%rsi // hardware src for movsb, lodsb
movq dst,%rdi // hardware dst for movsb movq dst,%rdi // hardware dst for movsb
xor bits,bits // empty; force refill xor bits,bits // empty; force refill
@@ -154,14 +162,19 @@ copy1:
copy0: copy0:
rep; ret rep; ret
#include "arch/amd64/nrv2e_d.S"
#include "arch/amd64/nrv2b_d.S"
setup: setup:
cld cld
pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit
cmpl $ M_NRV2E_LE32,meth; je top_n2e
cmpl $ M_NRV2B_LE32,meth; je top_n2b section NRV2E
#include "arch/amd64/nrv2e_d.S"
section NRV2B
#include "arch/amd64/nrv2b_d.S"
#include "arch/amd64/lzma_d.S"
section ELFMAINY
eof: eof:
pop %rcx // &input_eof pop %rcx // &input_eof
movq %rsi,%rax; subq %rcx,%rax // src -= eof; // return 0: good; else: bad movq %rsi,%rax; subq %rcx,%rax // src -= eof; // return 0: good; else: bad
@@ -170,20 +183,20 @@ eof:
pop %rbx; pop %rbp pop %rbx; pop %rbp
ret ret
/* Temporary until we get the buildLoader stuff working ... */
.ascii "\n$Id: UPX (C) 1996-2006 the UPX Team. "
.asciz "All Rights Reserved. http://upx.sf.net $\n"
/* These from /usr/include/asm-x86_64/unistd.h */ /* These from /usr/include/asm-x86_64/unistd.h */
__NR_write = 1 __NR_write = 1
__NR_exit = 60 __NR_exit = 60
msg_SELinux: msg_SELinux:
push $ L71 - L70; pop %arg3 // length push $ L71 - L70; pop %arg3 // length
call L71 call L72
L70: L70:
.asciz "PROT_EXEC|PROT_WRITE failed.\n" .asciz "PROT_EXEC|PROT_WRITE failed.\n"
L71: L71:
// IDENTSTR goes here
section ELFMAINZ
L72:
pop %arg2 // message text pop %arg2 // message text
push $2; pop %arg1 // fd stderr push $2; pop %arg1 // fd stderr
push $ __NR_write; pop %rax push $ __NR_write; pop %rax
@@ -232,7 +245,7 @@ unfold:
push $ LENU // for unmap in fold push $ LENU // for unmap in fold
movl $ CNTC,%ecx movl $ CNTC,%ecx
push $ ADRX //# for upx_main push $ ADRX //# for upx_main
push $ LENX // for upx_main push %r15 // LENX for upx_main
/* Move and relocate if compressed overlaps uncompressed. /* Move and relocate if compressed overlaps uncompressed.
Move by 0 when total compressed executable is < 3MB. Move by 0 when total compressed executable is < 3MB.
@@ -251,7 +264,7 @@ unfold:
push %rax // ret_addr after decompression push %rax // ret_addr after decompression
xchgl %eax,%arg3l // %arg3= dst for unfolding XXX: 4GB xchgl %eax,%arg3l // %arg3= dst for unfolding XXX: 4GB
lodsl; push %rax // allocate slot on stack lodsl; push %rax // allocate slot on stack
movq %rsp,%arg4 // &len_dst ==> &do_not_care movq %rsp,%arg4 // &len_dst ==> used by lzma for EOF
lodsl; xchgl %eax,%arg1l // sz_cpr XXX: 4GB lodsl; xchgl %eax,%arg1l // sz_cpr XXX: 4GB
lodsl; movzbl %al,%arg5l // b_method lodsl; movzbl %al,%arg5l // b_method
xchg %arg1l,%arg2l // XXX: 4GB xchg %arg1l,%arg2l // XXX: 4GB
@@ -260,14 +273,16 @@ unfold:
ret ret
main: main:
// int3 # uncomment for debugging //// int3 # uncomment for debugging
pop %rbp // &decompress pop %rbp // &decompress
movl -4-(ret_main - _start)(%rbp),%r15d // length which precedes stub
subl $ sz_Ehdr + 2*sz_Phdr + sz_l_info + sz_p_info,%r15d
call unfold // push &b_info call unfold // push &b_info
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */ // { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...}
/*__XTHEENDX__*/ /*__XTHEENDX__*/
/* /*
vi:ts=8:et:nowrap vi:ts=8:et:nowrap
*/ */
+109
View File
@@ -0,0 +1,109 @@
/*
; lzma_d.S -- 64-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/
;
*/
#define section .section
section LZMA_ELF00
//decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method)
/* Arguments according to calling convention */
#define src %arg1 /* %rdi */
#define lsrc %arg2 /* %rsi */
#define dst %arg3 /* %rdx */
#define ldst %arg4 /* %rcx */ /* Out: actually a reference: &len_dst */
#define meth %arg5l /* %r8 */
#define methb %arg5b
// ELFMAINX has already done this for us:
// pushq %rbp; push %rbx // C callable
// pushq ldst
// pushq dst
// addq src,lsrc; push lsrc // &input_eof
#define M_LZMA 14
cmpb $ M_LZMA,methb; jne not_lzma
pushq %rbp; movq %rsp,%rbp // we use alloca
//LzmaDecode( // from lzmaSDK/C/7zip/Compress/LZMA_C/LzmaDecode.h
// %arg1= &CLzmaDecoderState,
// %arg2= in, %arg3l= inSize, %arg4= &inSizeProcessed,
// %arg5= out, %arg6l= outSize, arg7@ 8+%esp/ &outSizeProcessed
//)
movl (ldst),%arg6l // &outSize XXX: 4GB
movq dst,%arg5 // outp
movq lsrc,%arg3 // inSize
leaq 2(src),%arg2; pushq %arg2 // in; save @-8(%rbp) for size calc at eof
movb (src),%al; decl %arg3l // first byte, replaces LzmaDecodeProperties()
movb %al,%cl // cl= ((lit_context_bits + lit_pos_bits)<<3) | pos_bits
andb $7,%al // al= pos_bits
shrb $3,%cl // cl= lit_context_bits + lit_pos_bits
#define LZMA_BASE_SIZE 1846
#define LZMA_LIT_SIZE 768
#define szSizeT 4
movq $-LZMA_LIT_SIZE,%rbx
shlq %cl,%rbx; movb %al,%cl // %cl= pos_bits
// alloca{inSizeProcessed, outSizeProcessed, *_bits, CLzmaDecoderState}
leaq -(2*szSizeT +4) - 2*LZMA_BASE_SIZE(%rsp,%rbx,2), %rbx
andq $~0<<6,%rbx // 64-byte align
1:
pushq $0 // clera CLzmaDecoderState on stack
cmpq %rbx,%rsp
jne 1b
pushq %rbx // &outSizeProcessed [arg7]
leaq 2*szSizeT(%rbx),%arg1 // &CLzmaDecoderState
movb -1(%arg2),%cl; decl %arg3l // second byte, replaces LzmaDecodeProperties()
movb %al,2(%arg1) // store pos_bits
movb %cl,%al // al= (lit_pos_bits<<4) | lit_context_bits
shrb $4,%cl; movb %cl,1(%arg1) // store lit_pos_bits
andb $0xf,%al; movb %al, (%arg1) // store lit_context_bits
leaq -szSizeT(%arg1),%arg4 // &inSizeProcessed
pushq %rax // return address slot (dummy CALL)
section LZMA_DEC10
#include "lzma_d_cs.S"
section LZMA_DEC20
#include "lzma_d_cf.S"
section LZMA_DEC30
movq -1*8(%rbp),%rsi // src [after header]
movq 2*8(%rbp),%rdi // dst
movl szSizeT(%rbx),%ecx; addq %rcx,%rsi // inSizeProcessed
movl (%rbx),%edx; addq %rdx,%rdi // outSizeProcessed
leave // movl %ebp,%rsp; popq %rbp
not_lzma:
// vi:ts=8:et
+2
View File
@@ -29,6 +29,7 @@
<jreiser@users.sourceforge.net> <jreiser@users.sourceforge.net>
*/ */
cmpb $ M_NRV2B_LE32,methb; je top_n2b; jmp not_n2b
.p2align 3 .p2align 3
lit_n2b: lit_n2b:
incq %rsi; movb %dl,(%rdi) incq %rsi; movb %dl,(%rdi)
@@ -62,6 +63,7 @@ gotlen_n2b:
bot_n2b: # In: 0==len bot_n2b: # In: 0==len
jmp top_n2b jmp top_n2b
not_n2b:
/* /*
vi:ts=8:et:nowrap vi:ts=8:et:nowrap
*/ */
+3
View File
@@ -29,6 +29,7 @@
<jreiser@users.sourceforge.net> <jreiser@users.sourceforge.net>
*/ */
cmpb $ M_NRV2E_LE32,methb; je top_n2e; jmp not_n2e
.p2align 3 .p2align 3
lit_n2e: lit_n2e:
incq %rsi; movb %dl,(%rdi) incq %rsi; movb %dl,(%rdi)
@@ -75,6 +76,8 @@ gotlen_n2e:
bot_n2e: # In: 0==len bot_n2e: # In: 0==len
jmp top_n2e jmp top_n2e
not_n2e:
/* /*
vi:ts=8:et:nowrap vi:ts=8:et:nowrap
*/ */
+1
View File
@@ -11,5 +11,6 @@
#define sys4l r10d #define sys4l r10d
#define arg5 r8 #define arg5 r8
#define arg5l r8d #define arg5l r8d
#define arg5b r8b
#define arg6 r9 #define arg6 r9
#define arg6l r9d #define arg6l r9d
+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
+31 -32
View File
@@ -40,22 +40,21 @@
; ecx - 0 ; ecx - 0
*/ */
// CPU 386 // CPU 386
.macro getbit_n2b one .macro getbit_n2b one
.ifc \one, 1 .ifc \one, 1
add ebx, ebx add ebx, ebx
jnz 1f jnz 1f
.endif .endif
mov ebx, [esi] mov ebx, [esi]
sub esi, -4 sub esi, byte -4
adc ebx, ebx adc ebx, ebx
1: 1:
.endm .endm
#undef getbit #undef getbit
#define getbit getbit_n2b #define getbit getbit_n2b
section N2BSMA10 section N2BSMA10
@@ -64,7 +63,7 @@ decompr_literals_n2b:
movsb movsb
section N2BFAS10 section N2BFAS10
jmps dcl1_n2b jmps dcl1_n2b
.balign 8 .balign 8
section N2BFAS11 section N2BFAS11
decompr_literalb_n2b: decompr_literalb_n2b:
mov al, [esi] mov al, [esi]
@@ -81,14 +80,14 @@ dcl1_n2b:
getbit 32 getbit 32
dcl2_n2b: dcl2_n2b:
section N2BSMA20 section N2BSMA20
jcs decompr_literals_n2b jc decompr_literals_n2b
xor eax, eax xor eax, eax
inc eax inc eax
section N2BFAS20 section N2BFAS20
#ifndef UPX102 #ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX) mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif #endif
jcs decompr_literalb_n2b jc decompr_literalb_n2b
mov eax, 1 mov eax, 1
section N2BDEC20 section N2BDEC20
loop1_n2b: loop1_n2b:
@@ -96,23 +95,23 @@ loop1_n2b:
adc eax, eax adc eax, eax
section N2BSMA30 section N2BSMA30
getbit 1 getbit 1
jncs loop1_n2b jnc loop1_n2b
section N2BFAS30 section N2BFAS30
add ebx, ebx add ebx, ebx
jncs loop1_n2b jnc loop1_n2b
jnzs loopend1_n2b jnz loopend1_n2b
getbit 32 getbit 32
jncs loop1_n2b jnc loop1_n2b
loopend1_n2b: loopend1_n2b:
section N2BDEC30 section N2BDEC30
xor ecx, ecx xor ecx, ecx
sub eax, 3 sub eax, 3
jcs decompr_ebpeax_n2b jb decompr_ebpeax_n2b
shl eax, 8 shl eax, 8
mov al, [esi] mov al, [esi]
inc esi inc esi
xor eax, -1 xor eax, -1
jzs decompr_end_n2b jz decompr_end_n2b
mov ebp, eax mov ebp, eax
decompr_ebpeax_n2b: decompr_ebpeax_n2b:
getbit 1 getbit 1
@@ -126,13 +125,13 @@ loop2_n2b:
adc ecx, ecx adc ecx, ecx
section N2BSMA40 section N2BSMA40
getbit 1 getbit 1
jncs loop2_n2b jnc loop2_n2b
section N2BFAS40 section N2BFAS40
add ebx, ebx add ebx, ebx
jnc loop2_n2b jnc loop2_n2b
jnz loopend2_n2b jnz loopend2_n2b
getbit 32 getbit 32
jncs loop2_n2b jnc loop2_n2b
loopend2_n2b: loopend2_n2b:
section N2BDUMM1 section N2BDUMM1
section N2BSMA50 section N2BSMA50
@@ -145,44 +144,44 @@ decompr_got_mlen_n2b:
cmp ebp, -0xd00 cmp ebp, -0xd00
adc ecx, 1 adc ecx, 1
section N2BSMA60 section N2BSMA60
#ifndef UPX102 #ifndef UPX102
push esi push esi
#else #else
mov edx, esi mov edx, esi
#endif #endif
lea esi, [edi+ebp] lea esi, [edi+ebp]
rep rep
movsb movsb
#ifndef UPX102 #ifndef UPX102
pop esi pop esi
#else #else
mov esi, edx mov esi, edx
#endif #endif
jmp decompr_loop_n2b jmp decompr_loop_n2b
section N2BFAS60 section N2BFAS60
lea edx, [edi+ebp] lea edx, [edi+ebp]
cmp ebp, -4 cmp ebp, -4
#ifndef UPX102 #ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX) mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif #endif
jbes decompr_copy4_n2b jbe decompr_copy4_n2b
loop3_n2b: loop3_n2b:
mov al, [edx] mov al, [edx]
inc edx inc edx
mov [edi], al mov [edi], al
inc edi inc edi
dec ecx dec ecx
jnzs loop3_n2b jnz loop3_n2b
jmp decompr_loop_n2b jmp decompr_loop_n2b
section N2BFAS61 section N2BFAS61
.balign 4 .balign 4
decompr_copy4_n2b: decompr_copy4_n2b:
mov eax, [edx] mov eax, [edx]
add edx, 4 add edx, 4
mov [edi], eax mov [edi], eax
add edi, 4 add edi, 4
sub ecx, 4 sub ecx, 4
jas decompr_copy4_n2b ja decompr_copy4_n2b
add edi, ecx add edi, ecx
jmp decompr_loop_n2b jmp decompr_loop_n2b
section N2BDEC60 section N2BDEC60
+15 -15
View File
@@ -40,12 +40,11 @@
; ecx - 0 ; ecx - 0
*/ */
// CPU 386 // CPU 386
.macro getbit_n2d one .macro getbit_n2d one
.ifc \one, 1 .ifc \one, 1
add ebx, ebx add ebx, ebx
jnz 1f jnz 1f
.endif .endif
@@ -54,6 +53,7 @@
adc ebx, ebx adc ebx, ebx
1: 1:
.endm .endm
#undef getbit #undef getbit
#define getbit getbit_n2d #define getbit getbit_n2d
@@ -85,9 +85,9 @@ section N2DSMA20
xor eax, eax xor eax, eax
inc eax inc eax
section N2DFAS20 section N2DFAS20
#ifndef UPX102 #ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX) mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif #endif
jc decompr_literalb_n2d jc decompr_literalb_n2d
mov eax, 1 mov eax, 1
section N2DDEC20 section N2DDEC20
@@ -118,7 +118,7 @@ loopend1_n2d:
inc esi inc esi
xor eax, -1 xor eax, -1
jz decompr_end_n2d jz decompr_end_n2d
sar eax, 1 // shift low-bit into carry sar eax, 1 // shift low-bit into carry
mov ebp, eax mov ebp, eax
jmps decompr_ebpeax_n2d jmps decompr_ebpeax_n2d
decompr_prev_dist_n2d: decompr_prev_dist_n2d:
@@ -153,26 +153,26 @@ decompr_got_mlen_n2d:
cmp ebp, -0x500 cmp ebp, -0x500
adc ecx, 1 adc ecx, 1
section N2DSMA60 section N2DSMA60
#ifndef UPX102 #ifndef UPX102
push esi push esi
#else #else
mov edx, esi mov edx, esi
#endif #endif
lea esi, [edi+ebp] lea esi, [edi+ebp]
rep rep
movsb movsb
#ifndef UPX102 #ifndef UPX102
pop esi pop esi
#else #else
mov esi, edx mov esi, edx
#endif #endif
jmp decompr_loop_n2d jmp decompr_loop_n2d
section N2DFAS60 section N2DFAS60
lea edx, [edi+ebp] lea edx, [edi+ebp]
cmp ebp, -4 cmp ebp, -4
#ifndef UPX102 #ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX) mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif #endif
jbe decompr_copy4_n2d jbe decompr_copy4_n2d
loop3_n2d: loop3_n2d:
mov al, [edx] mov al, [edx]
+1 -1
View File
@@ -37,7 +37,7 @@ lzma_d_c%.S : lzma_d_c.c
$(call tc,gcc) $(PP_FLAGS) -c $< -o tmp/$T.o $(call tc,gcc) $(PP_FLAGS) -c $< -o tmp/$T.o
$(call tc,objstrip) tmp/$T.o $(call tc,objstrip) tmp/$T.o
$(call tc,objcopy) -O binary --only-section .text.LzmaDecode tmp/$T.o tmp/$T.bin $(call tc,objcopy) -O binary --only-section .text.LzmaDecode tmp/$T.o tmp/$T.bin
head -c-0 tmp/$T.bin > tmp/$T.out head -c-4 tmp/$T.bin > tmp/$T.out
$(call tc,objdump) -b binary -m powerpc -D tmp/$T.out > tmp/$T.out.lst $(call tc,objdump) -b binary -m powerpc -D tmp/$T.out > tmp/$T.out.lst
$(call tc,bin2h) --mode=gas tmp/$T.out $@ $(call tc,bin2h) --mode=gas tmp/$T.out $@
+1 -1
View File
@@ -24,7 +24,7 @@
<jreiser@users.sourceforge.net> <jreiser@users.sourceforge.net>
*/ */
#include "regs.h" #include "ppc_regs.h"
ppcbxx: # (*f_unf)(xo->buf, out_len, h.b_cto8, h.b_ftid); ppcbxx: # (*f_unf)(xo->buf, out_len, h.b_cto8, h.b_ftid);
#define W_CTO 4 /* must match filteri/ppcbxx.h */ #define W_CTO 4 /* must match filteri/ppcbxx.h */
+114
View File
@@ -0,0 +1,114 @@
/*
; lzma_d.S -- 64-bit PowerPC 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/
;
*/
#include "ppc_regs.h"
#define section .section
section LZMA_ELF00
//decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method)
/* Arguments according to calling convention */
#define src a0
#define lsrc a1
#define dst a2
#define ldst a3 /* Out: actually a reference: &len_dst */
#define meth a4
// ELFMAINX has already done this for us:
// pushq %rbp; push %rbx // C callable
// pushq ldst
// pushq dst
// addq src,lsrc; push lsrc // &input_eof
#define M_LZMA 14
teq r0,r0 // debugging
cmpli cr0,meth,M_LZMA
bne cr0,not_lzma
mflr r0
//LzmaDecode( // from lzmaSDK/C/7zip/Compress/LZMA_C/LzmaDecode.h
// a0= &CLzmaDecoderState,
// a1= inp, a2= inSize, a3= &inSizeProcessed,
// a4= outp, a5= outSize, a6= &outSizeProcessed
//)
lwz a5,0(ldst) // outSize
mr a4,dst // outp
addi a2,lsrc,-2 // inSize
la a1,2(src) // inp
stw r0,4(sp) // ret.addr
lbz r0,0(src) // first byte, replaces LzmaDecodeProperties()
rlwinm t1,r0,32-3,3,31 // t1= (r0>>3)==(lit_context-bits + lit_pos_bits)
rlwinm t0,r0,0,32-3,31 // t0= (7& t0)==pos_bits
#define LZMA_BASE_SIZE 1846
#define LZMA_LIT_SIZE 768
#define szSizeT 4
li a0,-2*LZMA_LIT_SIZE
slw a0,a0,t1 // -2*LZMA_LIT_SIZE << (lit_context_bits + lit_pos_bits)
addi a0,a0,-2*4 -(2*szSizeT +4) - 2*LZMA_BASE_SIZE
// alloca{sp,ra, inSizeProcessed, outSizeProcessed, *_bits, CLzmaDecoderState}
mr a3,sp
add sp,sp,a0
rlwinm sp,sp,0,0,32-6 // (1<<6) byte align
mr a0,a3 // old sp
li r0,0
1:
stwu r0,-4(a0) // clear CLZmaDecoderState on stack
cmpl cr0,sp,a0 // compare logical ==> compare unsigned
blt cr0,1b
stw a3,0(sp) // frame chain
lbz r0,-1(a1) // second byte, replaces LzmaDecodeProperties()
la a6,2*4 (sp) // &outSizeProcessed
la a3,2*4+1*szSizeT(sp) // &inSizeProcessed
la a0,2*4+2*szSizeT(sp) // &CLzmaDecoderState
rlwinm t1,r0,32-4,4,31 // t1= (r0>>4)==lit_pos_bits
rlwinm r0,r0,0,32-4,31 // r0= (0xf& r0)==lit_context_bits
stb t0,2(a0) // pos_bits
stb t1,1(a0) // lit_pos_bits
stb r0,0(a0) // lit_context_bits
section LZMA_DEC10
#include "lzma_d_cs.S"
section LZMA_DEC20
#include "lzma_d_cf.S"
section LZMA_DEC30
lwz sp,0(sp) // old sp
lwz r0,4(sp) // ret.addr
mtlr r0
not_lzma:
// vi:ts=8:et
+1 -1
View File
@@ -151,4 +151,4 @@
.byte 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1 /* 0x0960 */ .byte 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1 /* 0x0960 */
.byte 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80 /* 0x0970 */ .byte 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80 /* 0x0970 */
.byte 144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100 /* 0x0980 */ .byte 144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100 /* 0x0980 */
.byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96, 78,128, 0, 32 /* 0x0990 */ .byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96 /* 0x0990 */
+1 -1
View File
@@ -151,4 +151,4 @@
.byte 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1 /* 0x0960 */ .byte 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1 /* 0x0960 */
.byte 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80 /* 0x0970 */ .byte 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80 /* 0x0970 */
.byte 144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100 /* 0x0980 */ .byte 144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100 /* 0x0980 */
.byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96, 78,128, 0, 32 /* 0x0990 */ .byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96 /* 0x0990 */
+44 -68
View File
@@ -29,41 +29,27 @@
<jreiser@users.sourceforge.net> <jreiser@users.sourceforge.net>
*/ */
#include "ppc_regs.h" #define M_NRV2B_LE32 2
dcbtst 0,dst // prime dcache for store
mflr t3 // return address
SZ_DLINE=128 # size of data cache line in Apple G5 cmpli cr0,meth,M_NRV2B_LE32
bne cr0,not_nrv2b
/* Returns 0 on success; non-zero on failure. */ stw dst,0(ldst) // original dst
decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method) add lsrc,lsrc,src // input eof
/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */ lis hibit,0x8000 // 0x80000000 for detecting next bit
#define hibit r0 /* holds 0x80000000 during decompress */ lis bits,0x8000 // prepare for first load
addi src,src,-1 // prepare for 'lbzu'
#define src a0 addi dst,dst,-1 // prepare for 'stbu'
#define lsrc a1 li disp,-1 // initial displacement
#define dst a2
#define ldst a3 /* Out: actually a reference: &len_dst */
#define meth a4
#define off a4
#define len a5
#define bits a6
#define disp a7
dcbtst 0,dst # prime dcache for store
stw dst,0(ldst) # original dst
add lsrc,lsrc,src # input eof
lis hibit,0x8000 # 0x80000000 for detecting next bit
lis bits,0x8000 # prepare for first load
addi src,src,-1 # prepare for 'lbzu'
addi dst,dst,-1 # prepare for 'stbu'
li disp,-1 # initial displacement
mflr t3 # return address
b bot_n2b b bot_n2b
#undef jnextb0y
#undef jnextb0n
#undef jnextb1y
#undef jnextb1n
/* jump on next bit, with branch prediction: y==>likely; n==>unlikely /* jump on next bit, with branch prediction: y==>likely; n==>unlikely
cr0 is set by the cmpl ["compare logical"==>unsigned]: cr0 is set by the cmpl ["compare logical"==>unsigned]:
lt next bit is 0 lt next bit is 0
@@ -75,66 +61,67 @@ decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint me
#define jnextb1y call get1; bgt+ cr0, #define jnextb1y call get1; bgt+ cr0,
#define jnextb1n call get1; bgt- cr0, #define jnextb1n call get1; bgt- cr0,
#undef getnextb
/* rotate next bit into bottom bit of reg; set cr0 based on entire result reg */ /* rotate next bit into bottom bit of reg; set cr0 based on entire result reg */
#define getnextb(reg) call get1; adde. reg,reg,reg #define getnextb(reg) call get1; adde. reg,reg,reg
get1: get1:
cmpl cr0,bits,hibit # cr0 for jnextb cmpl cr0,bits,hibit // cr0 for jnextb
addc bits,bits,bits # CArry for getnextb addc bits,bits,bits // CArry for getnextb
bnelr+ cr0 # return if reload not needed; likely 31/32 bnelr+ cr0 // return if reload not needed; likely 31/32
/* CArry has been set from adding 0x80000000 to itself; preserve for 'adde' */ /* CArry has been set from adding 0x80000000 to itself; preserve for 'adde' */
# fetch 4 bytes unaligned and LITTLE ENDIAN // fetch 4 bytes unaligned and LITTLE ENDIAN
#if 0 /*{ clean; but 4 instr larger, and 3 cycles longer */ #if 0 /*{ clean; but 4 instr larger, and 3 cycles longer */
lbz bits,1(src) # lo8 lbz bits,1(src) // lo8
lbz t0,2(src); rlwimi bits,t0, 8,16,23 lbz t0,2(src); rlwimi bits,t0, 8,16,23
lbz t0,3(src); rlwimi bits,t0,16, 8,15 lbz t0,3(src); rlwimi bits,t0,16, 8,15
lbzu t0,4(src); rlwimi bits,t0,24, 0, 7 lbzu t0,4(src); rlwimi bits,t0,24, 0, 7
#else /*}{ pray for no unalignment trap or slowdown */ #else /*}{ pray for no unalignment trap or slowdown */
li bits,1 # compensate for 'lbzu' li bits,1 // compensate for 'lbzu'
lwbrx bits,bits,src # bits= fetch_le32(bits+src) lwbrx bits,bits,src // bits= fetch_le32(bits+src)
addi src,src,4 addi src,src,4
#endif /*}*/ #endif /*}*/
cmpl cr0,bits,hibit # cr0 for jnextb cmpl cr0,bits,hibit // cr0 for jnextb
adde bits,bits,bits # CArry for getnextb; set lo bit from CarryIn adde bits,bits,bits // CArry for getnextb; set lo bit from CarryIn
ret ret
lit_n2b: lit_n2b:
#define tmp len #define tmp len
lbzu tmp,1(src) # tmp= *++src; lbzu tmp,1(src) // tmp= *++src;
stbu tmp,1(dst) # *++dst= tmp; stbu tmp,1(dst) // *++dst= tmp;
#undef tmp #undef tmp
top_n2b: top_n2b:
jnextb1y lit_n2b jnextb1y lit_n2b
li off,1 # "the msb" li off,1 // "the msb"
offmore_n2b: offmore_n2b:
getnextb(off) getnextb(off)
jnextb0n offmore_n2b jnextb0n offmore_n2b
addic. off,off,-3 # CArry set [and ignored], but no 'addi.' addic. off,off,-3 // CArry set [and ignored], but no 'addi.'
li len,0 li len,0
blt- offprev_n2b blt- offprev_n2b
lbzu t0,1(src) lbzu t0,1(src)
rlwinm off,off,8,0,31-8 # off<<=8; rlwinm off,off,8,0,31-8 // off<<=8;
nor. disp,off,t0 # disp = -(1+ (off|t0)); nor. disp,off,t0 // disp = -(1+ (off|t0));
beq- eof_n2b beq- eof_nrv
offprev_n2b: # In: 0==len offprev_n2b: // In: 0==len
getnextb(len); getnextb(len) # two bits; cr0 set on result getnextb(len); getnextb(len) // two bits; cr0 set on result
li off,1; bne- gotlen_n2b # raw 1,2,3 ==> 2,3,4 li off,1; bne- gotlen_n2b // raw 1,2,3 ==> 2,3,4
li off,3 # raw 2.. ==> 5.. li off,3 // raw 2.. ==> 5..
li len,1 # "the msb" li len,1 // "the msb"
lenmore_n2b: lenmore_n2b:
getnextb(len) getnextb(len)
jnextb0n lenmore_n2b jnextb0n lenmore_n2b
gotlen_n2b: gotlen_n2b:
subfic t0,disp,(~0)+(-0xd00) # want CArry only subfic t0,disp,(~0)+(-0xd00) // want CArry only
adde len,len,off # len += off + (disp < -0xd00); adde len,len,off // len += off + (disp < -0xd00);
copy: copy:
#define back off #define back off
add back,disp,dst # point back to match in dst add back,disp,dst // point back to match in dst
mtctr len mtctr len
short_n2b: short_n2b:
#define tmp len #define tmp len
@@ -151,21 +138,10 @@ short_n2b:
*/ */
bot_n2b: bot_n2b:
li back,2*SZ_DLINE li back,2*SZ_DLINE
dcbtst back,dst # 2 lines ahead [-1 for stbu] dcbtst back,dst // 2 lines ahead [-1 for stbu]
dcbt back,src # jump start auto prefetch at page boundary dcbt back,src // jump start auto prefetch at page boundary
/* Auto prefetch for Read quits at page boundary; needs 2 misses to restart. */ /* Auto prefetch for Read quits at page boundary; needs 2 misses to restart. */
#undef back #undef back
b top_n2b b top_n2b
eof_n2b: not_nrv2b:
#define tmp r0 /* hibit is dead */
lwz tmp,0(ldst) # original dst
mtlr t3 # return address
addi dst,dst,1 # uncorrect for 'stbu'
addi src,src,1 # uncorrect for 'lbzu'
subf dst,tmp,dst # dst -= tmp; // dst length
#undef tmp
subf a0,lsrc,src # src -= eof; // return 0: good; else: bad
stw dst,0(ldst)
ret
+42 -66
View File
@@ -29,41 +29,27 @@
<jreiser@users.sourceforge.net> <jreiser@users.sourceforge.net>
*/ */
#include "regs.h" #define M_NRV2E_LE32 8
dcbtst 0,dst // prime dcache for store
mflr t3 // return address
SZ_DLINE=128 # size of data cache line in Apple G5 cmpli cr0,meth,M_NRV2E_LE32
bne cr0,not_nrv2e
/* Returns 0 on success; non-zero on failure. */ stw dst,0(ldst) // original dst
decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method) add lsrc,lsrc,src // input eof
/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */ lis hibit,0x8000 // 0x80000000 for detecting next bit
#define hibit r0 /* holds 0x80000000 during decompress */ lis bits,0x8000 // prepare for first load
addi src,src,-1 // prepare for 'lbzu'
#define src a0 addi dst,dst,-1 // prepare for 'stbu'
#define lsrc a1 li disp,-1 // initial displacement
#define dst a2
#define ldst a3 /* Out: actually a reference: &len_dst */
#define meth a4
#define off a4
#define len a5
#define bits a6
#define disp a7
dcbtst 0,dst # prime dcache for store
stw dst,0(ldst) # original dst
add lsrc,lsrc,src # input eof
lis hibit,0x8000 # 0x80000000 for detecting next bit
lis bits,0x8000 # prepare for first load
addi src,src,-1 # prepare for 'lbzu'
addi dst,dst,-1 # prepare for 'stbu'
li disp,-1 # initial displacement
mflr t3 # return address
b bot_n2e b bot_n2e
#undef jnextb0y
#undef jnextb0n
#undef jnextb1y
#undef jnextb1n
/* jump on next bit, with branch prediction: y==>likely; n==>unlikely /* jump on next bit, with branch prediction: y==>likely; n==>unlikely
cr0 is set by the cmpl ["compare logical"==>unsigned]: cr0 is set by the cmpl ["compare logical"==>unsigned]:
lt next bit is 0 lt next bit is 0
@@ -77,31 +63,32 @@ decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint me
#define jnextb1y cmpl 0,bits,hibit; add bits,bits,bits; beql- get32; bgt+ #define jnextb1y cmpl 0,bits,hibit; add bits,bits,bits; beql- get32; bgt+
#define jnextb1n cmpl 0,bits,hibit; add bits,bits,bits; beql- get32; bgt- #define jnextb1n cmpl 0,bits,hibit; add bits,bits,bits; beql- get32; bgt-
#undef getnextb
/* rotate next bit into bottom bit of reg */ /* rotate next bit into bottom bit of reg */
#define getnextb(reg) addc. bits,bits,bits; beql- get32; adde reg,reg,reg #define getnextb(reg) addc. bits,bits,bits; beql- get32; adde reg,reg,reg
get32: get32:
# fetch 4 bytes unaligned and LITTLE ENDIAN // fetch 4 bytes unaligned and LITTLE ENDIAN
#if 0 /*{ clean; but 4 instr larger, and 3 cycles longer */ #if 0 /*{ clean; but 4 instr larger, and 3 cycles longer */
lbz bits,1(src) # lo8 lbz bits,1(src) // lo8
lbz t0,2(src); rlwimi bits,t0, 8,16,23 lbz t0,2(src); rlwimi bits,t0, 8,16,23
lbz t0,3(src); rlwimi bits,t0,16, 8,15 lbz t0,3(src); rlwimi bits,t0,16, 8,15
lbzu t0,4(src); rlwimi bits,t0,24, 0, 7 lbzu t0,4(src); rlwimi bits,t0,24, 0, 7
#else /*}{ pray for no unalignment trap or slowdown */ #else /*}{ pray for no unalignment trap or slowdown */
li bits,1 # compensate for 'lbzu' li bits,1 // compensate for 'lbzu'
lwbrx bits,bits,src # bits= fetch_le32(bits+src) lwbrx bits,bits,src // bits= fetch_le32(bits+src)
addi src,src,4 addi src,src,4
#endif /*}*/ #endif /*}*/
cmpl 0,bits,hibit # cr0 for jnextb cmpl 0,bits,hibit // cr0 for jnextb
addc bits,bits,bits # CArry for getnextb addc bits,bits,bits // CArry for getnextb
ori bits,bits,1 # the flag bit ori bits,bits,1 // the flag bit
ret ret
lit_n2e: lit_n2e:
#define tmp len #define tmp len
lbzu tmp,1(src) # tmp= *++src; lbzu tmp,1(src) // tmp= *++src;
stbu tmp,1(dst) # *++dst= tmp; stbu tmp,1(dst) // *++dst= tmp;
#undef tmp #undef tmp
top_n2e: top_n2e:
jnextb1y lit_n2e jnextb1y lit_n2e
@@ -116,21 +103,21 @@ getoff_n2e:
jnextb0n off_n2e jnextb0n off_n2e
li len,0 li len,0
addic. off,off,-3 # CArry set [and ignored], but no 'addi.' addic. off,off,-3 // CArry set [and ignored], but no 'addi.'
rlwinm off,off,8,0,31-8 # off<<=8; rlwinm off,off,8,0,31-8 // off<<=8;
blt- offprev_n2e blt- offprev_n2e
lbzu t0,1(src) lbzu t0,1(src)
nor. disp,off,t0 # disp = -(1+ (off|t0)); nor. disp,off,t0 // disp = -(1+ (off|t0));
srawi disp,disp,1 # shift off low bit (sets CArry; ignored) srawi disp,disp,1 // shift off low bit (sets CArry; ignored)
beq- eof_n2e beq- eof_nrv
andi. t0,t0,1 # complement of low bit of unshifted disp andi. t0,t0,1 // complement of low bit of unshifted disp
beq+ lenlast_n2e # low bit was 1 beq+ lenlast_n2e // low bit was 1
b lenmore_n2e # low bit was 0 b lenmore_n2e // low bit was 0
offprev_n2e: offprev_n2e:
jnextb1y lenlast_n2e jnextb1y lenlast_n2e
lenmore_n2e: lenmore_n2e:
li len,1 # 1: "the msb" li len,1 // 1: "the msb"
jnextb1y lenlast_n2e jnextb1y lenlast_n2e
len_n2e: len_n2e:
getnextb(len) getnextb(len)
@@ -139,16 +126,16 @@ len_n2e:
b gotlen_n2e b gotlen_n2e
lenlast_n2e: lenlast_n2e:
getnextb(len) # 0,1,2,3 getnextb(len) // 0,1,2,3
gotlen_n2e: gotlen_n2e:
#define tmp off #define tmp off
subfic tmp,disp,(~0)+(-0x500) # want CArry only subfic tmp,disp,(~0)+(-0x500) // want CArry only
#undef tmp #undef tmp
addi len,len,2 addi len,len,2
addze len,len # len += (disp < -0x500); addze len,len // len += (disp < -0x500);
#define back off #define back off
add back,disp,dst # point back to match in dst add back,disp,dst // point back to match in dst
mtctr len mtctr len
short_n2e: short_n2e:
#define tmp len #define tmp len
@@ -164,21 +151,10 @@ bot_n2e:
pace the dcbtst optimally; but that takes 7 or 8 instructions of space. pace the dcbtst optimally; but that takes 7 or 8 instructions of space.
*/ */
li back,2*SZ_DLINE li back,2*SZ_DLINE
dcbtst back,dst # 2 lines ahead [-1 for stbu] dcbtst back,dst // 2 lines ahead [-1 for stbu]
dcbt back,src # jump start auto prefetch at page boundary dcbt back,src // jump start auto prefetch at page boundary
/* Auto prefetch for Read quits at page boundary; needs 2 misses to restart. */ /* Auto prefetch for Read quits at page boundary; needs 2 misses to restart. */
b top_n2e b top_n2e
#undef back #undef back
eof_n2e: not_nrv2e:
#define tmp r0 /* hibit is dead */
lwz tmp,0(ldst) # original dst
mtlr t3 # return address
addi dst,dst,1 # uncorrect for 'stbu'
addi src,src,1 # uncorrect for 'lbzu'
subf dst,tmp,dst # dst -= tmp; // dst length
#undef tmp
subf a0,lsrc,src # src -= eof; // return 0: good; else: bad
stw dst,0(ldst)
ret
+46
View File
@@ -0,0 +1,46 @@
#ifndef __PPC_REGS__ /*{*/
#define __PPC_REGS__
#define r0 0
#define r1 1
#define r2 2
#define r29 29
#define r30 30
#define r31 31
/* Stack pointer */
#define sp 1
/* Subroutine arguments; not saved by callee */
#define a0 3
#define a1 4
#define a2 5
#define a3 6
#define a4 7
#define a5 8
#define a6 9
#define a7 10
/* Scratch (temporary) registers; not saved by callee */
#define t0 2
#define t1 11
#define t2 12
#define t3 13
/* branch and link */
#define call bl
/* branch to link register */
#define ret blr
/* move register */
#define movr mr
#endif /*} __PPC_REGS__ */
/*
vi:ts=4:et:nowrap
*/
+14 -11
View File
@@ -30,11 +30,11 @@
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/ */
#include "arch/i386/macros2.ash"
// CPU 386 // CPU 386
#include "arch/i386/macros2.ash" // CPU 386
/************************************************************************* /*************************************************************************
// program entry point // program entry point
@@ -65,11 +65,11 @@ _start: .globl _start
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)
@@ -93,12 +93,13 @@ section LEXEC010
mov edi, OUTP mov edi, OUTP
or ebp, -1 or ebp, -1
//// align 8 // align 8
#include "arch/i386/nrv2b_d32_2.ash" #include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.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" // FIXME #define db .byte
#include "arch/i386/lzma_d_2.ash"
cjt32 0 cjt32 0
section LEXEC015 section LEXEC015
@@ -148,11 +149,13 @@ section LEXEC020
#define __NR_write 4 #define __NR_write 4
#define __NR_exit 1 #define __NR_exit 1
#define pushsbli .byte 0x6a, /* push sign-extended byte to long immediate */
fail_mmap: fail_mmap:
push L71 - L70 pushsbli L71 - L70
call L71 call L71
L70: L70:
.ascii "PROT_EXEC|PROT_WRITE failed\n" .ascii "PROT_EXEC|PROT_WRITE failed.\n"
L71: L71:
push 2 // fd stderr push 2 // fd stderr
push eax // fake ret.addr push eax // fake ret.addr
@@ -179,7 +182,7 @@ unfold:
// 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, 0-PAGE_SIZE and eax, 0-PAGE_SIZE
push eax // destination for 'ret' push eax // destination for 'ret'
+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"
// ============= // =============
+34 -28
View File
@@ -30,17 +30,20 @@
; <jreiser@users.sourceforge.net> ; <jreiser@users.sourceforge.net>
; ;
*/ */
#include "arch/i386/macros2.ash"
#include "arch/i386/macros2.ash" // CPU 386
; /************************************************************************* #define jmps jmp short
; // program entry point #define jmpn jmp near
; // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/ /*************************************************************************
// program entry point
// see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
.globl _start
section LEXEC000 section LEXEC000
_start: _start: .globl _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.
@@ -63,11 +66,11 @@ _start:
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)
@@ -84,19 +87,20 @@ section LEXEC009
//; empty section for commonality with l_lx_exec86.asm //; empty section for commonality with l_lx_exec86.asm
section 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_2.ash" #include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.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_2.ash" #define db .byte
#include "arch/i386/lzma_d_2.ash"
cjt32 0 cjt32 0
section LEXEC015 section LEXEC015
@@ -145,22 +149,24 @@ section LEXEC020
#define __NR_write 4 #define __NR_write 4
#define __NR_exit 1 #define __NR_exit 1
#define pushsbli .byte 0x6a, /* push sign-extended byte to long immediate*/
msg_SELinux: msg_SELinux:
push /*byte*/ L71 - L70 pushsbli L71 - L70
pop edx // length pop edx // length
call L71 call L71
L70: L70:
.ascii "PROT_EXEC|PROT_WRITE failed.\n" .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
@@ -177,7 +183,7 @@ unfold:
// 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, 0-PAGE_SIZE and eax, 0-PAGE_SIZE
push eax // destination for 'ret' push eax // destination for 'ret'
@@ -186,14 +192,14 @@ unfold:
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
@@ -214,7 +220,7 @@ unfold:
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
+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"
/* /*
; ============= ; =============
@@ -67,11 +67,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
@@ -135,6 +135,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
@@ -124,11 +124,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
+1 -1
View File
@@ -28,7 +28,7 @@
* John F. Reiser * John F. Reiser
* <jreiser@users.sourceforge.net> * <jreiser@users.sourceforge.net>
*/ */
#include "arch/powerpc/32/regs.h" #include "arch/powerpc/32/ppc_regs.h"
sz_b_info= 12 sz_b_info= 12
sz_unc= 0 sz_unc= 0
+76 -32
View File
@@ -29,12 +29,8 @@
* <jreiser@users.sourceforge.net> * <jreiser@users.sourceforge.net>
*/ */
#include "arch/powerpc/32/regs.h" #include "arch/powerpc/32/ppc_regs.h"
#define section .section
/*__MACOS000__*/
_start: .globl _start
call main # must be exactly 1 instruction; link_register= &decompress
#include "arch/powerpc/32/nrv2e_d.S"
sz_b_info= 12 sz_b_info= 12
sz_unc= 0 sz_unc= 0
@@ -49,29 +45,77 @@ MAP_PRIVATE= 2
MAP_FIXED= 0x10 MAP_FIXED= 0x10
MAP_ANONYMOUS= 0x20 MAP_ANONYMOUS= 0x20
__NR_mmap= 90
PAGE_SHIFT= 12 PAGE_SHIFT= 12
PAGE_SIZE = -(~0<<PAGE_SHIFT) PAGE_SIZE = -(~0<<PAGE_SHIFT)
/* Temporary until we get the buildLoader stuff working ... */
.ascii "\n$Id: UPX (C) 1996-2006 the UPX Team. "
.asciz "All Rights Reserved. http://upx.sf.net $\n"
.p2align 2 # (1<<2)
/* /usr/include/asm-ppc/unistd.h */ /* /usr/include/asm-ppc/unistd.h */
__NR_write = 4 __NR_write = 4
__NR_exit = 1 __NR_exit = 1
__NR_mmap = 90
section ELFMAINX
.balign 4
_start: .globl _start
call main // must be exactly 1 instruction; link_register= &decompress
/* Returns 0 on success; non-zero on failure. */
decompress: // (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method)
section NRV_COMMON
.balign 4
SZ_DLINE=128 # size of data cache line in Apple G5
/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */
#define hibit r0 /* holds 0x80000000 during decompress */
#define src a0
#define lsrc a1
#define dst a2
#define ldst a3 /* Out: actually a reference: &len_dst */
#define meth a4
#define off a4
#define len a5
#define bits a6
#define disp a7
section NRV2E
.balign 4
#include "arch/powerpc/32/nrv2e_d.S"
section NRV2B
.balign 4
#include "arch/powerpc/32/nrv2b_d.S"
#include "arch/powerpc/32/lzma_d.S"
section ELFMAINY
.balign 4
eof_nrv:
#define tmp r0 /* hibit is dead */
lwz tmp,0(ldst) // original dst
mtlr t3 // return address
addi dst,dst,1 // uncorrect for 'stbu'
addi src,src,1 // uncorrect for 'lbzu'
subf dst,tmp,dst // dst -= tmp; // dst length
#undef tmp
subf a0,lsrc,src // src -= eof; // return 0: good; else: bad
stw dst,0(ldst)
ret
msg_SELinux: msg_SELinux:
call L71 call L72
L70: L70:
.asciz "PROT_EXEC|PROT_WRITE failed.\n" .asciz "PROT_EXEC|PROT_WRITE failed.\n"
.p2align 2 # (1<<2)
L71: L71:
li a2,L71 - L70 # length // IDENTSTR goes here
mflr a1 # message text
li a0,2 # fd stderr section ELFMAINZ
.balign 4
L72:
li a2,L71 - L70 // length
mflr a1 // message text
li a0,2 // fd stderr
li 0,__NR_write; sc li 0,__NR_write; sc
die: die:
li a0,127 li a0,127
@@ -79,10 +123,10 @@ die:
/* Decompress the rest of this loader, and jump to it. */ /* Decompress the rest of this loader, and jump to it. */
unfold: unfold:
mflr r30 # &{ b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} mflr r30 // &{ b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...}
li a5,0 # off_t li a5,0 // off_t
li a4,-1 # fd; cater to *BSD for MAP_ANON li a4,-1 // fd; cater to *BSD for MAP_ANON
lwz a0,sz_cpr(r30) lwz a0,sz_cpr(r30)
li a3,MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS li a3,MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS
li a2,PROT_READ | PROT_WRITE | PROT_EXEC li a2,PROT_READ | PROT_WRITE | PROT_EXEC
@@ -90,28 +134,28 @@ unfold:
add a0,a0,r30 add a0,a0,r30
li 0,__NR_mmap li 0,__NR_mmap
addi a0,a0,sz_b_info+PAGE_SIZE-1 addi a0,a0,sz_b_info+PAGE_SIZE-1
rlwinm a0,a0,0,0,31-PAGE_SHIFT # next page boundary after fold rlwinm a0,a0,0,0,31-PAGE_SHIFT // next page boundary after fold
sc; bso- msg_SELinux # Branch if SummaryOverflow (failure) sc; bso- msg_SELinux // Branch if SummaryOverflow (failure)
0: 0:
mtctr r31 mtctr r31
lwz r0,sz_unc(r30)
lbz meth,b_method(r30) lbz meth,b_method(r30)
la ldst,31*4(sp) # &do_not_care la ldst,31*4(sp) // &slot on stack
stw r0,31*4(sp) // lzma uses for EOF
mr dst,a0 mr dst,a0
mtlr a0 # &continuation mtlr a0 // &continuation
lwz lsrc,sz_cpr(r30) lwz lsrc,sz_cpr(r30)
addi src,r30,sz_b_info addi src,r30,sz_b_info
bctr # goto decomrpess; return to link register (mmap'ed page) bctr // goto decomrpess; return to link register (mmap'ed page)
main: main:
stwu r1,-32*4(sp) # allocate space (keeping 0 mod 16), save r1 //// teq r0,r0 // debugging
stmw r2,4(sp) # save registers r2 thru r31 stwu r1,-32*4(sp) // allocate space (keeping 0 mod 16), save r1
mflr r31 # &decompress stmw r2,4(sp) // save registers r2 thru r31
mflr r31 // &decompress
call unfold call unfold
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */ /* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
eof:
/*__XTHEENDX__*/
/* /*
vi:ts=8:et:nowrap vi:ts=8:et:nowrap
*/ */
+33 -28
View File
@@ -1,4 +1,7 @@
#include "arch/powerpc/32/regs.h" #include "arch/powerpc/32/ppc_regs.h"
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 0x20
sz_b_info= 12 sz_b_info= 12
sz_unc= 0 sz_unc= 0
@@ -8,9 +11,9 @@ sz_l_info= 12
sz_p_info= 12 sz_p_info= 12
OVERHEAD= 2048 OVERHEAD= 2048
LINKAREA= 4*4 # SysV C linkage area: (sp, lr); but 16-byte align LINKAREA= 4*4 // SysV C linkage area: (sp, lr); but 16-byte align
/* In: /* In:
r31= &decompress; also 8+ (char *)&(offset to {l_info; p_info; b_info}) r31= &decompress; also 8+ (char *)&(#bytes which preceed &-8(r31)
*/ */
fold_begin: fold_begin:
call L90 call L90
@@ -22,9 +25,9 @@ fold_begin:
a2= envp a2= envp
a3= auxvp a3= auxvp
a4= fini a4= fini
sp= ~0xf & (-2*4 + (void *)&argc) # 0(sp): old_sp, pc sp= ~0xf & (-2*4 + (void *)&argc) // 0(sp): old_sp, pc
Instead, Linux gives only Instead, Linux gives only
sp= &{argc,argv...,0,env...,0,auxv...,strings} # 16-byte aligned? sp= &{argc,argv...,0,env...,0,auxv...,strings} // 16-byte aligned?
We must figure out the rest, particularly auxvp. We must figure out the rest, particularly auxvp.
*/ */
zfind: zfind:
@@ -32,32 +35,34 @@ zfind:
cmpi cr7,t0,0; bne+ cr7,zfind cmpi cr7,t0,0; bne+ cr7,zfind
ret ret
L90: L90:
mflr a5 # &ppcbxx: f_unfilter mflr a5 // &ppcbxx: f_unfilter
lwz a6,0(sp) # sp at execve lwz a6,0(sp) // sp at execve
call zfind # a6= &env call zfind // a6= &env
call zfind # a6= &Elf32_auxv call zfind // a6= &Elf32_auxv
lwz a1,-8(r31) # total size = offset to {l_info; p_info; b_info} lwz a1,-8(r31) // #bytes which preceed -8(r31)
rlwinm r30,a5,0,0,31-12 # r30= &this_page rlwinm r30,a5,0,0,31-12 // r30= &this_page
la a2,-OVERHEAD(sp) # &Elf32_Ehdr temporary space mr a4,r31 // &decompress: f_expand
mr a4,r31 # &decompress: f_expand subf r29,a1,r31 // 8+ (char *)&our_Elf32_Ehdr
subf a0,a1,r31 # &l_info la a2,-OVERHEAD(sp) // &Elf32_Ehdr temporary space
addi r29,r29,-8 // &our_Elf32_Ehdr
addi a1,a1,-(szElf32_Ehdr + 2*szElf32_Phdr)
addi a0,r29,(szElf32_Ehdr + 2*szElf32_Phdr) // &{l_info; p_info; b_info}
addi sp,sp,-(LINKAREA+OVERHEAD) addi sp,sp,-(LINKAREA+OVERHEAD)
rlwinm r29,a0,0,0,31-12 # r29= &our_Elf32_Ehdr lwz a3,sz_unc+sz_p_info+sz_l_info(a0) // sz_elf_headers
lwz a3,sz_unc+sz_p_info+sz_l_info(a0) # sz_elf_headers call upx_main // Out: a0= entry
call upx_main # Out: a0= entry /* entry= upx_main(l_info *a0, total_size a1, Elf32_Ehdr *a2, sz_ehdr a3,
/* entry= upx_main(l_info *a0, total_size a1, Elf32_Ehdr *a2, sz_ehdr a3,
f_decomp a4, f_unf a5, Elf32_auxv_t *a6) f_decomp a4, f_unf a5, Elf32_auxv_t *a6)
*/ */
mr r31,a0 # save &entry mr r31,a0 // save &entry
mr a0,r29 # &our_Elf32_Ehdr mr a0,r29 // &our_Elf32_Ehdr
subf a1,r29,r30 # size subf a1,r29,r30 // size
call munmap # unmap compressed program; /proc/self/exe disappears call munmap // unmap compressed program; /proc/self/exe disappears
mtlr r31 # entry address mtlr r31 // entry address
lmw r2,4+LINKAREA+OVERHEAD(sp) # restore registers r2 thru r31 lmw r2,4+LINKAREA+OVERHEAD(sp) // restore registers r2 thru r31
lwz r1, LINKAREA+OVERHEAD(sp) # restore r1; deallocate space lwz r1, LINKAREA+OVERHEAD(sp) // restore r1; deallocate space
ret # enter /lib/ld.so.1 ret // enter /lib/ld.so.1
SYS_exit= 1 SYS_exit= 1
SYS_fork= 2 SYS_fork= 2
@@ -75,8 +80,8 @@ mmap: .globl mmap
li 0,SYS_mmap li 0,SYS_mmap
sysgo: sysgo:
sc sc
bns+ no_fail # 'bns': branch if No Summary[Overflow] bns+ no_fail // 'bns': branch if No Summary[Overflow]
li a0,-1 # failure; IGNORE errno li a0,-1 // failure; IGNORE errno
no_fail: no_fail:
ret ret
+2 -2
View File
@@ -139,8 +139,8 @@ ERR_LAB
if (h.sz_cpr < h.sz_unc) { // Decompress block if (h.sz_cpr < h.sz_unc) { // Decompress block
nrv_uint out_len = h.sz_unc; // EOF for lzma nrv_uint out_len = h.sz_unc; // EOF for lzma
int const j = (*f_decompress)(xi->buf, h.sz_cpr, xo->buf, &out_len, int const j = (*f_decompress)(xi->buf, h.sz_cpr,
*(int *)(void *)&h.b_method); xo->buf, &out_len, h.b_method);
if (j != 0 || out_len != (nrv_uint)h.sz_unc) if (j != 0 || out_len != (nrv_uint)h.sz_unc)
err_exit(7); err_exit(7);
if (h.b_ftid!=0 && f_unf) { // have filter if (h.b_ftid!=0 && f_unf) { // have filter