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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/usr/bin/env python
from __future__ import print_function
import os
import sys
from distutils.core import setup
from distutils.dir_util import remove_tree
# Python2/3 compliance
try:
raw_input
except NameError:
raw_input = input
def cleanup_build_directory():
# Requires to chdir into the src directory first
try:
remove_tree("build")
except KeyboardInterrupt as e:
raise e
except Exception:
pass
def cleanup_module_directory():
# Installing doesn't remove old files that may have been deleted from the module.
if "install" in sys.argv:
try:
import binwalk
for path in binwalk.__path__:
try:
remove_tree(path + os.path.sep + "*")
except OSError as e:
pass
except ImportError:
pass
# Change to the binwalk src directory
def warning(lines, terminate=True, prompt=True):
WIDTH = 115
if not IGNORE_WARNINGS:
print("\n" + "*" * WIDTH)
for line in lines:
print(line)
print("*" * WIDTH, "\n")
if prompt:
if raw_input('Continue installation anyway (Y/n)? ').lower().startswith('n'):
terminate = True
else:
terminate = False
if terminate:
sys.exit(1)
# This is super hacky.
if "--yes" in sys.argv:
sys.argv.pop(sys.argv.index("--yes"))
IGNORE_WARNINGS = True
else:
IGNORE_WARNINGS = False
# cd into the src directory, no matter where setup.py was invoked from
os.chdir(os.path.join(os.path.dirname(os.path.realpath(__file__)), "src"))
print("checking pre-requisites")
try:
import magic
try:
magic.MAGIC_NO_CHECK_TEXT
except AttributeError as e:
msg = ["Pre-requisite failure: " + str(e),
"It looks like you have an old or incompatible magic module installed.",
"Please install the official python-magic module, or download and install it from source: ftp://ftp.astron.com/pub/file/"
]
warning(msg)
except ImportError as e:
msg = ["Pre-requisite failure:", str(e),
"Please install the python-magic module, or download and install it from source: ftp://ftp.astron.com/pub/file/",
]
warning(msg)
try:
import pyqtgraph
except ImportError as e:
msg = ["Pre-requisite check warning: " + str(e),
"To take advantage of this tool's graphing capabilities, please install the pyqtgraph module.",
]
warning(msg, prompt=True)
# Build / install C compression libraries
c_lib_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "C")
c_lib_makefile = os.path.join(c_lib_dir, "Makefile")
working_directory = os.getcwd()
os.chdir(c_lib_dir)
status = 0
if not os.path.exists(c_lib_makefile):
status |= os.system("./configure")
status |= os.system("make")
if status != 0:
msg = ["Build warning: failed to build C libraries.",
"Some features will not work without these libraries."
]
warning(msg, prompt=True)
elif "install" in sys.argv:
if os.system("make install") != 0:
msg = ["Install warning: failed to install C libraries.",
"Some features will not work without these libraries."
]
warning(msg, prompt=True)
os.system("make distclean")
os.chdir(working_directory)
cleanup_build_directory()
cleanup_module_directory()
# Generate a new magic file from the files in the magic directory
print("creating binwalk magic file")
magic_files = os.listdir("magic")
magic_files.sort()
fd = open("binwalk/magic/binwalk", "wb")
for magic in magic_files:
fpath = os.path.join("magic", magic)
if os.path.isfile(fpath):
fd.write(open(fpath, "rb").read())
fd.close()
# The data files to install along with the binwalk module
install_data_files = ["magic/*", "config/*", "plugins/*", "modules/*", "core/*"]
# Install the binwalk module, script and support files
setup( name = "binwalk",
version = "2.0.0 beta",
description = "Firmware analysis tool",
author = "Craig Heffner",
url = "https://github.com/devttys0/binwalk",
requires = ["magic", "pyqtgraph"],
packages = ["binwalk"],
package_data = {"binwalk" : install_data_files},
scripts = ["scripts/binwalk"],
)
cleanup_build_directory()