diff options
Diffstat (limited to 'python')
| -rwxr-xr-x | python/examples/cli_dis.py | 71 | ||||
| -rwxr-xr-x | python/examples/cli_lift.py | 90 |
2 files changed, 161 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) + diff --git a/python/examples/cli_lift.py b/python/examples/cli_lift.py new file mode 100755 index 00000000..70371dcc --- /dev/null +++ b/python/examples/cli_lift.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# +# command-line BinaryNinja lifter +# +# 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 +from binaryninja import core +from binaryninja import binaryview +from binaryninja import lowlevelil + +RED = '\x1B[31m' +NORMAL = '\x1B[0m' + +def traverse_IL(il, indent): + if isinstance(il, lowlevelil.LowLevelILInstruction): + print('\t'*indent + il.operation.name) + + for o in il.operands: + traverse_IL(o, indent+1) + + else: + print('\t'*indent + str(il)) + +if __name__ == '__main__': + + if not sys.argv[2:]: + print('usage: %s <platform> <bytes>' % sys.argv[0]) + print('') + print('examples:') + print(' eg: %s linux-armv7 14 d0 4d e2 01 20 a0 e1 00 30 a0 e1 00 c0 a0 e3' % sys.argv[0]) + print('') + print('platforms:') + print('\t' + '\n\t'.join(map(str, list(binaryninja.Platform)))) + + sys.exit(-1) + + # divide arguments + platName = sys.argv[1] + archName = platName.split('-')[1] + bytesList = sys.argv[2:] + + # parse byte arguments + data = b''.join(list(map(lambda x: int(x,16).to_bytes(1,'big'), bytesList))) + + plat = binaryninja.Platform[platName] + bv = binaryview.BinaryView.new(data) + bv.platform = plat + + bv.add_function(0, plat=plat) + +# print('print all the functions, their basic blocks, and their mc instructions') +# for func in bv.functions: +# print(repr(func)) +# for block in func: +# print("\t{0}".format(block)) +# for insn in block: +# print("\t\t{0}".format(insn)) + + print(RED) + for func in bv.functions: + #print(repr(func)) + for block in func.low_level_il: + #print("\t{0}".format(block)) + for insn in block: + traverse_IL(insn, 0) + print(NORMAL) + |
