diff options
author | Jay Freeman <saurik@saurik.com> | 2008-09-15 09:13:41 +0000 |
---|---|---|
committer | Jay Freeman <saurik@saurik.com> | 2008-09-15 09:13:41 +0000 |
commit | 7cbadc79eafaa68197ed6475dcd7ddc4502a3054 (patch) | |
tree | b3f0372522eda5df0b842383060d24ff5cbc6d1f /util | |
parent | f9fe7aca30def443efabeae32e355b405c5c2da1 (diff) |
Added ldid -e.
git-svn-id: http://svn.telesphoreo.org/trunk@476 514c082c-b64e-11dc-b46d-3d985efe055d
Diffstat (limited to 'util')
-rw-r--r-- | util/ldid.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/util/ldid.cpp b/util/ldid.cpp index b58198845..19bfcc72d 100644 --- a/util/ldid.cpp +++ b/util/ldid.cpp @@ -302,6 +302,7 @@ int main(int argc, const char *argv[]) { bool flag_t(false); bool flag_p(false); bool flag_u(false); + bool flag_e(false); bool flag_T(false); @@ -318,6 +319,7 @@ int main(int argc, const char *argv[]) { 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); @@ -331,6 +333,7 @@ int main(int argc, const char *argv[]) { 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); @@ -371,7 +374,6 @@ int main(int argc, const char *argv[]) { 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); @@ -476,6 +478,24 @@ int main(int argc, const char *argv[]) { } } + 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); @@ -593,7 +613,7 @@ int main(int argc, const char *argv[]) { 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); |