diff options
| author | Rusty Wagner <rusty@vector35.com> | 2017-06-23 18:36:37 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2017-06-23 18:36:37 -0400 |
| commit | c51f3bed6bdef577253feee0e85a71fda1931bd7 (patch) | |
| tree | 1cf26ff28e0b9bfb6bfbed044ba7ca520d63f862 /examples/breakpoint | |
| parent | 4b988c0d24c8d8c8dc67485f3aaeb7106eb4af18 (diff) | |
| parent | cca0fe6ea60eb7f6b35cc433a6fff96cc65b3ff8 (diff) | |
Merge branch 'dev'
Diffstat (limited to 'examples/breakpoint')
| -rw-r--r-- | examples/breakpoint/CMakeLists.txt | 45 | ||||
| -rw-r--r-- | examples/breakpoint/Makefile | 57 | ||||
| -rw-r--r-- | examples/breakpoint/Makefile.win | 16 | ||||
| -rw-r--r-- | examples/breakpoint/src/breakpoint.cpp | 36 |
4 files changed, 154 insertions, 0 deletions
diff --git a/examples/breakpoint/CMakeLists.txt b/examples/breakpoint/CMakeLists.txt new file mode 100644 index 00000000..916778c8 --- /dev/null +++ b/examples/breakpoint/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) + +project(breakpoint CXX) + +add_library(${PROJECT_NAME} SHARED + src/breakpoint.cpp) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../..) + +if(WIN32) + set(BINJA_DIR "C:\\Program Files\\Vector35\\Binary Ninja" + CACHE PATH "Binary Ninja installation directory") + set(BINJA_BIN_DIR "${BINJA_DIR}") + set(BINJA_PLUGINS_DIR "$ENV{APPDATA}/Binary Ninja/plugins" + CACHE PATH "Binary Ninja user plugins directory") +elseif(APPLE) + set(BINJA_DIR "/Applications/Binary Ninja.app" + CACHE PATH "Binary Ninja installation directory") + set(BINJA_BIN_DIR "${BINJA_DIR}/Contents/MacOS") + set(BINJA_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins" + CACHE PATH "Binary Ninja user plugins directory") +else() + set(BINJA_DIR "$ENV{HOME}/binaryninja" + CACHE PATH "Binary Ninja installation directory") + set(BINJA_BIN_DIR "${BINJA_DIR}") + set(BINJA_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins" + CACHE PATH "Binary Ninja user plugins directory") +endif() + +find_library(BINJA_API_LIBRARY binaryninjaapi + HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../../bin) +find_library(BINJA_CORE_LIBRARY binaryninjacore + HINTS ${BINJA_BIN_DIR}) + +target_link_libraries(${PROJECT_NAME} + ${BINJA_API_LIBRARY} + ${BINJA_CORE_LIBRARY} + ) + +set_target_properties(${PROJECT_NAME} PROPERTIES + CXX_STANDARD 11 + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../bin + ) + +install(TARGETS ${PROJECT_NAME} DESTINATION ${BINJA_PLUGINS_DIR}) diff --git a/examples/breakpoint/Makefile b/examples/breakpoint/Makefile new file mode 100644 index 00000000..d85b63e5 --- /dev/null +++ b/examples/breakpoint/Makefile @@ -0,0 +1,57 @@ +# Path to prebuilt libbinaryninjaapi.a +BINJA_API_A := ../../bin/libbinaryninjaapi.a + +# Path to binaryninjaapi.h and json +INC := -I../../ + +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + # Path to binaryninja install + BINJAPATH := $(HOME)/binaryninja +else + BINJAPATH := /Applications/Binary\ Ninja.app/Contents/MacOS +endif + +SRCDIR := src +BUILDDIR := build +TARGETDIR := bin + +TARGETNAME := breakpoint +TARGET := $(TARGETDIR)/$(TARGETNAME) +INSTALLBINDIR := $(BINJAPATH)/plugins/ + +SRCEXT := cpp +SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT)) +OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o)) + +LIBS := -L $(BINJAPATH) -lbinaryninjacore +CFLAGS := -c -std=gnu++11 -O2 -Wall -W -fPIC -pipe +ifeq ($(UNAME_S),Linux) + CC := g++ +all: $(TARGET).so +else + CC := $(shell xcrun -f clang++) + CFLAGS += -arch x86_64 -pipe -stdlib=libc++ -mmacosx-version-min=10.7 +all: $(TARGET).dylib +endif + +$(TARGET).so: $(OBJECTS) + @mkdir -p $(TARGETDIR) + $(CC) -shared $^ $(BINJA_API_A) $(LIBS) -o $@ + +$(TARGET).dylib: $(OBJECTS) + @mkdir -p $(TARGETDIR) + $(CC) -dynamiclib $^ $(BINJA_API_A) $(LIBS) -o $@ + install_name_tool -id @loader_path/$(TARGETNAME).dylib -add_rpath @loader_path/.. $@ + +$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) + @mkdir -p $(BUILDDIR) + $(CC) $(CFLAGS) $(INC) -c -o $@ $< + +clean: + $(RM) -r $(BUILDDIR) $(TARGETDIR) + +install: + cp $(TARGET) $(INSTALLBINDIR) + +.PHONY: clean diff --git a/examples/breakpoint/Makefile.win b/examples/breakpoint/Makefile.win new file mode 100644 index 00000000..00cbbfa1 --- /dev/null +++ b/examples/breakpoint/Makefile.win @@ -0,0 +1,16 @@ +BINJA_API_INC_PATH = ..\..\ +BINJA_API_LIB = ..\..\bin\libbinaryninjaapi.lib +BINJA_CORE_LIB = "c:\Program Files\Vector35\BinaryNinja\binaryninjacore.lib" + +FLAGS = /DWIN32 /D__WIN32__ /EHsc /I$(BINJA_API_INC_PATH) /link $(BINJA_API_LIB) $(BINJA_CORE_LIB) + +bininfo.dll: ./src/breakpoint.cpp + if not exist bin mkdir bin + cl ./src/breakpoint.cpp /LD $(FLAGS) /OUT:.\bin\breakpoint.dll + +clean: + if exist *.obj del *.obj + if exist *.exp del *.exp + if exist *.lib del *.lib + if exist *.dll del *.dll + if exist .\bin del /S /Q bin diff --git a/examples/breakpoint/src/breakpoint.cpp b/examples/breakpoint/src/breakpoint.cpp new file mode 100644 index 00000000..4fac98ac --- /dev/null +++ b/examples/breakpoint/src/breakpoint.cpp @@ -0,0 +1,36 @@ +#include <inttypes.h> +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + +void write_breakpoint(BinaryNinja::BinaryView *view, uint64_t start, uint64_t length) +{ + // Sample function to show registering a plugin menu item for a range of bytes. + // Also possible: + // register + // register_for_address + // register_for_function + + Ref<Architecture> arch = view->GetDefaultArchitecture(); + string arch_name = arch->GetName(); + + if (arch_name.compare(0, 3, "x86") == 0) { + string int3s = string(length, '\xcc'); + view->Write(start, int3s.c_str(), length); + } else { + LogError("No support for breakpoint on %s", arch_name.c_str()); + } +} + +extern "C" +{ + BINARYNINJAPLUGIN bool CorePluginInit() + { + // Register the plugin with Binary Ninja + PluginCommand::RegisterForRange("Convert to breakpoint", + "Fill region with breakpoint instructions.", + &write_breakpoint); + return true; + } +}
\ No newline at end of file |
