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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -92,10 +92,10 @@ section PEICONS1
section PEICONS2
add [rdi + icon_offset], IMM16(icon_delta)
section PETLSHAK
//; mov r14, [rdi + tls_address]
//; FIXME the overwritten data should be saved, and restored
//; after decompression
mov [rdi + tls_address], IMM32(tls_value)
lea rax, [rdi + tls_address]
push [rax] // save the TLS index
mov [rax], IMM32(tls_value) // restore compressed data overwritten by the TLS index
push rax
section PEMAIN02
push rdi
@ -193,6 +193,11 @@ section PEMAIN10
eof:
pop rsi // load vaddr
section PETLSHAK2 // restore the TLS index
pop rdi
pop rax
mov [rdi], eax
// =============
// ============= 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
4 PEICONS1 00000007 0000000000000000 0000000000000000 0000006a 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
7 PEMAIN02 00000001 0000000000000000 0000000000000000 00000084 2**0 CONTENTS, READONLY
8 PEMAIN03 00000000 0000000000000000 0000000000000000 00000085 2**0 CONTENTS, READONLY
9 NRV_HEAD 00000060 0000000000000000 0000000000000000 00000085 2**0 CONTENTS, READONLY
10 NRV2E 000000ae 0000000000000000 0000000000000000 000000e5 2**0 CONTENTS, RELOC, READONLY
11 PEMAIN10 00000001 0000000000000000 0000000000000000 00000193 2**0 CONTENTS, READONLY
12 PECTTPOS 00000007 0000000000000000 0000000000000000 00000194 2**0 CONTENTS, RELOC, READONLY
13 PECTTNUL 00000003 0000000000000000 0000000000000000 0000019b 2**0 CONTENTS, READONLY
14 ctok32.00 00000005 0000000000000000 0000000000000000 0000019e 2**0 CONTENTS, RELOC, READONLY
15 PEIMPORT 00000034 0000000000000000 0000000000000000 000001a3 2**0 CONTENTS, RELOC, READONLY
16 PEIBYORD 00000002 0000000000000000 0000000000000000 000001d7 2**0 CONTENTS, RELOC, READONLY
17 PEK32ORD 00000012 0000000000000000 0000000000000000 000001d9 2**0 CONTENTS, RELOC, READONLY
18 PEIMORD1 0000000a 0000000000000000 0000000000000000 000001eb 2**0 CONTENTS, RELOC, READONLY
19 PEIMPOR2 00000021 0000000000000000 0000000000000000 000001f5 2**0 CONTENTS, RELOC, READONLY
20 PEIERDLL 0000000b 0000000000000000 0000000000000000 00000216 2**0 CONTENTS, READONLY
21 PEIEREXE 00000006 0000000000000000 0000000000000000 00000221 2**0 CONTENTS, RELOC, READONLY
22 PEIMDONE 00000004 0000000000000000 0000000000000000 00000227 2**0 CONTENTS, READONLY
23 PERELOC1 00000007 0000000000000000 0000000000000000 0000022b 2**0 CONTENTS, RELOC, READONLY
24 PERELOC2 00000004 0000000000000000 0000000000000000 00000232 2**0 CONTENTS, READONLY
25 PERELOC3 00000030 0000000000000000 0000000000000000 00000236 2**0 CONTENTS, RELOC, READONLY
26 REL64BIG 0000000a 0000000000000000 0000000000000000 00000266 2**0 CONTENTS, RELOC, READONLY
27 RELOC64J 00000002 0000000000000000 0000000000000000 00000270 2**0 CONTENTS, RELOC, READONLY
28 PERLOHI0 0000000a 0000000000000000 0000000000000000 00000272 2**0 CONTENTS, RELOC, READONLY
29 PERELLO0 0000000b 0000000000000000 0000000000000000 0000027c 2**0 CONTENTS, READONLY
30 PERELHI0 0000000e 0000000000000000 0000000000000000 00000287 2**0 CONTENTS, READONLY
31 PEDEPHAK 0000004b 0000000000000000 0000000000000000 00000295 2**0 CONTENTS, RELOC, READONLY
32 PETLSC 0000001b 0000000000000000 0000000000000000 000002e0 2**0 CONTENTS, RELOC, READONLY
33 PEMAIN20 00000004 0000000000000000 0000000000000000 000002fb 2**0 CONTENTS, READONLY
34 CLEARSTACK 00000010 0000000000000000 0000000000000000 000002ff 2**0 CONTENTS, READONLY
35 PEMAIN21 00000000 0000000000000000 0000000000000000 0000030f 2**0 CONTENTS, READONLY
36 PEISDLL9 0000000f 0000000000000000 0000000000000000 0000030f 2**0 CONTENTS, READONLY
37 PERETURN 00000004 0000000000000000 0000000000000000 0000031e 2**0 CONTENTS, READONLY
38 PEDOJUMP 00000005 0000000000000000 0000000000000000 00000322 2**0 CONTENTS, RELOC, READONLY
39 PETLSC2 00000028 0000000000000000 0000000000000000 00000327 2**0 CONTENTS, RELOC, READONLY
40 UPX1HEAD 00000020 0000000000000000 0000000000000000 0000034f 2**0 CONTENTS, READONLY
6 PETLSHAK 00000010 0000000000000000 0000000000000000 0000007a 2**0 CONTENTS, RELOC, READONLY
7 PEMAIN02 00000001 0000000000000000 0000000000000000 0000008a 2**0 CONTENTS, READONLY
8 PEMAIN03 00000000 0000000000000000 0000000000000000 0000008b 2**0 CONTENTS, READONLY
9 NRV_HEAD 00000060 0000000000000000 0000000000000000 0000008b 2**0 CONTENTS, READONLY
10 NRV2E 000000ae 0000000000000000 0000000000000000 000000eb 2**0 CONTENTS, RELOC, READONLY
11 PEMAIN10 00000001 0000000000000000 0000000000000000 00000199 2**0 CONTENTS, READONLY
12 PETLSHAK2 00000004 0000000000000000 0000000000000000 0000019a 2**0 CONTENTS, READONLY
13 PECTTPOS 00000007 0000000000000000 0000000000000000 0000019e 2**0 CONTENTS, RELOC, READONLY
14 PECTTNUL 00000003 0000000000000000 0000000000000000 000001a5 2**0 CONTENTS, READONLY
15 ctok32.00 00000005 0000000000000000 0000000000000000 000001a8 2**0 CONTENTS, RELOC, READONLY
16 PEIMPORT 00000034 0000000000000000 0000000000000000 000001ad 2**0 CONTENTS, RELOC, READONLY
17 PEIBYORD 00000002 0000000000000000 0000000000000000 000001e1 2**0 CONTENTS, RELOC, READONLY
18 PEK32ORD 00000012 0000000000000000 0000000000000000 000001e3 2**0 CONTENTS, RELOC, READONLY
19 PEIMORD1 0000000a 0000000000000000 0000000000000000 000001f5 2**0 CONTENTS, RELOC, READONLY
20 PEIMPOR2 00000021 0000000000000000 0000000000000000 000001ff 2**0 CONTENTS, RELOC, READONLY
21 PEIERDLL 0000000b 0000000000000000 0000000000000000 00000220 2**0 CONTENTS, READONLY
22 PEIEREXE 00000006 0000000000000000 0000000000000000 0000022b 2**0 CONTENTS, RELOC, READONLY
23 PEIMDONE 00000004 0000000000000000 0000000000000000 00000231 2**0 CONTENTS, READONLY
24 PERELOC1 00000007 0000000000000000 0000000000000000 00000235 2**0 CONTENTS, RELOC, READONLY
25 PERELOC2 00000004 0000000000000000 0000000000000000 0000023c 2**0 CONTENTS, READONLY
26 PERELOC3 00000030 0000000000000000 0000000000000000 00000240 2**0 CONTENTS, RELOC, READONLY
27 REL64BIG 0000000a 0000000000000000 0000000000000000 00000270 2**0 CONTENTS, RELOC, READONLY
28 RELOC64J 00000002 0000000000000000 0000000000000000 0000027a 2**0 CONTENTS, RELOC, READONLY
29 PERLOHI0 0000000a 0000000000000000 0000000000000000 0000027c 2**0 CONTENTS, RELOC, READONLY
30 PERELLO0 0000000b 0000000000000000 0000000000000000 00000286 2**0 CONTENTS, READONLY
31 PERELHI0 0000000e 0000000000000000 0000000000000000 00000291 2**0 CONTENTS, READONLY
32 PEDEPHAK 0000004b 0000000000000000 0000000000000000 0000029f 2**0 CONTENTS, RELOC, READONLY
33 PETLSC 0000001b 0000000000000000 0000000000000000 000002ea 2**0 CONTENTS, RELOC, READONLY
34 PEMAIN20 00000004 0000000000000000 0000000000000000 00000305 2**0 CONTENTS, READONLY
35 CLEARSTACK 00000010 0000000000000000 0000000000000000 00000309 2**0 CONTENTS, READONLY
36 PEMAIN21 00000000 0000000000000000 0000000000000000 00000319 2**0 CONTENTS, READONLY
37 PEISDLL9 0000000f 0000000000000000 0000000000000000 00000319 2**0 CONTENTS, READONLY
38 PERETURN 00000004 0000000000000000 0000000000000000 00000328 2**0 CONTENTS, READONLY
39 PEDOJUMP 00000005 0000000000000000 0000000000000000 0000032c 2**0 CONTENTS, RELOC, READONLY
40 PETLSC2 00000028 0000000000000000 0000000000000000 00000331 2**0 CONTENTS, RELOC, READONLY
41 UPX1HEAD 00000020 0000000000000000 0000000000000000 00000359 2**0 CONTENTS, READONLY
SYMBOL TABLE:
0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD
0000000000000000 l d PEMAIN10 0000000000000000 PEMAIN10
@ -65,6 +66,7 @@ SYMBOL TABLE:
0000000000000000 l d PEMAIN02 0000000000000000 PEMAIN02
0000000000000000 l d PEMAIN03 0000000000000000 PEMAIN03
0000000000000000 l d NRV2E 0000000000000000 NRV2E
0000000000000000 l d PETLSHAK2 0000000000000000 PETLSHAK2
0000000000000000 l d PECTTPOS 0000000000000000 PECTTPOS
0000000000000000 l d PECTTNUL 0000000000000000 PECTTNUL
0000000000000000 l d ctok32.00 0000000000000000 ctok32.00
@ -136,8 +138,8 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [PETLSHAK]:
OFFSET TYPE VALUE
0000000000000002 R_X86_64_32S tls_address
0000000000000006 R_X86_64_32 tls_value+0x0000000080000000
0000000000000003 R_X86_64_32S tls_address
000000000000000b R_X86_64_32 tls_value+0x0000000080000000
RELOCATION RECORDS FOR [NRV2E]:
OFFSET TYPE VALUE