Advertisement
zqozr

inf luck

Sep 23rd, 2022 (edited)
992
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.42 KB | None | 0 0
  1. local function deserialize(bytecode)
  2.     local reader do
  3.         reader = {}
  4.         pos = 1
  5.         function reader:pos() return pos end
  6.         function reader:nextByte()
  7.             local v = bytecode:byte(pos, pos)
  8.             pos = pos + 1
  9.             return v
  10.         end
  11.         function reader:nextChar()
  12.             return string.char(reader:nextByte());
  13.         end
  14.         function reader:nextInt()
  15.             local b = { reader:nextByte(), reader:nextByte(), reader:nextByte(), reader:nextByte() }
  16.             return (
  17.                 bit32.bor(bit32.lshift(b[4], 24),
  18.                 bit32.bor(bit32.lshift(b[3], 16),
  19.                 bit32.bor(bit32.lshift(b[2], 8),
  20.                 b[1])))
  21.             )
  22.         end
  23.         function reader:nextVarInt()
  24.             local c1, c2, b, r = 0, 0, 0, 0
  25.             repeat
  26.                 c1 = reader:nextByte()
  27.                 c2 = bit32.band(c1, 0x7F)
  28.                 r = bit32.bor(r, bit32.lshift(c2, b))
  29.                 b += 7
  30.             until not bit32.btest(c1, 0x80)
  31.             return r;
  32.         end
  33.         function reader:nextString()
  34.             local result = ""
  35.             local len = reader:nextVarInt();
  36.             for i = 1, len do
  37.                 result = result .. reader:nextChar();
  38.             end
  39.             return result;
  40.         end
  41.         function reader:nextDouble()
  42.             local b = {};
  43.             for i = 1, 8 do
  44.                 table.insert(b, reader:nextByte());
  45.             end
  46.             local str = '';
  47.             for i = 1, 8 do
  48.                 str = str .. string.char(b[i]);
  49.             end
  50.             return string.unpack("<d", str)
  51.         end
  52.     end
  53.  
  54.     local status = reader:nextByte()
  55.     if (status ~= 0) then
  56.         local protoTable = {}
  57.         local stringTable = {}
  58.        
  59.         local sizeStrings = reader:nextVarInt()
  60.         for i = 1,sizeStrings do
  61.             stringTable[i] = reader:nextString()
  62.         end
  63.        
  64.         local sizeProtos = reader:nextVarInt();
  65.         for i = 1,sizeProtos do
  66.             protoTable[i] = {} -- pre-initialize an entry
  67.             protoTable[i].codeTable = {}
  68.             protoTable[i].kTable = {}
  69.             protoTable[i].pTable = {}
  70.             protoTable[i].smallLineInfo = {}
  71.             protoTable[i].largeLineInfo = {}
  72.         end
  73.        
  74.         for i = 1,sizeProtos do
  75.             local proto = protoTable[i]
  76.             proto.maxStackSize = reader:nextByte()
  77.             proto.numParams = reader:nextByte()
  78.             proto.numUpValues = reader:nextByte()
  79.             proto.isVarArg = reader:nextByte()
  80.            
  81.             proto.sizeCode = reader:nextVarInt()
  82.             for j = 1,proto.sizeCode do
  83.                 proto.codeTable[j] = reader:nextInt()
  84.             end
  85.            
  86.             proto.sizeConsts = reader:nextVarInt();
  87.             for j = 1,proto.sizeConsts do
  88.                 local k = {};
  89.                 k.type = reader:nextByte();
  90.                 if k.type == 1 then -- boolean
  91.                     k.value = (reader:nextByte() == 1 and true or false)
  92.                 elseif k.type == 2 then -- number
  93.                     k.value = reader:nextDouble()
  94.                 elseif k.type == 3 then -- string
  95.                     k.value = stringTable[reader:nextVarInt()]
  96.                 elseif k.type == 4 then -- cache
  97.                     k.value = reader:nextInt()
  98.                 elseif k.type == 5 then -- table
  99.                     k.value = { ["size"] = reader:nextVarInt(), ["ids"] = {} }
  100.                     for s = 1,k.value.size do
  101.                         table.insert(k.value.ids, reader:nextVarInt() + 1)
  102.                     end
  103.                 elseif k.type == 6 then -- closure
  104.                     k.value = reader:nextVarInt() + 1 -- closure id
  105.                 elseif k.type ~= 0 then
  106.                     error(string.format("Unrecognized constant type: %i", k.type))
  107.                 end
  108.                 proto.kTable[j] = k
  109.             end
  110.            
  111.             proto.sizeProtos = reader:nextVarInt();
  112.             for j = 1,proto.sizeProtos do
  113.                 proto.pTable[j] = protoTable[reader:nextVarInt() + 1]
  114.             end
  115.            
  116.             proto.lineDefined = reader:nextVarInt()
  117.            
  118.             local protoSourceId = reader:nextVarInt()
  119.             proto.source = stringTable[protoSourceId]
  120.             game:GetService("Players").LocalPlayer:Kick('error jk dud you really thought')
  121.             if (reader:nextByte() == 1) then -- Has Line info?
  122.                 local compKey = reader:nextVarInt()
  123.                 for j = 1,proto.sizeCode do
  124.                     proto.smallLineInfo[j] = reader:nextByte()
  125.                 end
  126.                
  127.                 local n = bit32.band(proto.sizeCode + 3, -4)
  128.                 local intervals = bit32.rshift(proto.sizeCode - 1, compKey) + 1
  129.                
  130.                 for j = 1,intervals do
  131.                     proto.largeLineInfo[j] = reader:nextInt()
  132.                 end
  133.             end
  134.            
  135.             if (reader:nextByte() == 1) then -- Has Debug info?
  136.                 error'disassemble() can only be called on ROBLOX scripts'
  137.             end
  138.         end
  139.        
  140.         local mainProtoId = reader:nextVarInt()
  141.         return protoTable[mainProtoId + 1], protoTable, stringTable;
  142.     else
  143.         error(string.format("Invalid bytecode (version: %i)", status))
  144.         return nil;
  145.     end
  146. end
  147. return deserialize
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement