diff options
| author | kat <kat@vector35.com> | 2024-06-27 12:45:20 -0400 |
|---|---|---|
| committer | kat <kat@vector35.com> | 2024-06-27 12:45:20 -0400 |
| commit | de5fdb36657a8a2ac500e4d924870c052c2941f7 (patch) | |
| tree | 43c14db7a2a8ab8603cb5e61a993d81f4021a275 /platform/mac | |
| parent | 015bb4fa79d01a1e2d4887cba96d150c7e1dd3bb (diff) | |
Add iOS Platforms. Add Mach-O Typelib support
Diffstat (limited to 'platform/mac')
| -rw-r--r-- | platform/mac/platform_mac.cpp | 172 |
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; |
