Skip to content

Commit 005567f

Browse files
committed
Added loadBlock for abstraction purposes
This was for a personal project where the bytecode was XOR'd with a key. Each call to lundump.c:LoadBlock() xor'd the data against a static key. This lets me easily reimplement that behavior.
1 parent 82fea6c commit 005567f

File tree

1 file changed

+16
-27
lines changed

1 file changed

+16
-27
lines changed

Diff for: luac.py

+16-27
Original file line numberDiff line numberDiff line change
@@ -83,56 +83,46 @@ def dis_chunk(chunk):
8383
print(lua_opcode_names[i['OPCODE']], i['A'], -i['Bx']-1)
8484
elif (i['TYPE'] == "AsBx"):
8585
print("AsBx", lua_opcode_names[i['OPCODE']], i['A'], i['sBx'])
86+
87+
def loadBlock(self, sz):
88+
temp = bytearray(self.bytecode[self.index:self.index+sz])
89+
self.index = self.index + sz
90+
return temp
8691

8792
def get_byte(self):
88-
b = self.bytecode[self.index]
89-
self.index = self.index + 1
90-
return b
93+
return self.loadBlock(1)[0]
9194

9295
def get_int32(self):
93-
i = 0
9496
if (self.big_endian):
95-
i = int.from_bytes(self.bytecode[self.index:self.index+4], byteorder='big', signed=False)
97+
return int.from_bytes(self.loadBlock(4), byteorder='big', signed=False)
9698
else:
97-
i = int.from_bytes(self.bytecode[self.index:self.index+4], byteorder='little', signed=False)
98-
self.index = self.index + self.int_size
99-
return i
99+
return int.from_bytes(self.loadBlock(4), byteorder='little', signed=False)
100100

101101
def get_int(self):
102-
i = 0
103102
if (self.big_endian):
104-
i = int.from_bytes(self.bytecode[self.index:self.index+self.int_size], byteorder='big', signed=False)
103+
return int.from_bytes(self.loadBlock(self.int_size), byteorder='big', signed=False)
105104
else:
106-
i = int.from_bytes(self.bytecode[self.index:self.index+self.int_size], byteorder='little', signed=False)
107-
self.index = self.index + self.int_size
108-
return i
105+
return int.from_bytes(self.loadBlock(self.int_size), byteorder='little', signed=False)
109106

110107
def get_size_t(self):
111-
s = ''
112108
if (self.big_endian):
113-
s = int.from_bytes(self.bytecode[self.index:self.index+self.size_t], byteorder='big', signed=False)
109+
return int.from_bytes(self.loadBlock(self.size_t), byteorder='big', signed=False)
114110
else:
115-
s = int.from_bytes(self.bytecode[self.index:self.index+self.size_t], byteorder='little', signed=False)
116-
self.index = self.index + self.size_t
117-
return s
111+
return int.from_bytes(self.loadBlock(self.size_t), byteorder='little', signed=False)
118112

119113
def get_double(self):
120114
if self.big_endian:
121-
f = struct.unpack('>d', bytearray(self.bytecode[self.index:self.index+8]))
115+
return struct.unpack('>d', self.loadBlock(8))[0]
122116
else:
123-
f = struct.unpack('<d', bytearray(self.bytecode[self.index:self.index+8]))
124-
self.index = self.index + 8
125-
return f[0]
117+
return struct.unpack('<d', self.loadBlock(8))[0]
126118

127119
def get_string(self, size):
128120
if (size == None):
129121
size = self.get_size_t()
130122
if (size == 0):
131123
return None
132-
133-
s = "".join(chr(x) for x in self.bytecode[self.index:self.index+size])
134-
self.index = self.index + size
135-
return s
124+
125+
return "".join(chr(x) for x in self.loadBlock(size))
136126

137127
def decode_chunk(self):
138128
chunk = {
@@ -261,7 +251,6 @@ def decode_bytecode(self, bytecode):
261251
self.instr_size = self.get_byte() # gets size of instructions
262252
self.l_number_size = self.get_byte() # size of lua_Number
263253
self.integral_flag = self.get_byte()
264-
265254

266255
print("Lua VM version: ", hex(self.vm_version))
267256
print("Big Endian: ", self.big_endian)

0 commit comments

Comments
 (0)