From 5abb8218e5cd2be9b4cefb16eebdee6caf8108c6 Mon Sep 17 00:00:00 2001 From: bambu Date: Sun, 5 Jun 2016 21:14:13 -0400 Subject: Makefile for building binaryninja-api and example c++ plugin --- examples/breakpoint/Makefile | 57 ++++++++++++++++++++++++++++++++++ examples/breakpoint/src/breakpoint.cpp | 36 +++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 examples/breakpoint/Makefile create mode 100644 examples/breakpoint/src/breakpoint.cpp (limited to 'examples/breakpoint') 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/src/breakpoint.cpp b/examples/breakpoint/src/breakpoint.cpp new file mode 100644 index 00000000..41476411 --- /dev/null +++ b/examples/breakpoint/src/breakpoint.cpp @@ -0,0 +1,36 @@ +#include +#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 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; + } +} -- cgit v1.3.1 From 1f7523ce2b1edac1014d781fc771d5b82568e2f1 Mon Sep 17 00:00:00 2001 From: Andrew Lamoureux Date: Wed, 15 Mar 2017 18:13:07 -0400 Subject: build explanation, windows make files --- Makefile.win | 23 +++++++++++++++++++++++ README.md | 13 +++++++++++++ examples/bin-info/Makefile.win | 9 +++++++++ examples/breakpoint/Makefile.win | 16 ++++++++++++++++ examples/print_syscalls/Makefile.win | 9 +++++++++ 5 files changed, 70 insertions(+) create mode 100644 Makefile.win create mode 100644 examples/bin-info/Makefile.win create mode 100644 examples/breakpoint/Makefile.win create mode 100644 examples/print_syscalls/Makefile.win (limited to 'examples/breakpoint') diff --git a/Makefile.win b/Makefile.win new file mode 100644 index 00000000..ea95ba7b --- /dev/null +++ b/Makefile.win @@ -0,0 +1,23 @@ +CFLAGS = /EHsc /DWIN32 + +TARGETDIR = bin +TARGETNAME = libbinaryninjaapi.lib +TARGET = .\$(TARGETDIR)\$(TARGETNAME) + +OBJS = architecture.obj backgroundtask.obj basicblock.obj binaryninjaapi.obj binaryreader.obj binaryview.obj binaryviewtype.obj binarywriter.obj callingconvention.obj databuffer.obj demangle.obj fileaccessor.obj filemetadata.obj function.obj functiongraph.obj functiongraphblock.obj functionrecognizer.obj interaction.obj log.obj lowlevelil.obj mainthread.obj platform.obj plugin.obj scriptingprovider.obj tempfile.obj transform.obj type.obj update.obj jsoncpp.obj + +$(TARGET): $(OBJS) + if not exist $(TARGETDIR) mkdir $(TARGETDIR) + lib $(OBJS) /OUT:$(TARGET) + +jsoncpp.obj: json\jsoncpp.cpp + cl $(CFLAGS) /I. /c json\jsoncpp.cpp + +# nmake "inference rules" are gnu make "pattern rules" +.cpp.obj: + cl $(CFLAGS) /c $< + +clean: + if exist *.obj del *.obj + if exist $(TARGETDIR) del /Q /S $(TARGETDIR) + diff --git a/README.md b/README.md index 0bb4ee9b..be6c0b47 100644 --- a/README.md +++ b/README.md @@ -12,3 +12,16 @@ If interested in contributing, first please read and sign the [Contribution Lice The issue tracker for this repository tracks not only issues with the source code contained here but also the broader Binary Ninja product. +## Building + +Starting mid March 2017, the C++ portion of this API can be built into a static library (.a, .lib) that binary plugins can link against. Use Makefile on MacOS, Linux, and Windows mingw environments, and Makefile.win (nmake file) for Windows Visual Studio environment (nmake -f). + +The compiled API contains names and functions you can use from your plugins, but most of the implementation is missing until you link up against libbinaryninjacore.dylib or libbinaryninjacore.dll (via import file libbinaryninjacore.lib). See the ./examples. + +Since BinaryNinja is a 64-bit only product, ensure that you are using a 64-bit compiling and linking environment. Errors on windows like LNK1107 might indicate that your bits don't match. + +## Examples + +* bin-info is a standalone executable that prints some information about a given binary to stdout +* breakpoint is a plugin that allows you to select a region within an x86 binary and use the context menu to fill it with breakpoint bytes +* print_syscalls is a standalone executable that prints the syscalls used in a given binary diff --git a/examples/bin-info/Makefile.win b/examples/bin-info/Makefile.win new file mode 100644 index 00000000..b65bfb86 --- /dev/null +++ b/examples/bin-info/Makefile.win @@ -0,0 +1,9 @@ +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: ./src/bin-info.cpp + if not exist bin mkdir bin + cl ./src/bin-info.cpp $(FLAGS) /Fe:.\bin\bininfo 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/print_syscalls/Makefile.win b/examples/print_syscalls/Makefile.win new file mode 100644 index 00000000..afc0cbd8 --- /dev/null +++ b/examples/print_syscalls/Makefile.win @@ -0,0 +1,9 @@ +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) + +print_syscalls: ./src/arm-syscall.cpp + if not exist bin mkdir bin + cl ./src/arm-syscall.cpp $(FLAGS) /Fe:.\bin\print_syscalls -- cgit v1.3.1