bool flag_t(false);
bool flag_p(false);
bool flag_u(false);
+ bool flag_e(false);
bool flag_T(false);
if (argc == 1) {
fprintf(stderr, "usage: %s -S[entitlements.xml] <binary>\n", argv[0]);
+ fprintf(stderr, " %s -e MobileSafari\n", argv[0]);
fprintf(stderr, " %s -S cat\n", argv[0]);
fprintf(stderr, " %s -Stfp.xml gdb\n", argv[0]);
exit(0);
case 't': flag_t = true; break;
case 'u': flag_u = true; break;
case 'p': flag_p = true; break;
+ case 'e': flag_e = true; break;
case 's':
_assert(!flag_S);
const char *path(file->c_str());
const char *base = strrchr(path, '/');
char *temp(NULL), *dir;
- mode_t mode = 0;
if (base != NULL)
dir = strndup_(path, base++ - path + 1);
}
}
+ if (flag_e) {
+ _assert(signature != NULL);
+
+ uint32_t data = framework.Swap(signature->dataoff);
+ uint32_t size = framework.Swap(signature->datasize);
+
+ uint8_t *top = reinterpret_cast<uint8_t *>(framework.GetBase());
+ uint8_t *blob = top + data;
+ struct SuperBlob *super = reinterpret_cast<struct SuperBlob *>(blob);
+
+ for (size_t index(0); index != Swap(super->count); ++index)
+ if (Swap(super->index[index].type) == CSSLOT_ENTITLEMENTS) {
+ uint32_t begin = Swap(super->index[index].offset);
+ struct Blob *entitlements = reinterpret_cast<struct Blob *>(blob + begin);
+ fwrite(entitlements + 1, 1, Swap(entitlements->length) - sizeof(struct Blob), stdout);
+ }
+ }
+
if (flag_s) {
_assert(signature != NULL);
for (size_t i = 0; i != pages - 1; ++i)
sha1(hashes[i], top + 0x1000 * i, 0x1000);
if (pages != 0)
- sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), data % 0x1000);
+ sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), ((data - 1) % 0x1000) + 1);
}
}
for (size_t i = 0; i != pages - 1; ++i)
sha1(hashes[i], top + 0x1000 * i, 0x1000);
if (pages != 0)
- sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), data % 0x1000);
+ sha1(hashes[pages - 1], top + 0x1000 * (pages - 1), ((data - 1) % 0x1000) + 1);
directory->hashOffset = Swap(offset - begin);
offset += sizeof(*hashes) * pages;
super->blob.length = Swap(offset);
if (offset > size) {
- fprintf(stderr, "offset (%zu) > size (%zu)\n", offset, size);
+ fprintf(stderr, "offset (%u) > size (%u)\n", offset, size);
_assert(false);
} //else fprintf(stderr, "offset (%zu) <= size (%zu)\n", offset, size);