summaryrefslogtreecommitdiff
path: root/platform/mac
diff options
context:
space:
mode:
authorkat <kat@vector35.com>2024-06-27 12:45:20 -0400
committerkat <kat@vector35.com>2024-06-27 12:45:20 -0400
commitde5fdb36657a8a2ac500e4d924870c052c2941f7 (patch)
tree43c14db7a2a8ab8603cb5e61a993d81f4021a275 /platform/mac
parent015bb4fa79d01a1e2d4887cba96d150c7e1dd3bb (diff)
Add iOS Platforms. Add Mach-O Typelib support
Diffstat (limited to 'platform/mac')
-rw-r--r--platform/mac/platform_mac.cpp172
1 files changed, 147 insertions, 25 deletions
diff --git a/platform/mac/platform_mac.cpp b/platform/mac/platform_mac.cpp
index f1a33333..6a539f66 100644
--- a/platform/mac/platform_mac.cpp
+++ b/platform/mac/platform_mac.cpp
@@ -4,6 +4,10 @@ using namespace BinaryNinja;
using namespace std;
+Ref<Platform> g_macX86, g_macX64, g_macArmv7, g_macThumb2, g_macArm64;
+Ref<Platform> g_iosArmv7, g_iosThumb2, g_iosArm64;
+
+
class MacX86Platform: public Platform
{
public:
@@ -31,6 +35,17 @@ public:
{
return false;
}
+
+ static Ref<Platform> Recognize(BinaryView* view, Metadata* metadata)
+ {
+ auto machoPlatform = metadata->Get("machoplatform");
+ if (!machoPlatform || !machoPlatform->IsUnsignedInteger())
+ return nullptr;
+ if (machoPlatform->GetUnsignedInteger() != 2)
+ return g_macX86;
+
+ return nullptr;
+ }
};
@@ -55,6 +70,17 @@ public:
{
return false;
}
+
+ static Ref<Platform> Recognize(BinaryView* view, Metadata* metadata)
+ {
+ auto machoPlatform = metadata->Get("machoplatform");
+ if (!machoPlatform || !machoPlatform->IsUnsignedInteger())
+ return nullptr;
+ if (machoPlatform->GetUnsignedInteger() != 2)
+ return g_macX64;
+
+ return nullptr;
+ }
};
@@ -79,6 +105,17 @@ public:
{
return false;
}
+
+ static Ref<Platform> Recognize(BinaryView* view, Metadata* metadata)
+ {
+ auto machoPlatform = metadata->Get("machoplatform");
+ if (!machoPlatform || !machoPlatform->IsUnsignedInteger())
+ return nullptr;
+ if (machoPlatform->GetUnsignedInteger() != 2)
+ return g_macArmv7;
+
+ return nullptr;
+ }
};
@@ -103,6 +140,86 @@ public:
{
return false;
}
+
+ static Ref<Platform> Recognize(BinaryView* view, Metadata* metadata)
+ {
+ auto machoPlatform = metadata->Get("machoplatform");
+ if (!machoPlatform || !machoPlatform->IsUnsignedInteger())
+ return nullptr;
+ if (machoPlatform->GetUnsignedInteger() != 2)
+ return g_macArm64;
+
+ return nullptr;
+ }
+};
+
+
+class IOSArmv7Platform: public Platform
+{
+public:
+ IOSArmv7Platform(Architecture* arch, const std::string& name): Platform(arch, name)
+ {
+ Ref<CallingConvention> cc;
+
+ cc = arch->GetCallingConventionByName("cdecl");
+ if (cc)
+ {
+ RegisterDefaultCallingConvention(cc);
+ RegisterCdeclCallingConvention(cc);
+ RegisterFastcallCallingConvention(cc);
+ RegisterStdcallCallingConvention(cc);
+ }
+ }
+
+ virtual bool GetFallbackEnabled() override
+ {
+ return false;
+ }
+
+ static Ref<Platform> Recognize(BinaryView* view, Metadata* metadata)
+ {
+ auto machoPlatform = metadata->Get("machoplatform");
+ if (!machoPlatform || !machoPlatform->IsUnsignedInteger())
+ return nullptr;
+ if (machoPlatform->GetUnsignedInteger() == 2)
+ return g_iosArmv7;
+
+ return nullptr;
+ }
+};
+
+class IOSArm64Platform: public Platform
+{
+public:
+ IOSArm64Platform(Architecture* arch): Platform(arch, "ios-aarch64")
+ {
+ Ref<CallingConvention> cc;
+
+ cc = arch->GetCallingConventionByName("apple-arm64");
+ if (cc)
+ {
+ RegisterDefaultCallingConvention(cc);
+ RegisterCdeclCallingConvention(cc);
+ RegisterFastcallCallingConvention(cc);
+ RegisterStdcallCallingConvention(cc);
+ }
+ }
+
+ virtual bool GetFallbackEnabled() override
+ {
+ return false;
+ }
+
+ static Ref<Platform> Recognize(BinaryView* view, Metadata* metadata)
+ {
+ auto machoPlatform = metadata->Get("machoplatform");
+ if (!machoPlatform || !machoPlatform->IsUnsignedInteger())
+ return nullptr;
+ if (machoPlatform->GetUnsignedInteger() == 2)
+ return g_iosArm64;
+
+ return nullptr;
+ }
};
@@ -126,50 +243,55 @@ extern "C"
BINARYNINJAPLUGIN bool CorePluginInit()
#endif
{
+ auto viewType = BinaryViewType::GetByName("Mach-O");
Ref<Architecture> x86 = Architecture::GetByName("x86");
if (x86)
{
- Ref<Platform> platform;
-
- platform = new MacX86Platform(x86);
- Platform::Register("mac", platform);
- BinaryViewType::RegisterPlatform("Mach-O", 0, x86, platform);
+ g_macX86 = new MacX86Platform(x86);
+ Platform::Register("mac", g_macX86);
+ viewType->RegisterPlatformRecognizer(7, LittleEndian, MacX86Platform::Recognize);
}
Ref<Architecture> x64 = Architecture::GetByName("x86_64");
if (x64)
{
- Ref<Platform> platform;
-
- platform = new MacX64Platform(x64);
- Platform::Register("mac", platform);
- BinaryViewType::RegisterPlatform("Mach-O", 0, x64, platform);
+ g_macX64 = new MacX64Platform(x64);
+ Platform::Register("mac", g_macX64);
+ viewType->RegisterPlatformRecognizer(0x01000007, LittleEndian, MacX64Platform::Recognize);
}
Ref<Architecture> armv7 = Architecture::GetByName("armv7");
Ref<Architecture> thumb2 = Architecture::GetByName("thumb2");
if (armv7 && thumb2)
{
- Ref<Platform> armPlatform, thumbPlatform;
-
- armPlatform = new MacArmv7Platform(armv7, "mac-armv7");
- thumbPlatform = new MacArmv7Platform(thumb2, "mac-thumb2");
- armPlatform->AddRelatedPlatform(thumb2, thumbPlatform);
- thumbPlatform->AddRelatedPlatform(armv7, armPlatform);
- Platform::Register("mac", armPlatform);
- Platform::Register("mac", thumbPlatform);
- BinaryViewType::RegisterPlatform("Mach-O", 0, armv7, armPlatform);
+ g_macArmv7 = new MacArmv7Platform(armv7, "mac-armv7");
+ g_macThumb2 = new MacArmv7Platform(thumb2, "mac-thumb2");
+ g_iosArmv7 = new IOSArmv7Platform(armv7, "ios-armv7");
+ g_iosThumb2 = new IOSArmv7Platform(thumb2, "ios-thumb2");
+ g_macArmv7->AddRelatedPlatform(thumb2, g_macThumb2);
+ g_macThumb2->AddRelatedPlatform(armv7, g_macArmv7);
+ g_iosArmv7->AddRelatedPlatform(thumb2, g_iosThumb2);
+ g_iosThumb2->AddRelatedPlatform(armv7, g_iosArmv7);
+ Platform::Register("mac", g_macArmv7);
+ Platform::Register("ios", g_iosArmv7);
+ Platform::Register("mac", g_macThumb2);
+ Platform::Register("ios", g_iosThumb2);
+ viewType->RegisterPlatformRecognizer(0xc, LittleEndian, MacArmv7Platform::Recognize);
+ viewType->RegisterPlatformRecognizer(0xc, LittleEndian, IOSArmv7Platform::Recognize);
}
Ref<Architecture> arm64 = Architecture::GetByName("aarch64");
if (arm64)
{
- Ref<Platform> platform;
-
- platform = new MacArm64Platform(arm64);
- Platform::Register("mac", platform);
- BinaryViewType::RegisterPlatform("Mach-O", 9, arm64, platform);
- BinaryViewType::RegisterPlatform("Mach-O", 0, arm64, platform);
+ g_macArm64 = new MacArm64Platform(arm64);
+ g_iosArm64 = new IOSArm64Platform(arm64);
+ Platform::Register("mac", g_macArm64);
+ Platform::Register("ios", g_iosArm64);
+ viewType->RegisterPlatformRecognizer(0, LittleEndian, MacArm64Platform::Recognize);
+ viewType->RegisterPlatformRecognizer(0x0100000c, LittleEndian, MacArm64Platform::Recognize);
+ viewType->RegisterPlatformRecognizer(0x0200000c, LittleEndian, MacArm64Platform::Recognize);
+ viewType->RegisterPlatformRecognizer(0, LittleEndian, IOSArm64Platform::Recognize);
+ viewType->RegisterPlatformRecognizer(0x0100000c, LittleEndian, IOSArm64Platform::Recognize);
}
return true;