From 6e2a41cb260b1cc76b74fb39a41c62f273f573e9 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Fri, 5 May 2017 13:32:42 -0700 Subject: [PATCH] DPRINTF for amd64 modified: Makefile modified: src/amd64-linux.elf-fold.S modified: src/amd64-linux.elf-main.c modified: amd64-linux.elf-fold.h modified: tmp/amd64-linux.elf-fold.map --- src/stub/Makefile | 2 +- src/stub/amd64-linux.elf-fold.h | 206 ++++++++++++------------ src/stub/src/amd64-linux.elf-fold.S | 32 ++-- src/stub/src/amd64-linux.elf-main.c | 219 +++++++++++++++++++++++++- src/stub/tmp/amd64-linux.elf-fold.map | 40 ++--- 5 files changed, 360 insertions(+), 139 deletions(-) diff --git a/src/stub/Makefile b/src/stub/Makefile index ee13a7fe..e633fe03 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -342,7 +342,7 @@ tmp/amd64-darwin.macho-main.o : $(srcdir)/src/$$T.c amd64-linux.elf%.h : tc_list = amd64-linux.elf default amd64-linux.elf%.h : tc_bfdname = elf64-x86-64 -tc.amd64-linux.elf.gcc = amd64-linux-gcc-3.4.4 -m64 -nostdinc -MMD -MT $@ +tc.amd64-linux.elf.gcc = amd64-linux-gcc-3.4.4 -fPIC -m64 -nostdinc -MMD -MT $@ tc.amd64-linux.elf.gcc += -fno-exceptions -fno-asynchronous-unwind-tables tc.amd64-linux.elf.gcc += -Wall -W -Wcast-align -Wcast-qual -Wstrict-prototypes -Wwrite-strings -Werror diff --git a/src/stub/amd64-linux.elf-fold.h b/src/stub/amd64-linux.elf-fold.h index fc7fa35b..2ead5273 100644 --- a/src/stub/amd64-linux.elf-fold.h +++ b/src/stub/amd64-linux.elf-fold.h @@ -1,5 +1,5 @@ /* amd64-linux.elf-fold.h - created from amd64-linux.elf-fold.bin, 2032 (0x7f0) bytes + created from amd64-linux.elf-fold.bin, 2059 (0x80b) bytes This file is part of the UPX executable compressor. @@ -31,20 +31,20 @@ */ -#define STUB_AMD64_LINUX_ELF_FOLD_SIZE 2032 -#define STUB_AMD64_LINUX_ELF_FOLD_ADLER32 0x06e1065d -#define STUB_AMD64_LINUX_ELF_FOLD_CRC32 0xc66d4cda +#define STUB_AMD64_LINUX_ELF_FOLD_SIZE 2059 +#define STUB_AMD64_LINUX_ELF_FOLD_ADLER32 0xee600f10 +#define STUB_AMD64_LINUX_ELF_FOLD_CRC32 0xd07b6c06 -unsigned char stub_amd64_linux_elf_fold[2032] = { +unsigned char stub_amd64_linux_elf_fold[2059] = { /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 2, 0, 62, 0, 1, 0, 0, 0,188, 0, 16, 0, 0, 0, 0, 0, /* 0x0020 */ 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0030 */ 0, 0, 0, 0, 64, 0, 56, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 0x0040 */ 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0050 */ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, -/* 0x0060 */ 240, 7, 0, 0, 0, 0, 0, 0,240, 7, 0, 0, 0, 0, 0, 0, +/* 0x0060 */ 11, 8, 0, 0, 0, 0, 0, 0, 12, 8, 0, 0, 0, 0, 0, 0, /* 0x0070 */ 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -/* 0x0080 */ 240, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0080 */ 11, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0090 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, /* 0x00b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 89, 0, 0, @@ -68,99 +68,101 @@ unsigned char stub_amd64_linux_elf_fold[2032] = { /* 0x01d0 */ 126,248, 76,137,249, 72, 41,225, 72,193,233, 3,243, 72,165, 72, /* 0x01e0 */ 141,103, 8,252, 75,141, 12, 38, 65, 89, 94, 95, 72,139, 68, 36, /* 0x01f0 */ 16, 72,129,236, 0, 8, 0, 0, 72,137,226, 73,137,232, 80,232, -/* 0x0200 */ 90, 4, 0, 0, 90, 72,129,196, 0, 8, 0, 0, 94, 95, 89, 80, -/* 0x0210 */ 106, 11, 88, 65,255,102,248,176, 11,235, 13,176, 10,235, 9,176, -/* 0x0220 */ 12,235, 5,176, 9, 73,137,202, 15,182,192, 15, 5, 72, 61, 0, -/* 0x0230 */ 240,255,255,114, 4, 72,131,200,255,195,176, 0,235,234,176, 2, -/* 0x0240 */ 235,230,176, 3,235,226,176, 60,235,222, 0, 0, 81, 72, 57, 23, -/* 0x0250 */ 76,139, 71, 8, 72,141, 74,255,115, 10,191,127, 0, 0, 0,232, -/* 0x0260 */ 226,255,255,255, 72,131,249,255,116, 17, 65, 15,182, 0, 72,255, -/* 0x0270 */ 201, 73,255,192,136, 6, 72,255,198,235,233, 72, 1, 87, 8, 72, -/* 0x0280 */ 41, 23, 88,195, 65, 85, 73,137,213, 65, 84, 73,137,204, 85, 72, -/* 0x0290 */ 137,253, 83, 72,137,243, 72,131,236, 40, 72,131, 62, 0, 15,132, -/* 0x02a0 */ 226, 0, 0, 0, 72,141,116, 36, 16,186, 12, 0, 0, 0, 72,137, -/* 0x02b0 */ 239,232,150,255,255,255,139, 84, 36, 16,139,116, 36, 20,133,210, -/* 0x02c0 */ 117, 21,129,254, 85, 80, 88, 33,117, 17, 72,131,125, 0, 0, 15, -/* 0x02d0 */ 132,177, 0, 0, 0,235, 4,133,246,117, 10,191,127, 0, 0, 0, -/* 0x02e0 */ 232, 97,255,255,255, 57,214,119,242,137,208, 72, 59, 3,119,235, -/* 0x02f0 */ 57,214, 72,139, 67, 8,115,104,137, 84, 36, 12, 72,139,125, 8, -/* 0x0300 */ 72,141, 76, 36, 12, 68,139, 68, 36, 24, 72,137,194, 65,255,213, -/* 0x0310 */ 133,192,117,199,139,116, 36, 12, 59,116, 36, 16,117,189, 15,182, -/* 0x0320 */ 76, 36, 25,132,201, 15,149,194, 49,192, 77,133,228, 15,149,192, -/* 0x0330 */ 133,194,116, 30,129,254, 0, 2, 0, 0,119, 7,137,240, 72, 57, -/* 0x0340 */ 3,117, 15, 15,182, 84, 36, 26, 15,182,201, 72,139,123, 8, 65, -/* 0x0350 */ 255,212,139, 68, 36, 20, 72, 1, 69, 8, 72, 41, 69, 0,235, 13, -/* 0x0360 */ 137,242, 72,137,239, 72,137,198,232,223,254,255,255,139, 84, 36, -/* 0x0370 */ 16, 72,139, 3, 72, 1, 83, 8, 72, 41,208, 72,133,192, 72,137, -/* 0x0380 */ 3,233, 24,255,255,255, 72,131,196, 40, 91, 93, 65, 92, 65, 93, -/* 0x0390 */ 195, 72,133,255, 73,137,208,116, 41, 72,139, 7,137,241, 72, 57, -/* 0x03a0 */ 200,116, 17, 72,255,200, 15,148,194, 49,192,133,246, 15,149,192, -/* 0x03b0 */ 133,194,116, 8, 72,137, 15, 76,137, 71, 8,195, 72,131,199, 16, -/* 0x03c0 */ 235,215,195, 65, 87,184, 0, 0, 0, 0, 73,137,255, 65, 86, 65, -/* 0x03d0 */ 85, 65, 84, 73,137,252, 85, 83, 72,131,236,104, 76, 3,103, 32, -/* 0x03e0 */ 102,131,127, 16, 3,137, 84, 36, 60, 15,183, 87, 56, 72,137, 76, -/* 0x03f0 */ 36, 48,185, 16, 0, 0, 0, 72,137,116, 36, 64, 76,137, 68, 36, -/* 0x0400 */ 40, 76,137, 76, 36, 32, 15, 68,200, 76,137,230, 72,131,205,255, -/* 0x0410 */ 49,219,131,193, 34,255,202,120, 33,131, 62, 1,117, 22, 72,139, -/* 0x0420 */ 70, 16, 72, 57,232, 72, 15, 66,232, 72, 3, 70, 40, 72, 57,195, -/* 0x0430 */ 72, 15, 66,216, 72,131,198, 56,235,219, 72,129,229, 0,240,255, -/* 0x0440 */ 255, 49,210, 69, 49,201, 72, 41,235, 65,131,200,255, 72,137,239, -/* 0x0450 */ 72,129,195,255, 15, 0, 0, 72,129,227, 0,240,255,255, 72,137, -/* 0x0460 */ 222,232,189,253,255,255, 72,141, 20, 24, 72, 41,232,102, 65,131, -/* 0x0470 */ 127, 56, 0, 72,137, 68, 36, 24,199, 68, 36, 20, 0, 0, 0, 0, -/* 0x0480 */ 72,137, 84, 36, 72, 15,132,155, 1, 0, 0, 72,131,124, 36, 64, -/* 0x0490 */ 0,116, 37, 65,131, 60, 36, 6,117, 30, 72,139, 84, 36, 24, 73, -/* 0x04a0 */ 3, 84, 36, 16,190, 3, 0, 0, 0, 72,139,124, 36, 48,232,222, -/* 0x04b0 */ 254,255,255,233, 87, 1, 0, 0, 65,131, 60, 36, 1, 15,133, 76, -/* 0x04c0 */ 1, 0, 0, 72,139, 68, 36, 24, 73, 3, 68, 36, 16, 65,190, 64, -/* 0x04d0 */ 98, 81,115, 65,139, 76, 36, 4, 65,131,200,255, 73,139, 84, 36, -/* 0x04e0 */ 32, 72,137,197, 72,137, 68, 36, 88, 73,139, 68, 36, 40,131,225, -/* 0x04f0 */ 7, 72,137,235, 72,137, 84, 36, 80,193,225, 2,129,227,255, 15, -/* 0x0500 */ 0, 0, 72, 1,232, 65,211,238, 72, 41,221, 72,137, 68, 36, 8, -/* 0x0510 */ 73,139, 68, 36, 8, 65,131,230, 7, 76,141, 44, 26,185, 50, 0, -/* 0x0520 */ 0, 0, 72, 41,216, 72,131,124, 36, 64, 0,117, 7, 68,139, 68, -/* 0x0530 */ 36, 60,177, 18, 68,137,242, 73,137,193, 76,137,238,131,202, 2, -/* 0x0540 */ 72,131,124, 36, 64, 0, 72,137,239, 65, 15, 68,214,232,209,252, -/* 0x0550 */ 255,255, 72, 57,197,117,121, 72,131,124, 36, 64, 0,116, 25, 72, -/* 0x0560 */ 139, 76, 36, 32, 72,139, 84, 36, 40, 72,141,116, 36, 80, 72,139, -/* 0x0570 */ 124, 36, 64,232, 12,253,255,255, 76,137,235, 72,247,219,129,227, -/* 0x0580 */ 255, 15, 0, 0, 65,246,198, 2,116, 13, 74,141,124, 45, 0, 49, -/* 0x0590 */ 192, 72,137,217,252,243,170, 72,131,124, 36, 64, 0,116, 59, 73, -/* 0x05a0 */ 131,124, 36, 8, 0,117, 23, 72,139,124, 36, 48, 72,141, 85, 12, -/* 0x05b0 */ 199, 69, 12, 15, 5,195,144, 49,246,232,211,253,255,255, 68,137, -/* 0x05c0 */ 242, 76,137,238, 72,137,239,232, 79,252,255,255,133,192,116, 10, -/* 0x05d0 */ 191,127, 0, 0, 0,232,108,252,255,255, 73,141, 68, 29, 0, 72, -/* 0x05e0 */ 1,197, 72, 59,108, 36, 8,115, 38, 72, 41,108, 36, 8, 69, 49, -/* 0x05f0 */ 201, 65,131,200,255, 72,139,116, 36, 8,185, 50, 0, 0, 0, 68, -/* 0x0600 */ 137,242, 72,137,239,232, 25,252,255,255, 72, 57,197,117,193,255, -/* 0x0610 */ 68, 36, 20, 65, 15,183, 71, 56, 73,131,196, 56, 57, 68, 36, 20, -/* 0x0620 */ 15,140,101,254,255,255, 72,131,188, 36,160, 0, 0, 0, 0,116, -/* 0x0630 */ 16, 72,139, 68, 36, 24, 72,139,148, 36,160, 0, 0, 0, 72,137, -/* 0x0640 */ 2, 73,139, 87, 24, 72, 1, 84, 36, 24, 72,139, 68, 36, 24, 72, -/* 0x0650 */ 131,196,104, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95,195, 65, 87, -/* 0x0660 */ 77,137,207, 65, 86, 65, 85, 77,137,197, 65, 84, 73,137,212, 85, -/* 0x0670 */ 72,141,106, 64, 83, 72,137,203, 49,201, 72,131,236, 56,139, 7, -/* 0x0680 */ 72,137, 52, 36, 72,137,116, 36, 16, 72,141,116, 36, 32, 72,137, -/* 0x0690 */ 84, 36, 40, 72,137,124, 36, 8, 76,137,194, 72,137,124, 36, 24, -/* 0x06a0 */ 72,137,231, 72,137, 68, 36, 32,232,215,251,255,255, 72,139, 85, -/* 0x06b0 */ 16,190, 3, 0, 0, 0, 72,137,223,232,211,252,255,255, 73, 15, -/* 0x06c0 */ 183, 84, 36, 56,190, 5, 0, 0, 0, 72,137,223,232,192,252,255, -/* 0x06d0 */ 255, 69, 15,183,116, 36, 16, 65,131,254, 3,117, 62, 72,139, 84, -/* 0x06e0 */ 36,112, 73, 3, 84, 36, 24,190, 9, 0, 0, 0,102, 65,199, 68, -/* 0x06f0 */ 36, 16, 2, 0, 72,137,223,232,149,252,255,255, 65, 15,183, 68, -/* 0x0700 */ 36, 56,133,192,116, 21, 72,139, 84, 36,112, 72, 1, 85, 16, 72, -/* 0x0710 */ 1, 85, 24, 72,131,197, 56,255,200,117,240, 65, 83, 77,137,249, -/* 0x0720 */ 77,137,232, 49,210, 72,137,217, 72,141, 68, 36,120, 72,141,116, -/* 0x0730 */ 36, 24, 76,137,231, 80,232,136,252,255,255, 65, 89, 65,131,254, -/* 0x0740 */ 3, 73,137,197, 65, 90,116, 16, 72,137,194,190, 9, 0, 0, 0, -/* 0x0750 */ 72,137,223,232, 57,252,255,255, 69, 49,246,102, 65,131,124, 36, -/* 0x0760 */ 56, 0, 73,141,108, 36, 64,116,117,131,125, 0, 3,117, 93, 72, -/* 0x0770 */ 139,124, 36,112, 72, 3,125, 16, 49,210, 49,246,232,189,250,255, -/* 0x0780 */ 255,133,192,137,195,120, 23,186, 0, 4, 0, 0, 76,137,230,137, -/* 0x0790 */ 199,232,164,250,255,255, 72, 61, 0, 4, 0, 0,116, 10,191,127, -/* 0x07a0 */ 0, 0, 0,232,158,250,255,255, 65, 80, 49,246, 69, 49,201, 69, -/* 0x07b0 */ 49,192, 49,201,106, 0,137,218, 76,137,231,232, 3,252,255,255, -/* 0x07c0 */ 137,223, 73,137,197,232,120,250,255,255, 94, 95, 65, 15,183, 68, -/* 0x07d0 */ 36, 56, 65,255,198, 72,131,197, 56, 65, 57,198,114,139, 72,131, -/* 0x07e0 */ 196, 56, 76,137,232, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95,195 +/* 0x0200 */ 94, 4, 0, 0, 90, 72,129,196, 0, 8, 0, 0, 94, 95, 89, 80, +/* 0x0210 */ 106, 11, 88, 65,255,102,248,176, 9, 73,137,202, 15,182,192, 15, +/* 0x0220 */ 5, 72, 61, 0,240,255,255,114, 4, 72,131,200,255,195,176, 60, +/* 0x0230 */ 235, 2,176, 12,235, 2,176, 3,235, 2,176, 2,235, 2,176, 11, +/* 0x0240 */ 235, 2,176, 10,235, 2,176, 1,235, 2,176, 0,235,206, 0, 0, +/* 0x0250 */ 81, 72, 57, 23, 76,139, 71, 8, 72,141, 74,255,115, 10,191,127, +/* 0x0260 */ 0, 0, 0,232,198,255,255,255, 72,131,249,255,116, 17, 65, 15, +/* 0x0270 */ 182, 0, 72,255,201, 73,255,192,136, 6, 72,255,198,235,233, 72, +/* 0x0280 */ 1, 87, 8, 72, 41, 23, 88,195, 65, 85, 73,137,213, 65, 84, 73, +/* 0x0290 */ 137,204, 85, 72,137,253, 83, 72,137,243, 72,131,236, 40, 72,131, +/* 0x02a0 */ 62, 0, 15,132,226, 0, 0, 0, 72,141,116, 36, 16,186, 12, 0, +/* 0x02b0 */ 0, 0, 72,137,239,232,150,255,255,255,139, 84, 36, 16,139,116, +/* 0x02c0 */ 36, 20,133,210,117, 21,129,254, 85, 80, 88, 33,117, 17, 72,131, +/* 0x02d0 */ 125, 0, 0, 15,132,177, 0, 0, 0,235, 4,133,246,117, 10,191, +/* 0x02e0 */ 127, 0, 0, 0,232, 69,255,255,255, 57,214,119,242,137,208, 72, +/* 0x02f0 */ 59, 3,119,235, 57,214, 72,139, 67, 8,115,104,137, 84, 36, 12, +/* 0x0300 */ 72,139,125, 8, 72,141, 76, 36, 12, 68,139, 68, 36, 24, 72,137, +/* 0x0310 */ 194, 65,255,213,133,192,117,199,139,116, 36, 12, 59,116, 36, 16, +/* 0x0320 */ 117,189, 15,182, 76, 36, 25,132,201, 15,149,194, 49,192, 77,133, +/* 0x0330 */ 228, 15,149,192,133,194,116, 30,129,254, 0, 2, 0, 0,119, 7, +/* 0x0340 */ 137,240, 72, 57, 3,117, 15, 15,182, 84, 36, 26, 15,182,201, 72, +/* 0x0350 */ 139,123, 8, 65,255,212,139, 68, 36, 20, 72, 1, 69, 8, 72, 41, +/* 0x0360 */ 69, 0,235, 13,137,242, 72,137,239, 72,137,198,232,223,254,255, +/* 0x0370 */ 255,139, 84, 36, 16, 72,139, 3, 72, 1, 83, 8, 72, 41,208, 72, +/* 0x0380 */ 133,192, 72,137, 3,233, 24,255,255,255, 72,131,196, 40, 91, 93, +/* 0x0390 */ 65, 92, 65, 93,195, 72,133,255, 73,137,208,116, 41, 72,139, 7, +/* 0x03a0 */ 137,241, 72, 57,200,116, 17, 72,255,200, 15,148,194, 49,192,133, +/* 0x03b0 */ 246, 15,149,192,133,194,116, 8, 72,137, 15, 76,137, 71, 8,195, +/* 0x03c0 */ 72,131,199, 16,235,215,195, 65, 87,184, 0, 0, 0, 0, 73,137, +/* 0x03d0 */ 255, 65, 86, 65, 85, 65, 84, 73,137,252, 85, 83, 72,131,236,104, +/* 0x03e0 */ 76, 3,103, 32,102,131,127, 16, 3,137, 84, 36, 60, 15,183, 87, +/* 0x03f0 */ 56, 72,137, 76, 36, 48,185, 16, 0, 0, 0, 72,137,116, 36, 64, +/* 0x0400 */ 76,137, 68, 36, 40, 76,137, 76, 36, 32, 15, 68,200, 76,137,230, +/* 0x0410 */ 72,131,205,255, 49,219,131,193, 34,255,202,120, 33,131, 62, 1, +/* 0x0420 */ 117, 22, 72,139, 70, 16, 72, 57,232, 72, 15, 66,232, 72, 3, 70, +/* 0x0430 */ 40, 72, 57,195, 72, 15, 66,216, 72,131,198, 56,235,219, 72,129, +/* 0x0440 */ 229, 0,240,255,255, 49,210, 69, 49,201, 72, 41,235, 65,131,200, +/* 0x0450 */ 255, 72,137,239, 72,129,195,255, 15, 0, 0, 72,129,227, 0,240, +/* 0x0460 */ 255,255, 72,137,222,232,173,253,255,255, 72,141, 20, 24, 72, 41, +/* 0x0470 */ 232,102, 65,131,127, 56, 0, 72,137, 68, 36, 24,199, 68, 36, 20, +/* 0x0480 */ 0, 0, 0, 0, 72,137, 84, 36, 72, 15,132,155, 1, 0, 0, 72, +/* 0x0490 */ 131,124, 36, 64, 0,116, 37, 65,131, 60, 36, 6,117, 30, 72,139, +/* 0x04a0 */ 84, 36, 24, 73, 3, 84, 36, 16,190, 3, 0, 0, 0, 72,139,124, +/* 0x04b0 */ 36, 48,232,222,254,255,255,233, 87, 1, 0, 0, 65,131, 60, 36, +/* 0x04c0 */ 1, 15,133, 76, 1, 0, 0, 72,139, 68, 36, 24, 73, 3, 68, 36, +/* 0x04d0 */ 16, 65,190, 64, 98, 81,115, 65,139, 76, 36, 4, 65,131,200,255, +/* 0x04e0 */ 73,139, 84, 36, 32, 72,137,197, 72,137, 68, 36, 88, 73,139, 68, +/* 0x04f0 */ 36, 40,131,225, 7, 72,137,235, 72,137, 84, 36, 80,193,225, 2, +/* 0x0500 */ 129,227,255, 15, 0, 0, 72, 1,232, 65,211,238, 72, 41,221, 72, +/* 0x0510 */ 137, 68, 36, 8, 73,139, 68, 36, 8, 65,131,230, 7, 76,141, 44, +/* 0x0520 */ 26,185, 50, 0, 0, 0, 72, 41,216, 72,131,124, 36, 64, 0,117, +/* 0x0530 */ 7, 68,139, 68, 36, 60,177, 18, 68,137,242, 73,137,193, 76,137, +/* 0x0540 */ 238,131,202, 2, 72,131,124, 36, 64, 0, 72,137,239, 65, 15, 68, +/* 0x0550 */ 214,232,193,252,255,255, 72, 57,197,117,121, 72,131,124, 36, 64, +/* 0x0560 */ 0,116, 25, 72,139, 76, 36, 32, 72,139, 84, 36, 40, 72,141,116, +/* 0x0570 */ 36, 80, 72,139,124, 36, 64,232, 12,253,255,255, 76,137,235, 72, +/* 0x0580 */ 247,219,129,227,255, 15, 0, 0, 65,246,198, 2,116, 13, 74,141, +/* 0x0590 */ 124, 45, 0, 49,192, 72,137,217,252,243,170, 72,131,124, 36, 64, +/* 0x05a0 */ 0,116, 59, 73,131,124, 36, 8, 0,117, 23, 72,139,124, 36, 48, +/* 0x05b0 */ 72,141, 85, 12,199, 69, 12, 15, 5,195,144, 49,246,232,211,253, +/* 0x05c0 */ 255,255, 68,137,242, 76,137,238, 72,137,239,232,114,252,255,255, +/* 0x05d0 */ 133,192,116, 10,191,127, 0, 0, 0,232, 80,252,255,255, 73,141, +/* 0x05e0 */ 68, 29, 0, 72, 1,197, 72, 59,108, 36, 8,115, 38, 72, 41,108, +/* 0x05f0 */ 36, 8, 69, 49,201, 65,131,200,255, 72,139,116, 36, 8,185, 50, +/* 0x0600 */ 0, 0, 0, 68,137,242, 72,137,239,232, 9,252,255,255, 72, 57, +/* 0x0610 */ 197,117,193,255, 68, 36, 20, 65, 15,183, 71, 56, 73,131,196, 56, +/* 0x0620 */ 57, 68, 36, 20, 15,140,101,254,255,255, 72,131,188, 36,160, 0, +/* 0x0630 */ 0, 0, 0,116, 16, 72,139, 68, 36, 24, 72,139,148, 36,160, 0, +/* 0x0640 */ 0, 0, 72,137, 2, 73,139, 87, 24, 72, 1, 84, 36, 24, 72,139, +/* 0x0650 */ 68, 36, 24, 72,131,196,104, 91, 93, 65, 92, 65, 93, 65, 94, 65, +/* 0x0660 */ 95,195, 65, 87, 77,137,207, 65, 86, 73,137,206, 49,201, 65, 85, +/* 0x0670 */ 77,137,197, 65, 84, 85, 72,137,213, 83, 72,141, 90, 64, 72,131, +/* 0x0680 */ 236, 56,139, 7, 72,137, 52, 36, 72,137,116, 36, 16, 72,141,116, +/* 0x0690 */ 36, 32, 72,137, 84, 36, 40, 72,137,124, 36, 8, 76,137,194, 72, +/* 0x06a0 */ 137,124, 36, 24, 72,137,231, 72,137, 68, 36, 32,232,215,251,255, +/* 0x06b0 */ 255, 72,139, 83, 16,190, 3, 0, 0, 0, 76,137,247,232,211,252, +/* 0x06c0 */ 255,255, 72, 15,183, 85, 56,190, 5, 0, 0, 0, 76,137,247,232, +/* 0x06d0 */ 193,252,255,255, 68, 15,183,101, 16, 65,131,252, 3,117, 57, 72, +/* 0x06e0 */ 139, 84, 36,112, 72, 3, 85, 24,190, 9, 0, 0, 0,102,199, 69, +/* 0x06f0 */ 16, 2, 0, 76,137,247,232,154,252,255,255, 15,183, 69, 56,133, +/* 0x0700 */ 192,116, 21, 72,139, 84, 36,112, 72, 1, 83, 16, 72, 1, 83, 24, +/* 0x0710 */ 72,131,195, 56,255,200,117,240, 65, 83, 77,137,249, 77,137,232, +/* 0x0720 */ 49,210, 76,137,241, 72,141, 68, 36,120, 72,141,116, 36, 24, 72, +/* 0x0730 */ 137,239, 80,232,143,252,255,255, 65, 89, 65,131,252, 3, 73,137, +/* 0x0740 */ 197, 65, 90,116, 16, 72,137,194,190, 9, 0, 0, 0, 76,137,247, +/* 0x0750 */ 232, 64,252,255,255, 69, 49,255,102,131,125, 56, 0, 72,141, 93, +/* 0x0760 */ 64, 15,132,146, 0, 0, 0,131, 59, 3,117,121, 72,139,124, 36, +/* 0x0770 */ 112, 72, 3,123, 16, 49,210, 49,246,232,188,250,255,255,133,192, +/* 0x0780 */ 65,137,196,120, 23,186, 0, 4, 0, 0, 72,137,238,137,199,232, +/* 0x0790 */ 182,250,255,255, 72, 61, 0, 4, 0, 0,116, 10,191,127, 0, 0, +/* 0x07a0 */ 0,232,136,250,255,255, 65, 80, 69, 49,201, 69, 49,192, 49,201, +/* 0x07b0 */ 68,137,226, 72,141, 68, 36,120, 49,246, 72,137,239, 80,232, 4, +/* 0x07c0 */ 252,255,255, 72,139,148, 36,128, 0, 0, 0,190, 7, 0, 0, 0, +/* 0x07d0 */ 76,137,247, 73,137,197,232,186,251,255,255, 68,137,231,232, 83, +/* 0x07e0 */ 250,255,255, 94, 95, 15,183, 69, 56, 65,255,199, 72,131,195, 56, +/* 0x07f0 */ 65, 57,199, 15,130,110,255,255,255, 72,131,196, 56, 76,137,232, +/* 0x0800 */ 91, 93, 65, 92, 65, 93, 65, 94, 65, 95,195 }; diff --git a/src/stub/src/amd64-linux.elf-fold.S b/src/stub/src/amd64-linux.elf-fold.S index 0fbe595f..9fb8b5d5 100644 --- a/src/stub/src/amd64-linux.elf-fold.S +++ b/src/stub/src/amd64-linux.elf-fold.S @@ -54,6 +54,7 @@ MAX_ELF_HDR=1024 /* 64-bit mode only! */ __NR_read= 0 +__NR_write= 1 __NR_open= 2 __NR_close= 3 @@ -71,6 +72,7 @@ __NR_readlink= 89 %rsp= &{LENX,ADRX,LENU,ADRU,slide,argc,argv...,0,env...,0,auxv...,0...,strings} */ fold_begin: +//// int3 // DEBUG only call L90 # push &L90a L90a: .asciz "/proc/self/exe" @@ -166,13 +168,6 @@ L90: push $ __NR_munmap; pop %rax jmp *-8(%r14) # goto: syscall; ret -munmap: .globl munmap - movb $ __NR_munmap,%al; jmp sysgo -mprotect: .globl mprotect - movb $ __NR_mprotect,%al; jmp sysgo -brk: .globl brk - movb $ __NR_brk,%al; jmp sysgo - mmap: .globl mmap movb $ __NR_mmap,%al sysarg4: @@ -185,14 +180,21 @@ sysgo: # NOTE: kernel demands 4th arg in %sys4, NOT %arg4 no_fail: ret -read: .globl read - movb $ __NR_read,%al; jmp sysgo -open: .globl open - movb $ __NR_open,%al; jmp sysgo -close: .globl close - movb $ __NR_close,%al; jmp sysgo - exit: .globl exit - movb $ __NR_exit,%al; jmp sysgo + movb $ __NR_exit,%al; 5: jmp 5f +brk: .globl brk + movb $ __NR_brk,%al; 5: jmp 5f +close: .globl close + movb $ __NR_close,%al; 5: jmp 5f +open: .globl open + movb $ __NR_open,%al; 5: jmp 5f +munmap: .globl munmap + movb $ __NR_munmap,%al; 5: jmp 5f +mprotect: .globl mprotect + movb $ __NR_mprotect,%al; 5: jmp 5f +write: .globl write + mov $__NR_write,%al; 5: jmp 5f +read: .globl read + movb $ __NR_read,%al; 5: jmp sysgo /* vim:set ts=8 sw=8 et: */ diff --git a/src/stub/src/amd64-linux.elf-main.c b/src/stub/src/amd64-linux.elf-main.c index 625114ad..0163f57c 100644 --- a/src/stub/src/amd64-linux.elf-main.c +++ b/src/stub/src/amd64-linux.elf-main.c @@ -32,6 +32,41 @@ #include "include/linux.h" +#ifndef DEBUG //{ +#define DEBUG 0 +#endif //} + +#if !DEBUG //{ +#define DPRINTF(fmt, args...) /*empty*/ +#else //}{ +// DPRINTF is defined as an expression using "({ ... })" +// so that DPRINTF can be invoked inside an expression, +// and then followed by a comma to ignore the return value. +// The only complication is that percent and backslash +// must be doubled in the format string, because the format +// string is processd twice: once at compile-time by 'asm' +// to produce the assembled value, and once at runtime to use it. +#if defined(__powerpc__) //{ +#define DPRINTF(fmt, args...) ({ \ + char const *r_fmt; \ + asm("bl 0f; .string \"" fmt "\"; .balign 4; 0: mflr %0" \ +/*out*/ : "=r"(r_fmt) \ +/* in*/ : \ +/*und*/ : "lr"); \ + dprintf(r_fmt, args); \ +}) +#elif defined(__x86_64) //{ +#define DPRINTF(fmt, args...) ({ \ + char const *r_fmt; \ + asm("call 0f; .asciz \"" fmt "\"; 0: pop %0" \ +/*out*/ : "=r"(r_fmt) ); \ + dprintf(r_fmt, args); \ +}) +#endif //} + +static int dprintf(char const *fmt, ...); // forward +#endif /*}*/ + /************************************************************************* // configuration section @@ -176,8 +211,11 @@ upx_bzero(char *p, size_t len) static void auxv_up(Elf64_auxv_t *av, unsigned const type, uint64_t const value) { - if (av) + if (!av) + return; + DPRINTF("\\nauxv_up %%d %%p\\n", type, value); for (;; ++av) { + DPRINTF(" %%d %%p\\n", av->a_type, av->a_un.a_val); if (av->a_type==type || (av->a_type==AT_IGNORE && type!=AT_NULL)) { av->a_type = type; av->a_un.a_val = value; @@ -373,7 +411,8 @@ upx_main( // returns entry address ERR_LAB err_exit(19); } - entry = do_xmap(ehdr, 0, fdi, 0, 0, 0, 0); + entry = do_xmap(ehdr, 0, fdi, 0, 0, 0, &reloc); + auxv_up(av, AT_BASE, reloc); close(fdi); } } @@ -381,4 +420,180 @@ ERR_LAB return (void *)entry; } +#if DEBUG //{ + +#if defined(__powerpc64__) //{ +#define __NR_write 4 + +typedef unsigned long size_t; + +#if 0 //{ +static int +write(int fd, char const *ptr, size_t len) +{ + register int sys asm("r0") = __NR_write; + register int a0 asm("r3") = fd; + register void const *a1 asm("r4") = ptr; + register size_t const a2 asm("r5") = len; + __asm__ __volatile__("sc" + : "=r"(a0) + : "r"(sys), "r"(a0), "r"(a1), "r"(a2) + : "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13" + ); + return a0; +} +#else //}{ +static int +write(int fd, char const *ptr, size_t len) +{ + register int sys asm("r0") = __NR_write; + register int a0 asm("r3") = fd; + register void const *a1 asm("r4") = ptr; + register size_t a2 asm("r5") = len; + __asm__ __volatile__("sc" + : "+r"(sys), "+r"(a0), "+r"(a1), "+r"(a2) + : + : "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13" + ); + return a0; +} +#endif //} +#endif //} + +#if defined(__i386__) /*{*/ +#define PIC_STRING(value, var) \ + __asm__ __volatile__ ( \ + "call 0f; .asciz \"" value "\"; \ + 0: pop %0;" : "=r"(var) : \ + ) +#elif defined(__arm__) /*}{*/ +#define PIC_STRING(value, var) \ + __asm__ __volatile__ ( \ + "mov %0,pc; b 0f; \ + .asciz \"" value "\"; .balign 4; \ + 0: " : "=r"(var) \ + ) +#elif defined(__mips__) /*}{*/ +#define PIC_STRING(value, var) \ + __asm__ __volatile__ ( \ + ".set noreorder; bal 0f; move %0,$31; .set reorder; \ + .asciz \"" value "\"; .balign 4; \ + 0: " \ + : "=r"(var) : : "ra" \ + ) +#elif defined(__powerpc__) || defined(__powerpc64__) /*}{*/ +#define PIC_STRING(value,var) \ + __asm__ ( \ + "bl 0f; .asciz \"" value "\"; .balign 4; \ + 0: mflr %0" \ + : "=r"(var) : \ + ) +#endif /*}*/ + +static int +unsimal(unsigned x, char *ptr, int n) +{ + unsigned m = 10; + while (10 <= (x / m)) m *= 10; + while (10 <= x) { + unsigned d = x / m; + x -= m * d; + m /= 10; + ptr[n++] = '0' + d; + } + ptr[n++] = '0' + x; + return n; +} + +static int +decimal(int x, char *ptr, int n) +{ + if (x < 0) { + x = -x; + ptr[n++] = '-'; + } + return unsimal(x, ptr, n); +} + +static int +heximal(unsigned long x, char *ptr, int n) +{ + unsigned j = -1+ 2*sizeof(unsigned long); + unsigned long m = 0xful << (4 * j); + for (; j; --j, m >>= 4) { // omit leading 0 digits + if (m & x) break; + } + for (; m; --j, m >>= 4) { + unsigned d = 0xf & (x >> (4 * j)); + ptr[n++] = ((10<=d) ? ('a' - 10) : '0') + d; + } + return n; +} + +#define va_arg __builtin_va_arg +#define va_end __builtin_va_end +#define va_list __builtin_va_list +#define va_start __builtin_va_start + +static int +dprintf(char const *fmt, ...) +{ + int n= 0; + char const *literal = 0; // NULL + char buf[24]; // ~0ull == 18446744073709551615 ==> 20 chars + va_list va; va_start(va, fmt); + for (;;) { + char c = *fmt++; + if (!c) { // end of fmt + if (literal) { + goto finish; + } + break; // goto done + } + if ('%'!=c) { + if (!literal) { + literal = fmt; // 1 beyond start of literal + } + continue; + } + // '%' == c + if (literal) { +finish: + n += write(2, -1+ literal, fmt - literal); + literal = 0; // NULL + if (!c) { // fmt already ended + break; // goto done + } + } + switch (c= *fmt++) { // deficiency: does not handle _long_ + default: { // un-implemented conversion + n+= write(2, -1+ fmt, 1); + } break; + case 0: { // fmt ends with "%\0" ==> ignore + goto done; + } break; + case 'u': { + n+= write(2, buf, unsimal(va_arg(va, unsigned), buf, 0)); + } break; + case 'd': { + n+= write(2, buf, decimal(va_arg(va, int), buf, 0)); + } break; + case 'p': { + buf[0] = '0'; + buf[1] = 'x'; + n+= write(2, buf, heximal((unsigned long)va_arg(va, void *), buf, 2)); + } break; + case 'x': { + buf[0] = '0'; + buf[1] = 'x'; + n+= write(2, buf, heximal(va_arg(va, int), buf, 2)); + } break; + } // 'switch' + } +done: + va_end(va); + return n; + } +#endif //} + /* vim:set ts=4 sw=4 et: */ diff --git a/src/stub/tmp/amd64-linux.elf-fold.map b/src/stub/tmp/amd64-linux.elf-fold.map index 53c1e7c1..d68f76d6 100644 --- a/src/stub/tmp/amd64-linux.elf-fold.map +++ b/src/stub/tmp/amd64-linux.elf-fold.map @@ -8,31 +8,33 @@ Linker script and memory map 0x00000000001000bc . = ((0x100000 + SIZEOF_HEADERS) + 0xc) -.text 0x00000000001000bc 0x734 +.text 0x00000000001000bc 0x750 *(.text) - .text 0x00000000001000bc 0x18e tmp/amd64-linux.elf-fold.o - 0x0000000000100217 munmap - 0x0000000000100223 mmap - 0x000000000010023a read - 0x0000000000100246 exit - 0x000000000010021f brk - 0x000000000010023e open - 0x000000000010021b mprotect - 0x0000000000100242 close - *fill* 0x000000000010024a 0x2 00 - .text 0x000000000010024c 0x5a4 tmp/amd64-linux.elf-main.o - 0x000000000010065e upx_main + .text 0x00000000001000bc 0x192 tmp/amd64-linux.elf-fold.o + 0x000000000010023e munmap + 0x0000000000100217 mmap + 0x0000000000100246 write + 0x000000000010024a read + 0x000000000010022e exit + 0x0000000000100232 brk + 0x000000000010023a open + 0x0000000000100242 mprotect + 0x0000000000100236 close + *fill* 0x000000000010024e 0x2 00 + .text 0x0000000000100250 0x5bb tmp/amd64-linux.elf-main.o + 0x0000000000100662 upx_main *(.data) - .data 0x00000000001007f0 0x0 tmp/amd64-linux.elf-fold.o - .data 0x00000000001007f0 0x0 tmp/amd64-linux.elf-main.o + *fill* 0x000000000010080b 0x1 00 + .data 0x000000000010080c 0x0 tmp/amd64-linux.elf-fold.o + .data 0x000000000010080c 0x0 tmp/amd64-linux.elf-main.o .data -.bss 0x00000000001007f0 0x0 - .bss 0x00000000001007f0 0x0 tmp/amd64-linux.elf-fold.o - .bss 0x00000000001007f0 0x0 tmp/amd64-linux.elf-main.o +.bss 0x000000000010080c 0x0 + .bss 0x000000000010080c 0x0 tmp/amd64-linux.elf-fold.o + .bss 0x000000000010080c 0x0 tmp/amd64-linux.elf-main.o -.rela.dyn 0x00000000001007f0 0x0 +.rela.dyn 0x0000000000100810 0x0 .rela.text 0x0000000000000000 0x0 tmp/amd64-linux.elf-fold.o LOAD tmp/amd64-linux.elf-fold.o LOAD tmp/amd64-linux.elf-main.o