summaryrefslogtreecommitdiff
path: root/python/examples/cli_dis.py
diff options
context:
space:
mode:
authorAndrew Lamoureux <andrew@vector35.com>2020-04-20 14:20:28 -0400
committerAndrew Lamoureux <andrew@vector35.com>2020-04-20 14:20:28 -0400
commit77282a3b432aeb53a115a10f9f20802019c4609b (patch)
tree38ce191228c4896cd93ba184f14404aa9c0b197d /python/examples/cli_dis.py
parent099f07c4ca30d4629e36624bad1c5c50695d584e (diff)
Add python examples: cli lifter and disassembler
Diffstat (limited to 'python/examples/cli_dis.py')
-rwxr-xr-xpython/examples/cli_dis.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/python/examples/cli_dis.py b/python/examples/cli_dis.py
new file mode 100755
index 00000000..09870bac
--- /dev/null
+++ b/python/examples/cli_dis.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+#
+# command-line BinaryNinja disassembler
+#
+# BinaryNinja multiplatform version of Z0MBIE's PE_STAT for opcode frequency
+# statistics http://z0mbie.dreamhosters.com/opcodes.html
+#
+# Copyright (c) 2020 Vector 35 Inc
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+import sys
+import binaryninja
+
+GREEN = '\x1B[32m'
+NORMAL = '\x1B[0m'
+
+if not sys.argv[2:]:
+ print('usage: %s <arch> <bytes>' % sys.argv[0])
+ print('examples:')
+ print(' eg: %s aarch64 ff 43 00 d1' % sys.argv[0])
+ print(' eg: %s armv7 14 d0 4d e2' % sys.argv[0])
+ print(' eg: %s armv7eb 14 d0 4d e2' % sys.argv[0])
+ print(' eg: %s mips32 27 bd ff f0' % sys.argv[0])
+ print(' eg: %s mipsel32 f0 ff bd 27' % sys.argv[0])
+ print(' eg: %s ppc 93 e1 ff fc' % sys.argv[0])
+ print(' eg: %s ppc_le fc ff e1 93' % sys.argv[0])
+ print(' eg: %s thumb2 85 b0' % sys.argv[0])
+ print(' eg: %s thumb2eb b0 85' % sys.argv[0])
+ print(' eg: %s x86 55' % sys.argv[0])
+ print(' eg: %s x86_64 55' % sys.argv[0])
+ print('')
+ print('architectures:')
+ print('\t' + '\n\t'.join(map(lambda x: x.name, list(binaryninja.Architecture))))
+ sys.exit(-1)
+
+# divide arguments
+archName = sys.argv[1]
+bytesList = sys.argv[2:]
+
+# parse byte arguments
+data = b''.join(list(map(lambda x: int(x,16).to_bytes(1,'big'), bytesList)))
+
+# disassemble
+arch = binaryninja.Architecture[archName]
+toksAndLen = arch.get_instruction_text(data, 0)
+if not toksAndLen or toksAndLen[1]==0:
+ print('disassembly failed')
+ sys.exit(-1)
+
+# report
+toks = toksAndLen[0]
+strs = map(lambda x: x.text, toks)
+print(GREEN, ''.join(strs), NORMAL)
+