mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
Omit Mach_command from stub where allowed.
changed src/p_mach.cpp
This commit is contained in:
parent
7ad1e7756b
commit
345a1c64f9
|
@ -798,14 +798,19 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader
|
||||||
fo->rewrite(&linfo, sizeof(linfo));
|
fo->rewrite(&linfo, sizeof(linfo));
|
||||||
}
|
}
|
||||||
if (my_filetype == Mach_header::MH_EXECUTE) {
|
if (my_filetype == Mach_header::MH_EXECUTE) {
|
||||||
|
// Get a writeable copy of the stub to make editing easier.
|
||||||
|
unsigned char upxstub[sizeof(stub_amd64_darwin_macho_upxmain_exe)];
|
||||||
|
memcpy(upxstub, stub_amd64_darwin_macho_upxmain_exe, sizeof(upxstub));
|
||||||
|
|
||||||
|
Mach_header *const ptr0 = (Mach_header *)upxstub;
|
||||||
|
Mach_command *ptr1 = (Mach_command *)(1+ ptr0);
|
||||||
unsigned cmdsize = mhdro.sizeofcmds - sizeof(segXHDR);
|
unsigned cmdsize = mhdro.sizeofcmds - sizeof(segXHDR);
|
||||||
Mach_header const *const ptr0 = (Mach_header const *)stub_amd64_darwin_macho_upxmain_exe;
|
|
||||||
Mach_command const *ptr1 = (Mach_command const *)(1+ ptr0);
|
|
||||||
unsigned const ncmds = mhdro.ncmds;
|
unsigned const ncmds = mhdro.ncmds;
|
||||||
unsigned delta = 0;
|
unsigned delta = 0;
|
||||||
for (unsigned j = 0; j < ncmds -1; ++j,
|
for (unsigned j = 0; j < ncmds -1; ++j,
|
||||||
(cmdsize -= ptr1->cmdsize),
|
(cmdsize -= ptr1->cmdsize),
|
||||||
ptr1 = (Mach_command const *)(ptr1->cmdsize + (char const *)ptr1))
|
ptr1 = (Mach_command *)(ptr1->cmdsize + (char *)ptr1))
|
||||||
|
next:
|
||||||
switch (ptr1->cmd) {
|
switch (ptr1->cmd) {
|
||||||
case Mach_segment_command::LC_SEGMENT_64: {
|
case Mach_segment_command::LC_SEGMENT_64: {
|
||||||
Mach_segment_command const *const segptr = (Mach_segment_command const *)ptr1;
|
Mach_segment_command const *const segptr = (Mach_segment_command const *)ptr1;
|
||||||
|
@ -826,7 +831,10 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader
|
||||||
fo->rewrite(getLoader(), d);
|
fo->rewrite(getLoader(), d);
|
||||||
fo->seek(0, SEEK_END);
|
fo->seek(0, SEEK_END);
|
||||||
}
|
}
|
||||||
if (!strcmp("__LINKEDIT", ((Mach_segment_command const *)ptr1)->segname)) {
|
if (!strcmp("__DATA", segptr->segname) && !segptr->vmsize) {
|
||||||
|
goto omit;
|
||||||
|
}
|
||||||
|
if (!strcmp("__LINKEDIT", segptr->segname)) {
|
||||||
memcpy(&segLINK, segptr, sizeof(segLINK));
|
memcpy(&segLINK, segptr, sizeof(segLINK));
|
||||||
delta = offLINK - segLINK.fileoff; // relocation constant
|
delta = offLINK - segLINK.fileoff; // relocation constant
|
||||||
|
|
||||||
|
@ -863,6 +871,7 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader
|
||||||
blk.export_size = 0;
|
blk.export_size = 0;
|
||||||
fo->seek(sizeof(segXHDR) + ((char const *)ptr1 - (char const *)ptr0), SEEK_SET);
|
fo->seek(sizeof(segXHDR) + ((char const *)ptr1 - (char const *)ptr0), SEEK_SET);
|
||||||
fo->rewrite(&blk, sizeof(blk));
|
fo->rewrite(&blk, sizeof(blk));
|
||||||
|
goto omit; // try omitting this
|
||||||
} break;
|
} break;
|
||||||
case Mach_segment_command::LC_SYMTAB: {
|
case Mach_segment_command::LC_SYMTAB: {
|
||||||
Mach_symtab_command blk; memcpy(&blk, ptr1, sizeof(blk));
|
Mach_symtab_command blk; memcpy(&blk, ptr1, sizeof(blk));
|
||||||
|
@ -870,6 +879,7 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader
|
||||||
if (blk.stroff) blk.stroff += delta;
|
if (blk.stroff) blk.stroff += delta;
|
||||||
fo->seek(sizeof(segXHDR) + ((char const *)ptr1 - (char const *)ptr0), SEEK_SET);
|
fo->seek(sizeof(segXHDR) + ((char const *)ptr1 - (char const *)ptr0), SEEK_SET);
|
||||||
fo->rewrite(&blk, sizeof(blk));
|
fo->rewrite(&blk, sizeof(blk));
|
||||||
|
goto omit; // try omitting this
|
||||||
} break;
|
} break;
|
||||||
case Mach_segment_command::LC_DYSYMTAB: {
|
case Mach_segment_command::LC_DYSYMTAB: {
|
||||||
Mach_dysymtab_command blk; memcpy(&blk, ptr1, sizeof(blk));
|
Mach_dysymtab_command blk; memcpy(&blk, ptr1, sizeof(blk));
|
||||||
|
@ -888,6 +898,7 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader
|
||||||
blk.nundefsym = 0;
|
blk.nundefsym = 0;
|
||||||
fo->seek(sizeof(segXHDR) + ((char const *)ptr1 - (char const *)ptr0), SEEK_SET);
|
fo->seek(sizeof(segXHDR) + ((char const *)ptr1 - (char const *)ptr0), SEEK_SET);
|
||||||
fo->rewrite(&blk, sizeof(blk));
|
fo->rewrite(&blk, sizeof(blk));
|
||||||
|
goto omit; // adds full path as another agrument?
|
||||||
} break;
|
} break;
|
||||||
case Mach_segment_command::LC_FUNCTION_STARTS: {
|
case Mach_segment_command::LC_FUNCTION_STARTS: {
|
||||||
N_Mach::Mach_function_starts_command blk; memcpy(&blk, ptr1, sizeof(blk));
|
N_Mach::Mach_function_starts_command blk; memcpy(&blk, ptr1, sizeof(blk));
|
||||||
|
@ -933,7 +944,32 @@ void PackMachAMD64::pack4(OutputFile *fo, Filter &ft) // append PackHeader
|
||||||
fo->seek(0, SEEK_SET);
|
fo->seek(0, SEEK_SET);
|
||||||
fo->rewrite(&mhdro, sizeof(mhdro));
|
fo->rewrite(&mhdro, sizeof(mhdro));
|
||||||
} break;
|
} break;
|
||||||
|
case Mach_segment_command::LC_LOAD_DYLINKER: {
|
||||||
|
// Try omitting this
|
||||||
|
omit:
|
||||||
|
fo->seek(sizeof(mhdro) + mhdro.sizeofcmds - cmdsize, SEEK_SET);
|
||||||
|
Mach_command *ptr2 = ptr1;
|
||||||
|
unsigned const sz_omit = ptr1->cmdsize;
|
||||||
|
ptr1 = (Mach_command *)(sz_omit + (char *)ptr1);
|
||||||
|
cmdsize -= sz_omit;
|
||||||
|
|
||||||
|
fo->rewrite(ptr1, cmdsize); // slide in file TODO: clear the garbage
|
||||||
|
memmove(ptr2, ptr1, cmdsize); // overlapping slide lower
|
||||||
|
ptr1 = ptr2;
|
||||||
|
|
||||||
|
mhdro.ncmds -= 1;
|
||||||
|
mhdro.sizeofcmds -= sz_omit;
|
||||||
|
fo->seek(0, SEEK_SET);
|
||||||
|
fo->rewrite(&mhdro, sizeof(mhdro));
|
||||||
|
if (++j < (ncmds -1))
|
||||||
|
goto next;
|
||||||
|
goto done;
|
||||||
|
} break;
|
||||||
|
case Mach_segment_command::LC_SOURCE_VERSION: {
|
||||||
|
goto omit;
|
||||||
|
} break;
|
||||||
} // end switch
|
} // end switch
|
||||||
|
done:
|
||||||
fo->seek(0, SEEK_END);
|
fo->seek(0, SEEK_END);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user