mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
Decompression works after codesign. (Still more is possible.)
modified: p_mach.cpp
This commit is contained in:
parent
00b1ff1ff6
commit
0f74162551
|
@ -1982,6 +1982,8 @@ int PackMachBase<T>::canUnpack()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: ::pack1 writes l_info as all zero at 0x1000, and it is never updated.
|
||||||
|
|
||||||
int const small = 32 + sizeof(overlay_offset);
|
int const small = 32 + sizeof(overlay_offset);
|
||||||
unsigned bufsize = 4096;
|
unsigned bufsize = 4096;
|
||||||
if (391 == style) { // PackHeader precedes __LINKEDIT
|
if (391 == style) { // PackHeader precedes __LINKEDIT
|
||||||
|
@ -2038,6 +2040,57 @@ int PackMachBase<T>::canUnpack()
|
||||||
}
|
}
|
||||||
overlay_offset = 0;
|
overlay_offset = 0;
|
||||||
}
|
}
|
||||||
|
if (392==style) {
|
||||||
|
overlay_offset = 0x100c; // (l_info precedes;) p_info; b_info; cpr_data
|
||||||
|
// p_info isn't used for execution, so it has less value for checking:
|
||||||
|
// 0== .p_progid
|
||||||
|
// .p_filesize == .p_blocksize
|
||||||
|
fi->seek(overlay_offset, SEEK_SET);
|
||||||
|
fi->readx(buf, bufsize);
|
||||||
|
struct p_info const *const p_ptr = (struct p_info const *)&buf[0];
|
||||||
|
struct b_info const *const b_ptr = (struct b_info const *)(1+ p_ptr);
|
||||||
|
TE32 const *uptr = (TE32 const *)(1+ b_ptr);
|
||||||
|
if (b_ptr->sz_unc < 0x4000
|
||||||
|
&& b_ptr->sz_cpr < b_ptr->sz_unc ) {
|
||||||
|
unsigned const method = b_ptr->b_method;
|
||||||
|
if ((M_NRV2B_LE32 == method || M_NRV2E_LE32 == method)
|
||||||
|
&& 0xff==(uptr[0] >> 24) // 1st 8 bytes are unique literals
|
||||||
|
&& (Mach_header::MH_MAGIC + (sizeof(Addr)>>3)) == uptr[1]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
unsigned const magic = get_te32(1+ (char const *)uptr);
|
||||||
|
if ((M_NRV2B_8 == method || M_NRV2E_8 == method)
|
||||||
|
&& 0xff==(0xff & uptr[0])
|
||||||
|
&& (Mach_header::MH_MAGIC + (sizeof(Addr)>>3)) == magic) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// FIXME: M_LZMA
|
||||||
|
}
|
||||||
|
|
||||||
|
overlay_offset = 0;
|
||||||
|
// The first non-zero word scanning backwards from __LINKEDIT.fileoff
|
||||||
|
// is the total length of compressed data which preceeds it
|
||||||
|
//(distance to l_info), so that's another method.
|
||||||
|
fi->seek(offLINK-0x1000, SEEK_SET);
|
||||||
|
fi->readx(buf, 0x1000);
|
||||||
|
unsigned const *const lo = (unsigned const *)&buf[0];
|
||||||
|
unsigned const *p;
|
||||||
|
for (p = (unsigned const *)&buf[0x1000]; p > lo; ) if (*--p) {
|
||||||
|
overlay_offset = *(TE32 const *)p;
|
||||||
|
if (overlay_offset < offLINK) {
|
||||||
|
overlay_offset -= (char const *)p - (char const *)lo
|
||||||
|
+ (offLINK - 0x1000) - sizeof(l_info);
|
||||||
|
fi->seek(overlay_offset, SEEK_SET);
|
||||||
|
fi->readx(buf, bufsize);
|
||||||
|
if (b_ptr->sz_unc < 0x4000
|
||||||
|
&& b_ptr->sz_cpr < b_ptr->sz_unc ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
overlay_offset = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int l = ph.buf_offset + ph.getPackHeaderSize();
|
int l = ph.buf_offset + ph.getPackHeaderSize();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user