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:
parent
241834029a
commit
6c64b06453
|
@ -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;
|
||||
|
|
|
@ -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
|
@ -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
|
||||
// =============
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user