mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
i386-darwin.dylib ::unpack
This commit is contained in:
parent
3e8d072d24
commit
7d38f0e234
|
@ -776,31 +776,10 @@ void PackMachBase<T>::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e
|
||||||
segcmdo.flags = 0;
|
segcmdo.flags = 0;
|
||||||
if (my_filetype==Mach_header::MH_EXECUTE) {
|
if (my_filetype==Mach_header::MH_EXECUTE) {
|
||||||
fo->write(&segcmdo, sizeof(segcmdo));
|
fo->write(&segcmdo, sizeof(segcmdo));
|
||||||
}
|
|
||||||
|
|
||||||
if (my_filetype==Mach_header::MH_EXECUTE) {
|
|
||||||
pack1_setup_threado(fo);
|
pack1_setup_threado(fo);
|
||||||
}
|
}
|
||||||
if (my_filetype==Mach_header::MH_DYLIB) {
|
if (my_filetype==Mach_header::MH_DYLIB) {
|
||||||
Mach_segment_command const *seg = rawmseg;
|
fo->write(rawmseg, mhdri.sizeofcmds);
|
||||||
Mach_segment_command const *const endseg =
|
|
||||||
(Mach_segment_command const *)(mhdri.sizeofcmds + (char const *)seg);
|
|
||||||
for (; seg < endseg; seg = (Mach_segment_command const *)(
|
|
||||||
seg->cmdsize + (char const *)seg))
|
|
||||||
switch (~Mach_segment_command::LC_REQ_DYLD & seg->cmd) {
|
|
||||||
default: {
|
|
||||||
fo->write(seg, seg->cmdsize);
|
|
||||||
} break;
|
|
||||||
case Mach_segment_command::LC_SEGMENT: {
|
|
||||||
//if (0!=strncmp(&seg->segname[0], "__TEXT", 1+ 6)) {
|
|
||||||
fo->write(seg, seg->cmdsize);
|
|
||||||
//}
|
|
||||||
} break;
|
|
||||||
} // end 'switch'
|
|
||||||
memset(&rcmd, 0, sizeof(rcmd));
|
|
||||||
rcmd.cmd= Mach_segment_command::LC_ROUTINES;
|
|
||||||
rcmd.cmdsize = sizeof(rcmd);
|
|
||||||
//fo->write(&rcmd, sizeof(rcmd));
|
|
||||||
}
|
}
|
||||||
sz_mach_headers = fo->getBytesWritten();
|
sz_mach_headers = fo->getBytesWritten();
|
||||||
|
|
||||||
|
@ -813,8 +792,11 @@ void PackMachBase<T>::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e
|
||||||
template <class T>
|
template <class T>
|
||||||
void PackMachBase<T>::unpack(OutputFile *fo)
|
void PackMachBase<T>::unpack(OutputFile *fo)
|
||||||
{
|
{
|
||||||
overlay_offset = sizeof(mhdro) + sizeof(segcmdo) +
|
fi->seek(0, SEEK_SET);
|
||||||
my_thread_command_size + sizeof(linfo);
|
fi->readx(&mhdri, sizeof(mhdri));
|
||||||
|
rawmseg = (Mach_segment_command *)new char[(unsigned) mhdri.sizeofcmds];
|
||||||
|
fi->readx(rawmseg, mhdri.sizeofcmds);
|
||||||
|
overlay_offset = sizeof(mhdri) + mhdri.sizeofcmds + sizeof(linfo);
|
||||||
fi->seek(overlay_offset, SEEK_SET);
|
fi->seek(overlay_offset, SEEK_SET);
|
||||||
p_info hbuf;
|
p_info hbuf;
|
||||||
fi->readx(&hbuf, sizeof(hbuf));
|
fi->readx(&hbuf, sizeof(hbuf));
|
||||||
|
@ -868,9 +850,35 @@ void PackMachBase<T>::unpack(OutputFile *fo)
|
||||||
if (Mach_segment_command::LC_SEGMENT==sc->cmd
|
if (Mach_segment_command::LC_SEGMENT==sc->cmd
|
||||||
&& 0!=sc->filesize ) {
|
&& 0!=sc->filesize ) {
|
||||||
unsigned filesize = sc->filesize;
|
unsigned filesize = sc->filesize;
|
||||||
unpackExtent(filesize, fo, total_in, total_out, c_adler, u_adler, false, sizeof(bhdr));
|
unpackExtent(filesize, fo, total_in, total_out,
|
||||||
|
c_adler, u_adler, false, sizeof(bhdr));
|
||||||
|
if (my_filetype==Mach_header::MH_DYLIB) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (my_filetype==Mach_header::MH_DYLIB) {
|
||||||
|
Mach_segment_command const *rc = rawmseg;
|
||||||
|
rc = (Mach_segment_command const *)(rc->cmdsize + (char const *)rc);
|
||||||
|
sc = (Mach_segment_command const *)(sc->cmdsize + (char const *)sc);
|
||||||
|
for (
|
||||||
|
k=1;
|
||||||
|
k < ncmds;
|
||||||
|
(++k), (sc = (Mach_segment_command const *)(sc->cmdsize + (char const *)sc)),
|
||||||
|
(rc = (Mach_segment_command const *)(rc->cmdsize + (char const *)rc))
|
||||||
|
) {
|
||||||
|
if (Mach_segment_command::LC_SEGMENT==rc->cmd
|
||||||
|
&& 0!=rc->filesize ) {
|
||||||
|
fi->seek(rc->fileoff, SEEK_SET);
|
||||||
|
fo->seek(sc->fileoff, SEEK_SET);
|
||||||
|
unsigned const len = rc->filesize;
|
||||||
|
char data[len];
|
||||||
|
fi->readx(data, len);
|
||||||
|
fo->write(data, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
for (unsigned j = 0; j < ncmds; ++j) {
|
for (unsigned j = 0; j < ncmds; ++j) {
|
||||||
unsigned const size = find_SEGMENT_gap(j);
|
unsigned const size = find_SEGMENT_gap(j);
|
||||||
if (size) {
|
if (size) {
|
||||||
|
@ -881,6 +889,7 @@ void PackMachBase<T>::unpack(OutputFile *fo)
|
||||||
c_adler, u_adler, false, sizeof(bhdr));
|
c_adler, u_adler, false, sizeof(bhdr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete mhdr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user