diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2023-06-13 11:29:42 -0600 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2023-06-13 16:46:47 -0400 |
| commit | 52eb0de5dcddaee2b8bd3122512ae4c20e0e9545 (patch) | |
| tree | 8543df055ebc32d32283c0231cbeb6c7fd424533 /platform/mac | |
| parent | adb7ef55fc4e24f03e6faf353cc9122ee07c714f (diff) | |
Move platform submodules into API
Diffstat (limited to 'platform/mac')
| -rw-r--r-- | platform/mac/CMakeLists.txt | 33 | ||||
| -rw-r--r-- | platform/mac/LICENSE | 13 | ||||
| -rw-r--r-- | platform/mac/README.md | 23 | ||||
| -rw-r--r-- | platform/mac/platform_mac.cpp | 157 |
4 files changed, 226 insertions, 0 deletions
diff --git a/platform/mac/CMakeLists.txt b/platform/mac/CMakeLists.txt new file mode 100644 index 00000000..9ead5abd --- /dev/null +++ b/platform/mac/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.9 FATAL_ERROR) + +project(platform_mac) + +if(NOT BN_INTERNAL_BUILD) + add_subdirectory(${PROJECT_SOURCE_DIR}/../.. ${PROJECT_BINARY_DIR}/api) +endif() + +file(GLOB SOURCES + ${PROJECT_SOURCE_DIR}/*.cpp + ${PROJECT_SOURCE_DIR}/*.h) + +if(DEMO) + add_library(platform_mac STATIC ${SOURCES}) +else() + add_library(platform_mac SHARED ${SOURCES}) +endif() + +target_link_libraries(platform_mac binaryninjaapi) + +set_target_properties(platform_mac PROPERTIES + CXX_STANDARD 17 + CXX_VISIBILITY_PRESET hidden + CXX_STANDARD_REQUIRED ON + VISIBILITY_INLINES_HIDDEN ON + POSITION_INDEPENDENT_CODE ON) + +if(BN_INTERNAL_BUILD) + plugin_rpath(platform_mac) + set_target_properties(platform_mac PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${BN_CORE_PLUGIN_DIR} + RUNTIME_OUTPUT_DIRECTORY ${BN_CORE_PLUGIN_DIR}) +endif() diff --git a/platform/mac/LICENSE b/platform/mac/LICENSE new file mode 100644 index 00000000..265883c5 --- /dev/null +++ b/platform/mac/LICENSE @@ -0,0 +1,13 @@ +Copyright 2021 Vector 35 Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/platform/mac/README.md b/platform/mac/README.md new file mode 100644 index 00000000..043fe035 --- /dev/null +++ b/platform/mac/README.md @@ -0,0 +1,23 @@ +# platform-mac +This is the macOS platform plugin that ships with Binary Ninja. + +## Building + +Building the architecture plugin requires `cmake` 3.9 or above. You will also need the +[Binary Ninja API source](https://github.com/Vector35/binaryninja-api). + +Run `cmake`. This can be done either from a separate build directory or from the source +directory. Once that is complete, run `make` in the build directory to compile the plugin. + +The plugin can be found in the root of the build directory as `libplatform_mac.so`, +`libplatform_mac.dylib` or `platform_mac.dll` depending on your platform. + +To install the plugin, first launch Binary Ninja and uncheck the "macOS platform plugin" +option in the "Core Plugins" section. This will cause Binary Ninja to stop loading the +bundled plugin so that its replacement can be loaded. Once this is complete, you can copy +the plugin into the user plugins directory (you can locate this by using the "Open Plugin Folder" +option in the Binary Ninja UI). + +**Do not replace the architecture plugin in the Binary Ninja install directory. This will +be overwritten every time there is a Binary Ninja update. Use the above process to ensure that +updates do not automatically uninstall your custom build.** diff --git a/platform/mac/platform_mac.cpp b/platform/mac/platform_mac.cpp new file mode 100644 index 00000000..34833b67 --- /dev/null +++ b/platform/mac/platform_mac.cpp @@ -0,0 +1,157 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +class MacX86Platform: public Platform +{ +public: + MacX86Platform(Architecture* arch): Platform(arch, "mac-x86") + { + Ref<CallingConvention> cc; + + cc = arch->GetCallingConventionByName("cdecl"); + if (cc) + { + RegisterDefaultCallingConvention(cc); + RegisterCdeclCallingConvention(cc); + } + + cc = arch->GetCallingConventionByName("regparm"); + if (cc) + RegisterFastcallCallingConvention(cc); + + cc = arch->GetCallingConventionByName("stdcall"); + if (cc) + RegisterStdcallCallingConvention(cc); + } +}; + + +class MacX64Platform: public Platform +{ +public: + MacX64Platform(Architecture* arch): Platform(arch, "mac-x86_64") + { + Ref<CallingConvention> cc; + + cc = arch->GetCallingConventionByName("sysv"); + if (cc) + { + RegisterDefaultCallingConvention(cc); + RegisterCdeclCallingConvention(cc); + RegisterFastcallCallingConvention(cc); + RegisterStdcallCallingConvention(cc); + } + } +}; + + +class MacArmv7Platform: public Platform +{ +public: + MacArmv7Platform(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); + } + } +}; + + +class MacArm64Platform: public Platform +{ +public: + MacArm64Platform(Architecture* arch): Platform(arch, "mac-aarch64") + { + Ref<CallingConvention> cc; + + cc = arch->GetCallingConventionByName("apple-arm64"); + if (cc) + { + RegisterDefaultCallingConvention(cc); + RegisterCdeclCallingConvention(cc); + RegisterFastcallCallingConvention(cc); + RegisterStdcallCallingConvention(cc); + } + } +}; + + +extern "C" +{ + BN_DECLARE_CORE_ABI_VERSION + +#ifndef DEMO_VERSION + BINARYNINJAPLUGIN void CorePluginDependencies() + { + AddOptionalPluginDependency("arch_x86"); + AddOptionalPluginDependency("arch_armv7"); + AddOptionalPluginDependency("arch_arm64"); + AddOptionalPluginDependency("view_macho"); + } +#endif + +#ifdef DEMO_VERSION + bool MacPluginInit() +#else + BINARYNINJAPLUGIN bool CorePluginInit() +#endif + { + 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); + } + + 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); + } + + 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); + } + + 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); + } + + return true; + } +} |
