forked from decompiler-explorer/decompiler-explorer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdecompile_bn.py
69 lines (57 loc) · 2.24 KB
/
decompile_bn.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import html
import os
import sys
import tempfile
import binaryninja
from binaryninja import lineardisassembly
from binaryninja.function import DisassemblySettings
from binaryninja.enums import DisassemblyOption, LinearDisassemblyLineType, InstructionTextTokenType
def main():
t = tempfile.NamedTemporaryFile()
t.write(sys.stdin.buffer.read())
t.flush()
bv = binaryninja.open_view(t.name, update_analysis=True)
if bv is None:
raise Exception("Unable to open view for binary")
settings = DisassemblySettings()
settings.set_option(DisassemblyOption.ShowVariableTypesWhenAssigned)
settings.set_option(DisassemblyOption.GroupLinearDisassemblyFunctions)
settings.set_option(DisassemblyOption.WaitForIL)
for func in bv.functions:
obj = lineardisassembly.LinearViewObject.single_function_language_representation(func, settings)
cursor = obj.cursor
while True:
for line in cursor.lines:
if line.type in [
LinearDisassemblyLineType.FunctionHeaderStartLineType,
LinearDisassemblyLineType.FunctionHeaderEndLineType,
LinearDisassemblyLineType.AnalysisWarningLineType,
]:
continue
for i in line.contents.tokens:
if i.type == InstructionTextTokenType.TagToken:
continue
sys.stdout.write(str(i))
print("")
if not cursor.next():
break
if __name__ == "__main__":
os.environ['BN_DISABLE_USER_SETTINGS'] = '1'
os.environ['BN_DISABLE_USER_PLUGINS'] = '1'
os.environ['BN_DISABLE_REPOSITORY_PLUGINS'] = '1'
if len(sys.argv) > 1 and sys.argv[1] == '--version':
version = binaryninja.core_version()
if '-' in version:
version = version.split('-')[0]
if ' ' in version:
version = version.split(' ')[0]
print(version)
print(f'{binaryninja.core_build_id():x}')
sys.exit(0)
if len(sys.argv) > 1 and sys.argv[1] == '--name':
print('BinaryNinja')
sys.exit(0)
if len(sys.argv) > 1 and sys.argv[1] == '--url':
print('https://binary.ninja/')
sys.exit(0)
main()