1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

win64/pe: uncompression seems to work; tls handling improvement

This commit is contained in:
László Molnár 2013-08-26 22:07:55 +02:00
parent 241834029a
commit 6c64b06453
5 changed files with 896 additions and 878 deletions

View File

@ -695,6 +695,7 @@ void PackW64Pep::buildLoader(const Filter *ft)
"PEMAIN10", "PEMAIN10",
NULL NULL
); );
addLoader(tmp_tlsindex ? "PETLSHAK2" : "");
if (ft->id) if (ft->id)
{ {
const unsigned texv = ih.codebase - rvamin; const unsigned texv = ih.codebase - rvamin;
@ -1509,8 +1510,7 @@ void PackW64Pep::rebuildImports(upx_byte *& extrainfo)
} }
im->iat = iatoffs; im->iat = iatoffs;
// LE32 *newiat = (LE32 *) (Obuf + iatoffs); OPTR_I(LE64, newiat, (LE64 *) (Obuf + iatoffs));
OPTR_I(LE32, newiat, (LE32 *) (Obuf + iatoffs));
// restore the imported names+ordinals // restore the imported names+ordinals
for (p += 8; *p; ++newiat) for (p += 8; *p; ++newiat)
@ -1528,21 +1528,21 @@ void PackW64Pep::rebuildImports(upx_byte *& extrainfo)
} }
else else
{ {
OCHECK(Obuf + *newiat + 2, ilen + 1); OCHECK(Obuf + (*newiat + 2), ilen + 1);
strcpy(Obuf + *newiat + 2, p); strcpy(Obuf + (*newiat + 2), p);
} }
p += ilen; p += ilen;
} }
else if (*p == 0xff) else if (*p == 0xff)
{ {
*newiat = get_le16(p + 1) + 0x80000000; *newiat = get_le16(p + 1) + (1ULL << 63);
//;;;printf(" %x",(unsigned)*newiat); //;;;printf(" %llx",(unsigned long long)*newiat);
p += 3; p += 3;
} }
else else
{ {
*newiat = get_le32(get_le32(p + 1) + import); *newiat = get_le64(get_le32(p + 1) + import);
assert(*newiat & 0x80000000); assert(*newiat & (1ULL << 63));
p += 5; p += 5;
} }
*newiat = 0; *newiat = 0;

View File

@ -1503,7 +1503,7 @@ void PepFile::rebuildRelocs(upx_byte *& extrainfo)
// upx_byte *p = rdata; // upx_byte *p = rdata;
OPTR_I(upx_byte, p, rdata); OPTR_I(upx_byte, p, rdata);
MemBuffer wrkmem; MemBuffer wrkmem;
unsigned relocn = unoptimizeReloc32(&rdata,obuf,&wrkmem,1); unsigned relocn = unoptimizeReloc64(&rdata,obuf,&wrkmem,1);
unsigned r16 = 0; unsigned r16 = 0;
if (big & 6) // 16 bit relocations if (big & 6) // 16 bit relocations
{ {
@ -1532,8 +1532,8 @@ void PepFile::rebuildRelocs(upx_byte *& extrainfo)
for (unsigned ic = 0; ic < relocn; ic++) for (unsigned ic = 0; ic < relocn; ic++)
{ {
p = obuf + get_le32(wrkmem + 4 * ic); p = obuf + get_le32(wrkmem + 4 * ic);
set_le32(p, get_le32((unsigned char *)p) + oh.imagebase + rvamin); set_le64(p, get_le64((unsigned char *)p) + oh.imagebase + rvamin);
rel.add(rvamin + get_le32(wrkmem + 4 * ic),3); rel.add(rvamin + get_le32(wrkmem + 4 * ic),10);
} }
rel.finish (oxrelocs,soxrelocs); rel.finish (oxrelocs,soxrelocs);

File diff suppressed because it is too large Load Diff

View File

@ -92,10 +92,10 @@ section PEICONS1
section PEICONS2 section PEICONS2
add [rdi + icon_offset], IMM16(icon_delta) add [rdi + icon_offset], IMM16(icon_delta)
section PETLSHAK section PETLSHAK
//; mov r14, [rdi + tls_address] lea rax, [rdi + tls_address]
//; FIXME the overwritten data should be saved, and restored push [rax] // save the TLS index
//; after decompression mov [rax], IMM32(tls_value) // restore compressed data overwritten by the TLS index
mov [rdi + tls_address], IMM32(tls_value) push rax
section PEMAIN02 section PEMAIN02
push rdi push rdi
@ -193,6 +193,11 @@ section PEMAIN10
eof: eof:
pop rsi // load vaddr pop rsi // load vaddr
section PETLSHAK2 // restore the TLS index
pop rdi
pop rax
mov [rdi], eax
// ============= // =============
// ============= FILTERS // ============= FILTERS
// ============= // =============

View File

@ -8,41 +8,42 @@ Idx Name Size VMA LMA File off Algn
3 PEMAIN01 00000012 0000000000000000 0000000000000000 00000058 2**0 CONTENTS, RELOC, READONLY 3 PEMAIN01 00000012 0000000000000000 0000000000000000 00000058 2**0 CONTENTS, RELOC, READONLY
4 PEICONS1 00000007 0000000000000000 0000000000000000 0000006a 2**0 CONTENTS, RELOC, READONLY 4 PEICONS1 00000007 0000000000000000 0000000000000000 0000006a 2**0 CONTENTS, RELOC, READONLY
5 PEICONS2 00000009 0000000000000000 0000000000000000 00000071 2**0 CONTENTS, RELOC, READONLY 5 PEICONS2 00000009 0000000000000000 0000000000000000 00000071 2**0 CONTENTS, RELOC, READONLY
6 PETLSHAK 0000000a 0000000000000000 0000000000000000 0000007a 2**0 CONTENTS, RELOC, READONLY 6 PETLSHAK 00000010 0000000000000000 0000000000000000 0000007a 2**0 CONTENTS, RELOC, READONLY
7 PEMAIN02 00000001 0000000000000000 0000000000000000 00000084 2**0 CONTENTS, READONLY 7 PEMAIN02 00000001 0000000000000000 0000000000000000 0000008a 2**0 CONTENTS, READONLY
8 PEMAIN03 00000000 0000000000000000 0000000000000000 00000085 2**0 CONTENTS, READONLY 8 PEMAIN03 00000000 0000000000000000 0000000000000000 0000008b 2**0 CONTENTS, READONLY
9 NRV_HEAD 00000060 0000000000000000 0000000000000000 00000085 2**0 CONTENTS, READONLY 9 NRV_HEAD 00000060 0000000000000000 0000000000000000 0000008b 2**0 CONTENTS, READONLY
10 NRV2E 000000ae 0000000000000000 0000000000000000 000000e5 2**0 CONTENTS, RELOC, READONLY 10 NRV2E 000000ae 0000000000000000 0000000000000000 000000eb 2**0 CONTENTS, RELOC, READONLY
11 PEMAIN10 00000001 0000000000000000 0000000000000000 00000193 2**0 CONTENTS, READONLY 11 PEMAIN10 00000001 0000000000000000 0000000000000000 00000199 2**0 CONTENTS, READONLY
12 PECTTPOS 00000007 0000000000000000 0000000000000000 00000194 2**0 CONTENTS, RELOC, READONLY 12 PETLSHAK2 00000004 0000000000000000 0000000000000000 0000019a 2**0 CONTENTS, READONLY
13 PECTTNUL 00000003 0000000000000000 0000000000000000 0000019b 2**0 CONTENTS, READONLY 13 PECTTPOS 00000007 0000000000000000 0000000000000000 0000019e 2**0 CONTENTS, RELOC, READONLY
14 ctok32.00 00000005 0000000000000000 0000000000000000 0000019e 2**0 CONTENTS, RELOC, READONLY 14 PECTTNUL 00000003 0000000000000000 0000000000000000 000001a5 2**0 CONTENTS, READONLY
15 PEIMPORT 00000034 0000000000000000 0000000000000000 000001a3 2**0 CONTENTS, RELOC, READONLY 15 ctok32.00 00000005 0000000000000000 0000000000000000 000001a8 2**0 CONTENTS, RELOC, READONLY
16 PEIBYORD 00000002 0000000000000000 0000000000000000 000001d7 2**0 CONTENTS, RELOC, READONLY 16 PEIMPORT 00000034 0000000000000000 0000000000000000 000001ad 2**0 CONTENTS, RELOC, READONLY
17 PEK32ORD 00000012 0000000000000000 0000000000000000 000001d9 2**0 CONTENTS, RELOC, READONLY 17 PEIBYORD 00000002 0000000000000000 0000000000000000 000001e1 2**0 CONTENTS, RELOC, READONLY
18 PEIMORD1 0000000a 0000000000000000 0000000000000000 000001eb 2**0 CONTENTS, RELOC, READONLY 18 PEK32ORD 00000012 0000000000000000 0000000000000000 000001e3 2**0 CONTENTS, RELOC, READONLY
19 PEIMPOR2 00000021 0000000000000000 0000000000000000 000001f5 2**0 CONTENTS, RELOC, READONLY 19 PEIMORD1 0000000a 0000000000000000 0000000000000000 000001f5 2**0 CONTENTS, RELOC, READONLY
20 PEIERDLL 0000000b 0000000000000000 0000000000000000 00000216 2**0 CONTENTS, READONLY 20 PEIMPOR2 00000021 0000000000000000 0000000000000000 000001ff 2**0 CONTENTS, RELOC, READONLY
21 PEIEREXE 00000006 0000000000000000 0000000000000000 00000221 2**0 CONTENTS, RELOC, READONLY 21 PEIERDLL 0000000b 0000000000000000 0000000000000000 00000220 2**0 CONTENTS, READONLY
22 PEIMDONE 00000004 0000000000000000 0000000000000000 00000227 2**0 CONTENTS, READONLY 22 PEIEREXE 00000006 0000000000000000 0000000000000000 0000022b 2**0 CONTENTS, RELOC, READONLY
23 PERELOC1 00000007 0000000000000000 0000000000000000 0000022b 2**0 CONTENTS, RELOC, READONLY 23 PEIMDONE 00000004 0000000000000000 0000000000000000 00000231 2**0 CONTENTS, READONLY
24 PERELOC2 00000004 0000000000000000 0000000000000000 00000232 2**0 CONTENTS, READONLY 24 PERELOC1 00000007 0000000000000000 0000000000000000 00000235 2**0 CONTENTS, RELOC, READONLY
25 PERELOC3 00000030 0000000000000000 0000000000000000 00000236 2**0 CONTENTS, RELOC, READONLY 25 PERELOC2 00000004 0000000000000000 0000000000000000 0000023c 2**0 CONTENTS, READONLY
26 REL64BIG 0000000a 0000000000000000 0000000000000000 00000266 2**0 CONTENTS, RELOC, READONLY 26 PERELOC3 00000030 0000000000000000 0000000000000000 00000240 2**0 CONTENTS, RELOC, READONLY
27 RELOC64J 00000002 0000000000000000 0000000000000000 00000270 2**0 CONTENTS, RELOC, READONLY 27 REL64BIG 0000000a 0000000000000000 0000000000000000 00000270 2**0 CONTENTS, RELOC, READONLY
28 PERLOHI0 0000000a 0000000000000000 0000000000000000 00000272 2**0 CONTENTS, RELOC, READONLY 28 RELOC64J 00000002 0000000000000000 0000000000000000 0000027a 2**0 CONTENTS, RELOC, READONLY
29 PERELLO0 0000000b 0000000000000000 0000000000000000 0000027c 2**0 CONTENTS, READONLY 29 PERLOHI0 0000000a 0000000000000000 0000000000000000 0000027c 2**0 CONTENTS, RELOC, READONLY
30 PERELHI0 0000000e 0000000000000000 0000000000000000 00000287 2**0 CONTENTS, READONLY 30 PERELLO0 0000000b 0000000000000000 0000000000000000 00000286 2**0 CONTENTS, READONLY
31 PEDEPHAK 0000004b 0000000000000000 0000000000000000 00000295 2**0 CONTENTS, RELOC, READONLY 31 PERELHI0 0000000e 0000000000000000 0000000000000000 00000291 2**0 CONTENTS, READONLY
32 PETLSC 0000001b 0000000000000000 0000000000000000 000002e0 2**0 CONTENTS, RELOC, READONLY 32 PEDEPHAK 0000004b 0000000000000000 0000000000000000 0000029f 2**0 CONTENTS, RELOC, READONLY
33 PEMAIN20 00000004 0000000000000000 0000000000000000 000002fb 2**0 CONTENTS, READONLY 33 PETLSC 0000001b 0000000000000000 0000000000000000 000002ea 2**0 CONTENTS, RELOC, READONLY
34 CLEARSTACK 00000010 0000000000000000 0000000000000000 000002ff 2**0 CONTENTS, READONLY 34 PEMAIN20 00000004 0000000000000000 0000000000000000 00000305 2**0 CONTENTS, READONLY
35 PEMAIN21 00000000 0000000000000000 0000000000000000 0000030f 2**0 CONTENTS, READONLY 35 CLEARSTACK 00000010 0000000000000000 0000000000000000 00000309 2**0 CONTENTS, READONLY
36 PEISDLL9 0000000f 0000000000000000 0000000000000000 0000030f 2**0 CONTENTS, READONLY 36 PEMAIN21 00000000 0000000000000000 0000000000000000 00000319 2**0 CONTENTS, READONLY
37 PERETURN 00000004 0000000000000000 0000000000000000 0000031e 2**0 CONTENTS, READONLY 37 PEISDLL9 0000000f 0000000000000000 0000000000000000 00000319 2**0 CONTENTS, READONLY
38 PEDOJUMP 00000005 0000000000000000 0000000000000000 00000322 2**0 CONTENTS, RELOC, READONLY 38 PERETURN 00000004 0000000000000000 0000000000000000 00000328 2**0 CONTENTS, READONLY
39 PETLSC2 00000028 0000000000000000 0000000000000000 00000327 2**0 CONTENTS, RELOC, READONLY 39 PEDOJUMP 00000005 0000000000000000 0000000000000000 0000032c 2**0 CONTENTS, RELOC, READONLY
40 UPX1HEAD 00000020 0000000000000000 0000000000000000 0000034f 2**0 CONTENTS, READONLY 40 PETLSC2 00000028 0000000000000000 0000000000000000 00000331 2**0 CONTENTS, RELOC, READONLY
41 UPX1HEAD 00000020 0000000000000000 0000000000000000 00000359 2**0 CONTENTS, READONLY
SYMBOL TABLE: SYMBOL TABLE:
0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD 0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD
0000000000000000 l d PEMAIN10 0000000000000000 PEMAIN10 0000000000000000 l d PEMAIN10 0000000000000000 PEMAIN10
@ -65,6 +66,7 @@ SYMBOL TABLE:
0000000000000000 l d PEMAIN02 0000000000000000 PEMAIN02 0000000000000000 l d PEMAIN02 0000000000000000 PEMAIN02
0000000000000000 l d PEMAIN03 0000000000000000 PEMAIN03 0000000000000000 l d PEMAIN03 0000000000000000 PEMAIN03
0000000000000000 l d NRV2E 0000000000000000 NRV2E 0000000000000000 l d NRV2E 0000000000000000 NRV2E
0000000000000000 l d PETLSHAK2 0000000000000000 PETLSHAK2
0000000000000000 l d PECTTPOS 0000000000000000 PECTTPOS 0000000000000000 l d PECTTPOS 0000000000000000 PECTTPOS
0000000000000000 l d PECTTNUL 0000000000000000 PECTTNUL 0000000000000000 l d PECTTNUL 0000000000000000 PECTTNUL
0000000000000000 l d ctok32.00 0000000000000000 ctok32.00 0000000000000000 l d ctok32.00 0000000000000000 ctok32.00
@ -136,8 +138,8 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [PETLSHAK]: RELOCATION RECORDS FOR [PETLSHAK]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
0000000000000002 R_X86_64_32S tls_address 0000000000000003 R_X86_64_32S tls_address
0000000000000006 R_X86_64_32 tls_value+0x0000000080000000 000000000000000b R_X86_64_32 tls_value+0x0000000080000000
RELOCATION RECORDS FOR [NRV2E]: RELOCATION RECORDS FOR [NRV2E]:
OFFSET TYPE VALUE OFFSET TYPE VALUE