X-Git-Url: https://git.saurik.com/ldid.git/blobdiff_plain/1b7da752c83d8adfc849b723caa4c51c2fe8343f..d840a088528979cddcf722a2a19abefc0151a1ed:/ldid.cpp diff --git a/ldid.cpp b/ldid.cpp index 1795d34..e1fbda9 100644 --- a/ldid.cpp +++ b/ldid.cpp @@ -31,6 +31,8 @@ extern "C" { #include #include +#include + struct fat_header { uint32_t magic; uint32_t nfat_arch; @@ -728,12 +730,14 @@ struct CodesignAllocation { uint32_t offset_; uint32_t size_; uint32_t alloc_; + uint32_t align_; - CodesignAllocation(FatMachHeader mach_header, size_t offset, size_t size, size_t alloc) : + CodesignAllocation(FatMachHeader mach_header, size_t offset, size_t size, size_t alloc, size_t align) : mach_header_(mach_header), offset_(offset), size_(size), - alloc_(alloc) + alloc_(alloc), + align_(align) { } }; @@ -1006,8 +1010,11 @@ int main(int argc, const char *argv[]) { size_t normal((size + 0x1000 - 1) / 0x1000); alloc = Align(alloc + (special + normal) * 0x14, 16); - offset = Align(offset, 4096); - allocations.push_back(CodesignAllocation(mach_header, offset, size, alloc)); + auto *fat_arch(mach_header.GetFatArch()); + uint32_t align(fat_arch == NULL ? 0 : source.Swap(fat_arch->align)); + offset = Align(offset, 1 << align); + + allocations.push_back(CodesignAllocation(mach_header, offset, size, alloc, align)); offset += size + alloc; offset = Align(offset, 16); } @@ -1041,7 +1048,7 @@ int main(int argc, const char *argv[]) { fat_arch->cpusubtype = Swap(source->cpusubtype); fat_arch->offset = Swap(allocation.offset_); fat_arch->size = Swap(align + allocation.alloc_); - fat_arch->align = Swap(0xc); + fat_arch->align = Swap(allocation.align_); ++fat_arch; } @@ -1087,9 +1094,11 @@ int main(int argc, const char *argv[]) { printf("path%zu='%s'\n", filei, file.c_str()); FatHeader fat_header(Map(temp == NULL ? path : temp, !(flag_R || flag_T || flag_s || flag_S || flag_O || flag_D))); - struct linkedit_data_command *signature(NULL); _foreach (mach_header, fat_header.GetMachHeaders()) { + struct linkedit_data_command *signature(NULL); + struct encryption_info_command *encryption(NULL); + if (flag_A) { if (mach_header.GetCPUType() != flag_CPUType) continue; @@ -1136,6 +1145,8 @@ int main(int argc, const char *argv[]) { load_command->cmd = mach_header.Swap(LC_LOAD_DYLIB); else if (cmd == LC_CODE_SIGNATURE) signature = reinterpret_cast(load_command); + else if (cmd == LC_ENCRYPTION_INFO) + encryption = reinterpret_cast(load_command); else if (cmd == LC_UUID) { volatile struct uuid_command *uuid_command(reinterpret_cast(load_command)); @@ -1165,18 +1176,20 @@ int main(int argc, const char *argv[]) { dylib_command->dylib.timestamp = mach_header.Swap(timed); } - } else if (cmd == LC_ENCRYPTION_INFO) { - volatile struct encryption_info_command *encryption_info_command(reinterpret_cast(load_command)); + } + } - if (flag_D) - encryption_info_command->cryptid = mach_header.Swap(0); + if (flag_d) { + _assert(encryption != NULL); - if (flag_d) { - printf("cryptoff=0x%x\n", mach_header.Swap(encryption_info_command->cryptoff)); - printf("cryptsize=0x%x\n", mach_header.Swap(encryption_info_command->cryptsize)); - printf("cryptid=0x%x\n", mach_header.Swap(encryption_info_command->cryptid)); - } - } + printf("cryptoff=0x%x\n", mach_header.Swap(encryption->cryptoff)); + printf("cryptsize=0x%x\n", mach_header.Swap(encryption->cryptsize)); + printf("cryptid=0x%x\n", mach_header.Swap(encryption->cryptid)); + } + + if (flag_D) { + _assert(encryption != NULL); + encryption->cryptid = mach_header.Swap(0); } if (flag_e) {