summaryrefslogtreecommitdiff
path: root/python/examples
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-05-17 23:37:05 -0400
committerRusty Wagner <rusty@vector35.com>2016-05-17 23:37:05 -0400
commitd22baeac7625fc6baf16588866400ed5da80b595 (patch)
tree6c510ea67f40d17e0a1fdab33059222a0fd082e1 /python/examples
parent3c9ce9e4b3a3e31df64924df0117e7360afb7a46 (diff)
parent3a56ec2358d4812b18745847baeba1b486291a9f (diff)
Merge branch 'dev' of github.com:Vector35/binaryninja-api into dev
Diffstat (limited to 'python/examples')
-rw-r--r--python/examples/README.md4
-rw-r--r--python/examples/version-switcher.py119
2 files changed, 122 insertions, 1 deletions
diff --git a/python/examples/README.md b/python/examples/README.md
index 4ad4ac03..7fd3ab6b 100644
--- a/python/examples/README.md
+++ b/python/examples/README.md
@@ -1,11 +1,12 @@
# Binary Ninja Python API Examples
-The following examples demonstrate the Binary Ninja API. They include both stand-alone examples that directly call into the core, as well as examples meant to be loaded as plugins.
+The following examples demonstrate some of the Binary Ninja API. They include both stand-alone examples that directly call into the core without a GUI, as well as examples meant to be loaded as plugins available from the UI.
## Stand-alone
* bin-info.py - general binary information
* arm-syscall.py - extract syscall numbers from IL for arm Mach-O files
+* version-switcher.py - uses the update API to see raw version notes and manually downgrade or upgrade
To use the stand-alone Python examples, make sure your `PYTHON_PATH` includes the API, like:
@@ -17,6 +18,7 @@ PYTHONPATH=$PYTHONPATH:/Applications/Binary\ Ninja.app/Contents/Resources/python
* nes.py - 6502 CPU architecture including LLIL lifting and `.NES` file format parser
* breakpoint.py - small example showing how to modify a file and register a GUI menu item
+* jump-table.py - stop-gap jump table plugin triggered via right-click menu at an indirect jump
Plugins are meant to be loaded into a running Binary Ninja GUI and should either be copied or symlinked into the appropriate plugin folder. You'll need to then re-start Binary Ninja.
diff --git a/python/examples/version-switcher.py b/python/examples/version-switcher.py
new file mode 100644
index 00000000..a1936a52
--- /dev/null
+++ b/python/examples/version-switcher.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+import sys
+import binaryninja
+import datetime
+
+chandefault="private-beta"
+channel=0
+versions=0
+
+def load_channel(newchannel):
+ global channel
+ global versions
+ if (channel != 0 and newchannel == channel.name):
+ print "Same channel, not updating."
+ else:
+ try:
+ print "Loading channel %s" % newchannel
+ channel = binaryninja.UpdateChannel[newchannel]
+ print "Loading versions..."
+ versions = channel.versions
+ except Exception:
+ print "%s is not a valid channel name. Defaulting to " % chandefault
+ channel = binaryninja.UpdateChannel[chandefault]
+
+def select(version):
+ done = False
+ date = datetime.datetime.fromtimestamp(version.time).strftime('%c')
+ while not done:
+ print "Version:\t%s" % version.version
+ print "Updated:\t%s" % date
+ print "Notes:\n\n-----\n%s" % version.notes
+ print "-----"
+ print "\t1)\tSwitch to version"
+ print "\t2)\tMain Menu"
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection == 2):
+ done = True
+ elif (selection == 1):
+ if (version.version == channel.latest_version.version):
+ print "Requesting update to latest version."
+ else:
+ print "Requesting update to prior version."
+ if binaryninja.are_auto_updates_enabled():
+ print "Disabling automatic updates."
+ binaryninja.set_auto_updates_enabled(False)
+ if (version.version == binaryninja.core_version):
+ print "Already running %s" % version.version
+ else:
+ print "version.version %s" % version.version
+ print "binaryninja.core_version %s" % binaryninja.core_version
+ print "Updating..."
+ print version.update()
+ #forward updating won't work without reloading
+ sys.exit()
+ else:
+ print "Invalid selection"
+
+def list_channels():
+ done = False
+ print "\tSelect channel:\n"
+ while not done:
+ channel_list = binaryninja.UpdateChannel.list
+ for index, item in enumerate(channel_list):
+ print "\t%d)\t%s" % (index+1, item.name)
+ print "\t%d)\t%s" % (len(channel_list)+1, "Main Menu")
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection <= 0 or selection > len(channel_list)+1):
+ print "%s is an invalid choice." % selection
+ else:
+ done = True
+ if (selection != len(channel_list) + 1):
+ load_channel(channel_list[selection - 1].name)
+
+def toggle_updates():
+ binaryninja.set_auto_updates_enabled(not binaryninja.are_auto_updates_enabled())
+
+def main():
+ global channel
+ done = False
+ load_channel(chandefault)
+ while not done:
+ print "\n\tBinary Ninja Version Switcher"
+ print "\t\tCurrent Channel:\t%s" % channel.name
+ print "\t\tCurrent Version:\t%s" % binaryninja.core_version
+ print "\t\tAuto-Updates On:\t%s\n" % binaryninja.are_auto_updates_enabled()
+ for index, version in enumerate(versions):
+ date = datetime.datetime.fromtimestamp(version.time).strftime('%c')
+ print "\t%d)\t%s (%s)" % (index + 1, version.version, date)
+ print "\t%d)\t%s" % (len(versions) + 1, "Switch Channel")
+ print "\t%d)\t%s" % (len(versions) + 2, "Toggle Auto Updates")
+ print "\t%d)\t%s" % (len(versions) + 3, "Exit")
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection <= 0 or selection > len(versions) + 3):
+ print "%d is an invalid choice.\n\n" % selection
+ else:
+ if (selection == len(versions) + 3):
+ done = True
+ elif (selection == len(versions) + 2):
+ toggle_updates()
+ elif (selection == len(versions) + 1):
+ list_channels()
+ else:
+ select(versions[selection - 1])
+
+
+if __name__ == "__main__":
+ main()