]> git.saurik.com Git - ldid.git/blobdiff - ldid.cpp
Added string.h for memset. (toelooper)
[ldid.git] / ldid.cpp
index 869e849fe07382a9ce6fbf964e0a9165748ccb35..19bfcc72d0459d7cd9bdb903d011389312cfd65c 100644 (file)
--- a/ldid.cpp
+++ b/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);
 
@@ -498,7 +518,7 @@ int main(int argc, const char *argv[]) {
                         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);
                 }
         }
 
@@ -553,7 +573,7 @@ int main(int argc, const char *argv[]) {
                 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;
@@ -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);