Advertisement
Al_Tasin

Compiler.lua

Apr 19th, 2020
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.00 KB | None | 0 0
  1. gg.toast('Script compiler v3.7')
  2. -- https://gameguardian.net/forum/files/file/146-script-compiler/
  3.  
  4. if gg.BUILD < 15386 then
  5.     gg.alert('You are using an old version of GameGuardian. Some functions may not work, or work not as expected.')
  6. end
  7.  
  8. local g = {}
  9. g.last = gg.getFile()
  10. g.info = nil
  11.  
  12. g.config = gg.getFile():gsub('%lua$', '')..'cfg'
  13. g.data = loadfile(g.config)
  14. if g.data ~= nil then
  15.     g.info = g.data()
  16.     g.data = nil
  17. end
  18.  
  19. if g.info == nil then
  20.     g.info = {g.last, g.last:gsub('/[^/]+$', ''), nil}
  21. end
  22. if g.info[3] == nil then g.info[3] = gg.VERSION end
  23. if g.info[4] == nil then g.info[4] = 400 end
  24.  
  25. while true do
  26.     g.info = gg.prompt({'Select script/assemble file:', 'Select writable path for output:',
  27.         'Use GameGuardian version:', 'Min size for log call "load"'}, g.info, {'file', 'path', 'text', 'number'})
  28.     if g.info == nil then break end
  29.     gg.saveVariable(g.info, g.config)
  30.     gg.VERSION = g.info[3]
  31.     gg.VERSION_INT = tonumber((gg.VERSION:gsub('%.[0-9]+', function (m)
  32.         m = m:sub(2)
  33.         if #m == 1 then m = '0'..m end
  34.         return m
  35.     end)))
  36.     print('Use GameGuardian version: '..gg.VERSION..' ['..gg.VERSION_INT..']')
  37.     g.last = g.info[1]
  38.     g.test, g.err = loadfile(g.last)
  39.     g.loaded = g.last
  40.     if g.test == nil then
  41.         if g.err == nill then g.err = 'Unknown error' end
  42.         print(g.err)
  43.         gg.alert('Failed load/assemble script: '..g.last..'\n\n'..g.err)
  44.     else
  45.         g.name = g.last:match('[^/]+$')
  46.         g.pathes = {g.info[2]:gsub('/?$', '')..'/'..g.name, g.last, '/sdcard/'..g.name, gg.getFile():gsub('[^/]+$', '')..g.name, gg.EXT_FILES_DIR..'/'..g.name}
  47.         g.file = nil
  48.         g.out = ''
  49.         g.try = ''
  50.         for i, v in ipairs(g.pathes) do
  51.             g.out = v..".tmp.lua"
  52.             g.file = io.open(g.out, "w")
  53.             if g.file ~= nil then
  54.                 g.last = v:gsub('%.lua$', '')
  55.                 break
  56.             end
  57.             g.try = g.try..' '..v
  58.         end
  59.         if g.file == nil then
  60.             gg.alert('Failed write to file. Checked:'..g.try)
  61.         else
  62.             g.file:close()
  63.             os.remove(g.out)
  64.  
  65.             g.sel = gg.choice({
  66.                 'Compile with debug info (with remove garbage code)', -- 1
  67.                 'Compile without debug info (with remove garbage code)', -- 2
  68.                 'Disassemble', -- 3
  69.                 'Log all GG calls and dump all data for call "load"', -- 4
  70.                 'Log all GG calls', -- 5
  71.                 'Dump all data for call "load"', -- 6
  72.                 'Password cracker', -- 7
  73.                 'Reassemble with remove garbage', -- 8
  74.             })
  75.             if g.sel == nil then break end
  76.  
  77.             g.warn = function() return gg.alert('Scripts in binary form may not work on other versions of GameGuardian', 'Agree', 'Disagree') end
  78.  
  79.             if g.sel == 1 or g.sel == 2 then
  80.                 if g.warn() ~= 1 then break end
  81.  
  82.                 g.out = g.last..".bin.lua"
  83.                 g.file = io.open(g.out, "w")
  84.                 g.file:write(string.dump(g.test, g.sel == 2, true))
  85.                 g.file:close()
  86.                 gg.alert('The binary script is saved to the file:\n\n'..g.out)
  87.                 break
  88.             elseif g.sel == 3 then
  89.                 g.out = g.last..".lasm"
  90.                 g.res = gg.internal2(g.test, g.out)
  91.                 if g.res then
  92.                     gg.alert('The disassemble of the script is saved to the file:\n\n'..g.out)
  93.                     break
  94.                 else
  95.                     gg.alert('An error occurred while disassembling the script:\n\n'..g.res)
  96.                 end
  97.             elseif g.sel == 4 or g.sel == 5 or g.sel == 6 then
  98.                 if true then
  99.                     local ggg = {}
  100.                     for k, v in pairs(gg) do
  101.                         ggg[k] = v
  102.                     end
  103.  
  104.                     local sel = select
  105.                     local typ = type
  106.                     local str = tostring
  107.                     local echo = print
  108.                     local io_open = io.open
  109.                     local tr = {}
  110.                     local slen = string.len
  111.  
  112.                     local msg = ''
  113.                     local rnd = g.last..'_'..os.time()..'_'..math.random()
  114.  
  115.                     if g.sel == 4 or g.sel == 6 then
  116.                         local load_cnt = 0
  117.                         local fname = rnd..'.load.tar'
  118.  
  119.                         local min_size = tonumber(g.info[4])
  120.  
  121.                         local sfmt = string.format
  122.                         local sbyte = string.byte
  123.                         local ssub = string.sub
  124.  
  125.                         local tar_end = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  126.  
  127.                         local f = nil
  128.                         local flen = 0
  129.                         local tar_put = function (content)
  130.                             if f == nil then
  131.                                 f = io_open(fname, 'wb')
  132.                                 f:setvbuf('no')
  133.                             end
  134.                             local size = slen(content)
  135.                             local checksum = 4684
  136.  
  137.                             local s7 = sfmt('%07d', load_cnt)
  138.                             do
  139.                                 local b1, b2, b3, b4, b5, b6, b7 = sbyte(s7, 1, 7)
  140.                                 checksum = checksum + b1 + b2 + b3 + b4 + b5 + b6 + b7
  141.                             end
  142.                             local s11 = sfmt('%011o', size)
  143.                             do
  144.                                 local b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11 = sbyte(s11, 1, 11)
  145.                                 checksum = checksum + b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9 + b10 + b11
  146.                             end
  147.  
  148.                             local hdr = "load_"..
  149.                                 s7..
  150.                                 ".lua\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000666\x000000000\x000002004\x00"..
  151.                                 s11..
  152.                                 "\x0000000000000\x00"..
  153.                                 sfmt('%06o', checksum)..
  154.                                 "\x00 0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ustar00\x00root\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00sdcard_r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  155.  
  156.                             --echo('Hooked load '..load_cnt..' with size of '..size..' bytes')
  157.                             load_cnt = load_cnt + 1
  158.  
  159.                             if load_cnt ~= 1 then
  160.                                 f:seek('set', flen)
  161.                             end
  162.                             if size < 512 then
  163.                                 f:write(hdr..content..ssub(tar_end, 1, 512 - size)..tar_end)
  164.                                 flen = flen + 1024
  165.                             else
  166.                                 f:write(hdr):write(content)
  167.  
  168.                                 local pad = size % 512
  169.                                 if pad > 0 then
  170.                                     f:write(ssub(tar_end, 1, 512 - pad)..tar_end)
  171.                                     flen = flen + 1024 + size - pad
  172.                                     return
  173.                                 end
  174.  
  175.                                 f:write(tar_end)
  176.                                 flen = flen + 512 + size
  177.                             end
  178.                         end
  179.  
  180.                         for i, v in pairs({load=1, loadfile=0, dofile=0}) do
  181.                             local orig = _G[i]
  182.                             local hook = 1
  183.                             local type = v
  184.                             hook = function (...)
  185.                                 local content = ...
  186.                                 if type == 0 and content ~= nil then
  187.                                     local f = io_open(content, "rb")
  188.                                     if f ~= nil then
  189.                                         content = f:read("*a")
  190.                                         f:close()
  191.                                     else
  192.                                         content = nil
  193.                                     end
  194.                                 end
  195.                                 if content ~= nil then
  196.                                     local ret = nil
  197.                                     local total = 0
  198.                                     local file = fname..load_cnt..'.lua'
  199.                                     if type == 1 and typ(content) == 'function' then
  200.                                         local cache = ''
  201.                                         local func = function (...)
  202.                                             local ret = content(...)
  203.                                             if ret ~= nil then
  204.                                                 if ret ~= '' then
  205.                                                     cache = cache + ret
  206.                                                     total = total + slen(ret)
  207.                                                 end
  208.                                             else
  209.                                                 if total ~= 0 and slen(content) >= min_size then
  210.                                                     tar_put(cache)
  211.                                                 end
  212.                                             end
  213.                                             return ret
  214.                                         end
  215.                                         ret = orig(func, sel(2, ...))
  216.                                     else
  217.                                         if content ~= '' and sle
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement