summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2016-12-21 16:44:35 -0800
committerJay Freeman (saurik) <saurik@saurik.com>2016-12-21 16:44:35 -0800
commitcdd9c0fdae31bc0f7b12884cce015b79e817367d (patch)
treef360202d68e2eeaf0f3976ff1a884589205b1f9b
parentc4f8d24363d98bae2040ad3f4ddb1ff89e9f7636 (diff)
downloadldid-cdd9c0fdae31bc0f7b12884cce015b79e817367d.tar.gz
ldid-cdd9c0fdae31bc0f7b12884cce015b79e817367d.tar.zst
ldid-cdd9c0fdae31bc0f7b12884cce015b79e817367d.zip
Provide a simple to use implementation of ldid -e.
-rw-r--r--ldid.cpp28
-rw-r--r--ldid.hpp1
2 files changed, 29 insertions, 0 deletions
diff --git a/ldid.cpp b/ldid.cpp
index 8010211..d7fdf7a 100644
--- a/ldid.cpp
+++ b/ldid.cpp
@@ -982,6 +982,34 @@ class Map {
namespace ldid {
+std::string Analyze(const void *data, size_t size) {
+ std::string entitlements;
+
+ FatHeader fat_header(const_cast<void *>(data), size);
+ _foreach (mach_header, fat_header.GetMachHeaders())
+ _foreach (load_command, mach_header.GetLoadCommands())
+ if (mach_header.Swap(load_command->cmd) == LC_CODE_SIGNATURE) {
+ auto signature(reinterpret_cast<struct linkedit_data_command *>(load_command));
+ auto offset(mach_header.Swap(signature->dataoff));
+ auto pointer(reinterpret_cast<uint8_t *>(mach_header.GetBase()) + offset);
+ auto super(reinterpret_cast<struct SuperBlob *>(pointer));
+
+ for (size_t index(0); index != Swap(super->count); ++index)
+ if (Swap(super->index[index].type) == CSSLOT_ENTITLEMENTS) {
+ auto begin(Swap(super->index[index].offset));
+ auto blob(reinterpret_cast<struct Blob *>(pointer + begin));
+ auto writ(Swap(blob->length) - sizeof(*blob));
+
+ if (entitlements.empty())
+ entitlements.assign(reinterpret_cast<char *>(blob + 1), writ);
+ else
+ _assert(entitlements.compare(0, entitlements.size(), reinterpret_cast<char *>(blob + 1), writ) == 0);
+ }
+ }
+
+ return entitlements;
+}
+
static void Allocate(const void *idata, size_t isize, std::streambuf &output, const Functor<size_t (const MachHeader &, size_t)> &allocate, const Functor<size_t (const MachHeader &, std::streambuf &output, size_t, const std::string &, const char *)> &save) {
FatHeader source(const_cast<void *>(idata), isize);
diff --git a/ldid.hpp b/ldid.hpp
index b603bbd..fbacc86 100644
--- a/ldid.hpp
+++ b/ldid.hpp
@@ -152,6 +152,7 @@ Bundle Sign(const std::string &root, Folder &folder, const std::string &key, con
typedef std::map<uint32_t, std::vector<char>> Slots;
+std::string Analyze(const void *data, size_t size);
std::vector<char> Sign(const void *idata, size_t isize, std::streambuf &output, const std::string &identifier, const std::string &entitlements, const std::string &requirement, const std::string &key, const Slots &slots);
}