Skip to content

Commit 9c1a21b

Browse files
committed
Renamed Struct.py to fix case-sensitive filesystem fun on linux and
rewrote loadPixMap to fix loading of icons when not being run from the same directory.
1 parent 2e1b76f commit 9c1a21b

File tree

5 files changed

+274
-13
lines changed

5 files changed

+274
-13
lines changed

ElfFile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515

1616
from BinaryData import *
17-
from Struct import *
17+
from Structure import *
1818
from HexEditor import *
1919
from View import *
2020

@@ -30,7 +30,7 @@ def __init__(self, data):
3030
return
3131

3232
try:
33-
self.tree = Struct(self.data)
33+
self.tree = Structure(self.data)
3434
self.header = self.tree.struct("ELF header", "header")
3535
self.header.struct("ELF identification", "ident")
3636

MachOFile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515

1616
from BinaryData import *
17-
from Struct import *
17+
from Structure import *
1818
from HexEditor import *
1919
from View import *
2020

@@ -31,7 +31,7 @@ def __init__(self, data):
3131
return
3232

3333
try:
34-
self.tree = Struct(self.data)
34+
self.tree = Structure(self.data)
3535
self.header = self.tree.struct("Mach-O header", "header")
3636

3737
self.header.uint32_le("magic")

PEFile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515

1616
from BinaryData import *
17-
from Struct import *
17+
from Structure import *
1818
from HexEditor import *
1919
from View import *
2020

@@ -38,7 +38,7 @@ def __init__(self, data):
3838
return
3939

4040
try:
41-
self.tree = Struct(self.data)
41+
self.tree = Structure(self.data)
4242
self.mz = self.tree.struct("MZ header", "mz")
4343
self.mz.uint16("magic")
4444
self.mz.uint16("lastsize")

Structure.py

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
# Copyright (c) 2011-2015 Rusty Wagner
2+
#
3+
# This program is free software: you can redistribute it and/or modify
4+
# it under the terms of the GNU General Public License as published by
5+
# the Free Software Foundation, either version 2 of the License, or
6+
# (at your option) any later version.
7+
#
8+
# This program is distributed in the hope that it will be useful,
9+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
# GNU General Public License for more details.
12+
#
13+
# You should have received a copy of the GNU General Public License
14+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
16+
from BinaryData import *
17+
18+
19+
class _ParserState:
20+
def __init__(self, data, ofs):
21+
self.data = data
22+
self.offset = ofs
23+
24+
25+
class Array:
26+
def __init__(self, state, count):
27+
self._state = state
28+
self.elements = []
29+
for i in range(0, count):
30+
self.elements += [Structure(state.data, state)]
31+
32+
def append(self):
33+
self.elements.append(Structure(self._state.data, self._state))
34+
35+
def getStart(self):
36+
start = None
37+
for i in self.elements:
38+
if (start == None) or (i.getStart() < start):
39+
start = i.getStart()
40+
if start == None:
41+
return 0
42+
return start
43+
44+
def getSize(self):
45+
start = self.getStart()
46+
end = None
47+
for i in self.elements:
48+
if (end == None) or ((i.getStart() + i.getSize()) > end):
49+
end = i.getStart() + i.getSize()
50+
if end == None:
51+
return 0
52+
return end - start
53+
54+
def complete(self):
55+
for i in self.elements:
56+
i.complete()
57+
58+
def __getitem__(self, index):
59+
return self.elements[index]
60+
61+
def __len__(self):
62+
return len(self.elements)
63+
64+
65+
class Structure:
66+
def __init__(self, data, state = None):
67+
self._data = data
68+
self._state = state
69+
if state == None:
70+
self._state = _ParserState(data, 0)
71+
self._names = {}
72+
self._order = []
73+
self._start = {}
74+
self._size = {}
75+
self._type = {}
76+
77+
def seek(self, ofs):
78+
self._state.offset = ofs
79+
80+
def struct(self, name, id = None):
81+
if id == None:
82+
id = name
83+
result = Structure(self._data, self._state)
84+
self.__dict__[id] = result
85+
self._names[id] = name
86+
self._type[id] = "struct"
87+
self._order += [id]
88+
return result
89+
90+
def array(self, count, name, id = None):
91+
if id == None:
92+
id = name
93+
result = Array(self._state, count)
94+
self.__dict__[id] = result
95+
self._names[id] = name
96+
self._type[id] = "array"
97+
self._order += [id]
98+
return result
99+
100+
def bytes(self, count, name, id = None):
101+
if id == None:
102+
id = name
103+
result = self._data.read(self._state.offset, count)
104+
self.__dict__[id] = result
105+
self._names[id] = name
106+
self._start[id] = self._state.offset
107+
self._size[id] = count
108+
self._type[id] = "bytes"
109+
self._order += [id]
110+
self._state.offset += count
111+
return result
112+
113+
def uint8(self, name, id = None):
114+
if id == None:
115+
id = name
116+
result = self._data.read_uint8(self._state.offset)
117+
self.__dict__[id] = result
118+
self._names[id] = name
119+
self._start[id] = self._state.offset
120+
self._size[id] = 1
121+
self._type[id] = "uint8"
122+
self._order += [id]
123+
self._state.offset += 1
124+
return result
125+
126+
def uint16(self, name, id = None):
127+
if id == None:
128+
id = name
129+
result = self._data.read_uint16(self._state.offset)
130+
self.__dict__[id] = result
131+
self._names[id] = name
132+
self._start[id] = self._state.offset
133+
self._size[id] = 2
134+
self._type[id] = "uint16"
135+
self._order += [id]
136+
self._state.offset += 2
137+
return result
138+
139+
def uint32(self, name, id = None):
140+
if id == None:
141+
id = name
142+
result = self._data.read_uint32(self._state.offset)
143+
self.__dict__[id] = result
144+
self._names[id] = name
145+
self._start[id] = self._state.offset
146+
self._size[id] = 4
147+
self._type[id] = "uint32"
148+
self._order += [id]
149+
self._state.offset += 4
150+
return result
151+
152+
def uint64(self, name, id = None):
153+
if id == None:
154+
id = name
155+
result = self._data.read_uint64(self._state.offset)
156+
self.__dict__[id] = result
157+
self._names[id] = name
158+
self._start[id] = self._state.offset
159+
self._size[id] = 8
160+
self._type[id] = "uint64"
161+
self._order += [id]
162+
self._state.offset += 8
163+
return result
164+
165+
def uint16_le(self, name, id = None):
166+
if id == None:
167+
id = name
168+
result = self._data.read_uint16_le(self._state.offset)
169+
self.__dict__[id] = result
170+
self._names[id] = name
171+
self._start[id] = self._state.offset
172+
self._size[id] = 2
173+
self._type[id] = "uint16_le"
174+
self._order += [id]
175+
self._state.offset += 2
176+
return result
177+
178+
def uint32_le(self, name, id = None):
179+
if id == None:
180+
id = name
181+
result = self._data.read_uint32_le(self._state.offset)
182+
self.__dict__[id] = result
183+
self._names[id] = name
184+
self._start[id] = self._state.offset
185+
self._size[id] = 4
186+
self._type[id] = "uint32_le"
187+
self._order += [id]
188+
self._state.offset += 4
189+
return result
190+
191+
def uint64_le(self, name, id = None):
192+
if id == None:
193+
id = name
194+
result = self._data.read_uint64_le(self._state.offset)
195+
self.__dict__[id] = result
196+
self._names[id] = name
197+
self._start[id] = self._state.offset
198+
self._size[id] = 8
199+
self._type[id] = "uint64_le"
200+
self._order += [id]
201+
self._state.offset += 8
202+
return result
203+
204+
def uint16_be(self, name, id = None):
205+
if id == None:
206+
id = name
207+
result = self._data.read_uint16_be(self._state.offset)
208+
self.__dict__[id] = result
209+
self._names[id] = name
210+
self._start[id] = self._state.offset
211+
self._size[id] = 2
212+
self._type[id] = "uint16_be"
213+
self._order += [id]
214+
self._state.offset += 2
215+
return result
216+
217+
def uint32_be(self, name, id = None):
218+
if id == None:
219+
id = name
220+
result = self._data.read_uint32_be(self._state.offset)
221+
self.__dict__[id] = result
222+
self._names[id] = name
223+
self._start[id] = self._state.offset
224+
self._size[id] = 4
225+
self._type[id] = "uint32_be"
226+
self._order += [id]
227+
self._state.offset += 4
228+
return result
229+
230+
def uint64_be(self, name, id = None):
231+
if id == None:
232+
id = name
233+
result = self._data.read_uint64_be(self._state.offset)
234+
self.__dict__[id] = result
235+
self._names[id] = name
236+
self._start[id] = self._state.offset
237+
self._size[id] = 8
238+
self._type[id] = "uint64_be"
239+
self._order += [id]
240+
self._state.offset += 8
241+
return result
242+
243+
def getStart(self):
244+
self.complete()
245+
start = None
246+
for i in self._order:
247+
if (start == None) or (self._start[i] < start):
248+
start = self._start[i]
249+
return start
250+
251+
def getSize(self):
252+
start = self.getStart()
253+
end = None
254+
for i in self._order:
255+
if (end == None) or ((self._start[i] + self._size[i]) > end):
256+
end = self._start[i] + self._size[i]
257+
if end == None:
258+
return None
259+
return end - start
260+
261+
def complete(self):
262+
for i in self._order:
263+
if (not self._start.has_key(i)) or (not self._size.has_key(i)):
264+
self.__dict__[i].complete()
265+
self._start[i] = self.__dict__[i].getStart()
266+
self._size[i] = self.__dict__[i].getSize()
267+

binja.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,7 @@
4545

4646

4747
def loadPixmap(path):
48-
if os.path.basename(sys.executable).lower().find('python') != -1:
49-
# Run manually, use current directory
50-
return QPixmap(path)
51-
else:
52-
# Running the distributed version, compute path to image
53-
return QPixmap(os.path.join(os.path.dirname(sys.executable), path))
54-
48+
return QPixmap(os.path.join(os.path.dirname(os.path.realpath(__file__)),path))
5549

5650
class AboutDialog(QDialog):
5751
def __init__(self, parent=None):

0 commit comments

Comments
 (0)