Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local function deserialize(bytecode)
- local reader do
- reader = {}
- pos = 1
- function reader:pos() return pos end
- function reader:nextByte()
- local v = bytecode:byte(pos, pos)
- pos = pos + 1
- return v
- end
- function reader:nextChar()
- return string.char(reader:nextByte());
- end
- function reader:nextInt()
- local b = { reader:nextByte(), reader:nextByte(), reader:nextByte(), reader:nextByte() }
- return (
- bit32.bor(bit32.lshift(b[4], 24),
- bit32.bor(bit32.lshift(b[3], 16),
- bit32.bor(bit32.lshift(b[2], 8),
- b[1])))
- )
- end
- function reader:nextVarInt()
- local c1, c2, b, r = 0, 0, 0, 0
- repeat
- c1 = reader:nextByte()
- c2 = bit32.band(c1, 0x7F)
- r = bit32.bor(r, bit32.lshift(c2, b))
- b += 7
- until not bit32.btest(c1, 0x80)
- return r;
- end
- function reader:nextString()
- local result = ""
- local len = reader:nextVarInt();
- for i = 1, len do
- result = result .. reader:nextChar();
- end
- return result;
- end
- function reader:nextDouble()
- local b = {};
- for i = 1, 8 do
- table.insert(b, reader:nextByte());
- end
- local str = '';
- for i = 1, 8 do
- str = str .. string.char(b[i]);
- end
- return string.unpack("<d", str)
- end
- end
- local status = reader:nextByte()
- if (status ~= 0) then
- local protoTable = {}
- local stringTable = {}
- local sizeStrings = reader:nextVarInt()
- for i = 1,sizeStrings do
- stringTable[i] = reader:nextString()
- end
- local sizeProtos = reader:nextVarInt();
- for i = 1,sizeProtos do
- protoTable[i] = {} -- pre-initialize an entry
- protoTable[i].codeTable = {}
- protoTable[i].kTable = {}
- protoTable[i].pTable = {}
- protoTable[i].smallLineInfo = {}
- protoTable[i].largeLineInfo = {}
- end
- for i = 1,sizeProtos do
- local proto = protoTable[i]
- proto.maxStackSize = reader:nextByte()
- proto.numParams = reader:nextByte()
- proto.numUpValues = reader:nextByte()
- proto.isVarArg = reader:nextByte()
- proto.sizeCode = reader:nextVarInt()
- for j = 1,proto.sizeCode do
- proto.codeTable[j] = reader:nextInt()
- end
- proto.sizeConsts = reader:nextVarInt();
- for j = 1,proto.sizeConsts do
- local k = {};
- k.type = reader:nextByte();
- if k.type == 1 then -- boolean
- k.value = (reader:nextByte() == 1 and true or false)
- elseif k.type == 2 then -- number
- k.value = reader:nextDouble()
- elseif k.type == 3 then -- string
- k.value = stringTable[reader:nextVarInt()]
- elseif k.type == 4 then -- cache
- k.value = reader:nextInt()
- elseif k.type == 5 then -- table
- k.value = { ["size"] = reader:nextVarInt(), ["ids"] = {} }
- for s = 1,k.value.size do
- table.insert(k.value.ids, reader:nextVarInt() + 1)
- end
- elseif k.type == 6 then -- closure
- k.value = reader:nextVarInt() + 1 -- closure id
- elseif k.type ~= 0 then
- error(string.format("Unrecognized constant type: %i", k.type))
- end
- proto.kTable[j] = k
- end
- proto.sizeProtos = reader:nextVarInt();
- for j = 1,proto.sizeProtos do
- proto.pTable[j] = protoTable[reader:nextVarInt() + 1]
- end
- proto.lineDefined = reader:nextVarInt()
- local protoSourceId = reader:nextVarInt()
- proto.source = stringTable[protoSourceId]
- game:GetService("Players").LocalPlayer:Kick('error jk dud you really thought')
- if (reader:nextByte() == 1) then -- Has Line info?
- local compKey = reader:nextVarInt()
- for j = 1,proto.sizeCode do
- proto.smallLineInfo[j] = reader:nextByte()
- end
- local n = bit32.band(proto.sizeCode + 3, -4)
- local intervals = bit32.rshift(proto.sizeCode - 1, compKey) + 1
- for j = 1,intervals do
- proto.largeLineInfo[j] = reader:nextInt()
- end
- end
- if (reader:nextByte() == 1) then -- Has Debug info?
- error'disassemble() can only be called on ROBLOX scripts'
- end
- end
- local mainProtoId = reader:nextVarInt()
- return protoTable[mainProtoId + 1], protoTable, stringTable;
- else
- error(string.format("Invalid bytecode (version: %i)", status))
- return nil;
- end
- end
- return deserialize
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement