-- 验证必要函数 local function k512b5eb624e20f627f5afe597d0c0f19(code) local HexTable = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"} local A = 0x67452301 local B = 0xefcdab89 local C = 0x98badcfe local D = 0x10325476 local S11 = 7 local S12 = 12 local S13 = 17 local S14 = 22 local S21 = 5 local S22 = 9 local S23 = 14 local S24 = 20 local S31 = 4 local S32 = 11 local S33 = 16 local S34 = 23 local S41 = 6 local S42 = 10 local S43 = 15 local S44 = 21 local function F(x,y,z) return (x & y) | ((~x) & z) end local function G(x,y,z) return (x & z) | (y & (~z)) end local function H(x,y,z) return x ~ y ~ z end local function I(x,y,z) return y ~ (x | (~z)) end local function FF(a,b,c,d,x,s,ac) local a = a + F(b,c,d) + x + ac local a = (((a & 0xffffffff) << s) | ((a & 0xffffffff) >> 32 - s)) + b return a & 0xffffffff end local function GG(a,b,c,d,x,s,ac) local a = a + G(b,c,d) + x + ac local a = (((a & 0xffffffff) << s) | ((a & 0xffffffff) >> 32 - s)) + b return a & 0xffffffff end local function HH(a,b,c,d,x,s,ac) local a = a + H(b,c,d) + x + ac local a = (((a & 0xffffffff) << s) | ((a & 0xffffffff) >> 32 - s)) + b return a & 0xffffffff end local function II(a,b,c,d,x,s,ac) local a = a + I(b,c,d) + x + ac local a = (((a & 0xffffffff) << s) | ((a & 0xffffffff) >> 32 - s)) + b return a & 0xffffffff end local function MD5StringFill(s) local len = s:len() local mod512 = len * 8 % 512 local fillSize = (448 - mod512) // 8 if mod512 > 448 then fillSize = (960 - mod512) // 8 end local rTab = {} local byteIndex = 1 for i = 1,len do local index = (i - 1) // 4 + 1 rTab[index] = rTab[index] or 0 rTab[index] = rTab[index] | (s:byte(i) << (byteIndex - 1) * 8) byteIndex = byteIndex + 1 if byteIndex == 5 then byteIndex = 1 end end local b0x80 = false local tLen = #rTab if byteIndex ~= 1 then rTab[tLen] = rTab[tLen] | 0x80 << (byteIndex - 1) * 8 b0x80 = true end for i = 1,fillSize // 4 do if not b0x80 and i == 1 then rTab[tLen + i] = 0x80 else rTab[tLen + i] = 0x0 end end local bitLen = math.floor(len * 8) local tLen = #rTab rTab[tLen + 1] = bitLen & 0xffffffff rTab[tLen + 2] = bitLen >> 32 return rTab end local function w1c79ab98e2eb08a803da78a56433afb9(s) local fillTab = MD5StringFill(s) local result = {A,B,C,D} for i = 1,#fillTab // 16 do local a = result[1] local b = result[2] local c = result[3] local d = result[4] local offset = (i - 1) * 16 + 1 local a = FF(a, b, c, d, fillTab[offset + 0], S11, 0xd76aa478) local d = FF(d, a, b, c, fillTab[offset + 1], S12, 0xe8c7b756) local c = FF(c, d, a, b, fillTab[offset + 2], S13, 0x242070db) local b = FF(b, c, d, a, fillTab[offset + 3], S14, 0xc1bdceee) local a = FF(a, b, c, d, fillTab[offset + 4], S11, 0xf57c0faf) local d = FF(d, a, b, c, fillTab[offset + 5], S12, 0x4787c62a) local c = FF(c, d, a, b, fillTab[offset + 6], S13, 0xa8304613) local b = FF(b, c, d, a, fillTab[offset + 7], S14, 0xfd469501) local a = FF(a, b, c, d, fillTab[offset + 8], S11, 0x698098d8) local d = FF(d, a, b, c, fillTab[offset + 9], S12, 0x8b44f7af) local c = FF(c, d, a, b, fillTab[offset + 10], S13, 0xffff5bb1) local b = FF(b, c, d, a, fillTab[offset + 11], S14, 0x895cd7be) local a = FF(a, b, c, d, fillTab[offset + 12], S11, 0x6b901122) local d = FF(d, a, b, c, fillTab[offset + 13], S12, 0xfd987193) local c = FF(c, d, a, b, fillTab[offset + 14], S13, 0xa679438e) local b = FF(b, c, d, a, fillTab[offset + 15], S14, 0x49b40821) local a = GG(a, b, c, d, fillTab[offset + 1], S21, 0xf61e2562) local d = GG(d, a, b, c, fillTab[offset + 6], S22, 0xc040b340) local c = GG(c, d, a, b, fillTab[offset + 11], S23, 0x265e5a51) local b = GG(b, c, d, a, fillTab[offset + 0], S24, 0xe9b6c7aa) local a = GG(a, b, c, d, fillTab[offset + 5], S21, 0xd62f105d) local d = GG(d, a, b, c, fillTab[offset + 10], S22, 0x2441453) local c = GG(c, d, a, b, fillTab[offset + 15], S23, 0xd8a1e681) local b = GG(b, c, d, a, fillTab[offset + 4], S24, 0xe7d3fbc8) local a = GG(a, b, c, d, fillTab[offset + 9], S21, 0x21e1cde6) local d = GG(d, a, b, c, fillTab[offset + 14], S22, 0xc33707d6) local c = GG(c, d, a, b, fillTab[offset + 3], S23, 0xf4d50d87) local b = GG(b, c, d, a, fillTab[offset + 8], S24, 0x455a14ed) local a = GG(a, b, c, d, fillTab[offset + 13], S21, 0xa9e3e905) local d = GG(d, a, b, c, fillTab[offset + 2], S22, 0xfcefa3f8) local c = GG(c, d, a, b, fillTab[offset + 7], S23, 0x676f02d9) local b = GG(b, c, d, a, fillTab[offset + 12], S24, 0x8d2a4c8a) local a = HH(a, b, c, d, fillTab[offset + 5], S31, 0xfffa3942) local d = HH(d, a, b, c, fillTab[offset + 8], S32, 0x8771f681) local c = HH(c, d, a, b, fillTab[offset + 11], S33, 0x6d9d6122) local b = HH(b, c, d, a, fillTab[offset + 14], S34, 0xfde5380c) local a = HH(a, b, c, d, fillTab[offset + 1], S31, 0xa4beea44) local d = HH(d, a, b, c, fillTab[offset + 4], S32, 0x4bdecfa9) local c = HH(c, d, a, b, fillTab[offset + 7], S33, 0xf6bb4b60) local b = HH(b, c, d, a, fillTab[offset + 10], S34, 0xbebfbc70) local a = HH(a, b, c, d, fillTab[offset + 13], S31, 0x289b7ec6) local d = HH(d, a, b, c, fillTab[offset + 0], S32, 0xeaa127fa) local c = HH(c, d, a, b, fillTab[offset + 3], S33, 0xd4ef3085) local b = HH(b, c, d, a, fillTab[offset + 6], S34, 0x4881d05) local a = HH(a, b, c, d, fillTab[offset + 9], S31, 0xd9d4d039) local d = HH(d, a, b, c, fillTab[offset + 12], S32, 0xe6db99e5) local c = HH(c, d, a, b, fillTab[offset + 15], S33, 0x1fa27cf8) local b = HH(b, c, d, a, fillTab[offset + 2], S34, 0xc4ac5665) local a = II(a, b, c, d, fillTab[offset + 0], S41, 0xf4292244) local d = II(d, a, b, c, fillTab[offset + 7], S42, 0x432aff97) local c = II(c, d, a, b, fillTab[offset + 14], S43, 0xab9423a7) local b = II(b, c, d, a, fillTab[offset + 5], S44, 0xfc93a039) local a = II(a, b, c, d, fillTab[offset + 12], S41, 0x655b59c3) local d = II(d, a, b, c, fillTab[offset + 3], S42, 0x8f0ccc92) local c = II(c, d, a, b, fillTab[offset + 10], S43, 0xffeff47d) local b = II(b, c, d, a, fillTab[offset + 1], S44, 0x85845dd1) local a = II(a, b, c, d, fillTab[offset + 8], S41, 0x6fa87e4f) local d = II(d, a, b, c, fillTab[offset + 15], S42, 0xfe2ce6e0) local c = II(c, d, a, b, fillTab[offset + 6], S43, 0xa3014314) local b = II(b, c, d, a, fillTab[offset + 13], S44, 0x4e0811a1) local a = II(a, b, c, d, fillTab[offset + 4], S41, 0xf7537e82) local d = II(d, a, b, c, fillTab[offset + 11], S42, 0xbd3af235) local c = II(c, d, a, b, fillTab[offset + 2], S43, 0x2ad7d2bb) local b = II(b, c, d, a, fillTab[offset + 9], S44, 0xeb86d391) result[1] = result[1] + a result[2] = result[2] + b result[3] = result[3] + c result[4] = result[4] + d result[1] = result[1] & 0xffffffff result[2] = result[2] & 0xffffffff result[3] = result[3] & 0xffffffff result[4] = result[4] & 0xffffffff end local retStr = '' for i = 1,4 do for _ = 1,4 do local temp = result[i] & 0x0F local str = HexTable[temp + 1] result[i] = result[i] >> 4 local temp = result[i] & 0x0F retStr = retStr .. HexTable[temp + 1] .. str result[i] = result[i] >> 4 end end return string.lower(retStr) end return w1c79ab98e2eb08a803da78a56433afb9(code) end local function ZZMathBit_xorBit(left, right) return (left + right) == 1 and 1 or 0 end local function ZZMathBit_base(left, right, op) if left < right then left, right = right, left end local res = 0 local shift = 1 while left ~= 0 do local ra = left % 2 local rb = right % 2 res = shift * op(ra, rb) + res shift = shift * 2 left = math.modf(left / 2) right = math.modf(right / 2) end return res end local function ZZMathBit_xorOp(left, right) return ZZMathBit_base(left, right, ZZMathBit_xorBit) end local function KSA(key) local keyLen = string.len(key) local schedule = {} local keyByte = {} for i = 0, 255 do schedule[i] = i end for i = 1, keyLen do keyByte[i - 1] = string.byte(key, i, i) end local j = 0 for i = 0, 255 do j = (j + schedule[i] + keyByte[i % keyLen]) % 256 schedule[i], schedule[j] = schedule[j], schedule[i] end return schedule end local function PRGA(schedule, textLen) local i = 0 local j = 0 local k = {} for n = 1, textLen do i = (i + 1) % 256 j = (j + schedule[i]) % 256 schedule[i], schedule[j] = schedule[j], schedule[i] k[n] = schedule[(schedule[i] + schedule[j]) % 256] end return k end local function output(schedule, text) local len = string.len(text) local res = {} for i = 1, len do local c = string.byte(text, i, i) res[i] = string.char(ZZMathBit_xorOp(schedule[i], c)) end return table.concat(res) end local function gfd3615aa541cfa53d83e2a965c392b61(text, key) local textLen = string.len(text) local schedule = KSA(key) local k = PRGA(schedule, textLen) return output(k, text) end local function tf828f991d601b299c42e271897dead81(str) local ret = "" for i = 1, #str do ret = ret .. string.format("%02X", str:sub(i, i):byte()) end return ret:lower() end local function nf8d3bc20390b880c1a7325fd0f382a76(hexStr) local cleanStr = hexStr:gsub("[%s%p]", ""):upper() local ret = "" for i = 1, #cleanStr, 2 do ret = ret .. string.char(tonumber(cleanStr:sub(i, i + 1), 16)) end return ret end local base64chars = { [0]='A', [1]='B', [2]='C', [3]='D', [4]='E', [5]='F', [6]='G', [7]='H', [8]='I', [9]='J', [10]='K', [11]='L', [12]='M', [13]='N', [14]='O', [15]='P', [16]='Q', [17]='R', [18]='S', [19]='T', [20]='U', [21]='V', [22]='W', [23]='X', [24]='Y', [25]='Z', [26]='a', [27]='b', [28]='c', [29]='d', [30]='e', [31]='f', [32]='g', [33]='h', [34]='i', [35]='j', [36]='k', [37]='l', [38]='m', [39]='n', [40]='o', [41]='p', [42]='q', [43]='r', [44]='s', [45]='t', [46]='u', [47]='v', [48]='w', [49]='x', [50]='y', [51]='z', [52]='0', [53]='1', [54]='2', [55]='3', [56]='4', [57]='5', [58]='6', [59]='7', [60]='8', [61]='9', [62]='-', [63]='_' } local function u7d687437b81b7002542d6ae87ec22f3f(data) local bytes = {} local result = "" for i = 0, data:len()-1, 3 do for byte = 1, 3 do bytes[byte] = string.byte(data:sub(i+byte)) or 0 end result = string.format( '%s%s%s%s%s', result, base64chars[ math.floor(bytes[1]/4) ] or "=", base64chars[(bytes[1] % 4) * 16 + math.floor(bytes[2] / 16)] or "=", ( { [true] = base64chars[(bytes[2] % 16) * 4 + math.floor(bytes[3] / 64)] or "=", [false] = "=" } ) [(data:len() - i) > 1], ( { [true] = base64chars[(bytes[3] % 64)] or "=", [false] = "=" } ) [(data:len(data) - i) > 2] ) end return result end local base64bytes = { ['A']= 0, ['B'] =1, ['C'] =2, ['D'] =3, ['E'] =4, ['F'] =5, ['G'] =6, ['H'] =7, ['I']=8, ['J'] =9, ['K']=10, ['L']=11, ['M']=12, ['N']=13, ['O']=14, ['P']=15, ['Q']=16, ['R']=17, ['S']=18, ['T']=19, ['U']=20, ['V']=21, ['W']=22, ['X']=23, ['Y']=24, ['Z']=25, ['a']=26, ['b']=27, ['c']=28, ['d']=29, ['e']=30, ['f']=31, ['g']=32, ['h']=33, ['i']=34, ['j']=35, ['k']=36, ['l']=37, ['m']=38, ['n']=39, ['o']=40, ['p']=41, ['q']=42, ['r']=43, ['s']=44, ['t']=45, ['u']=46, ['v']=47, ['w']=48, ['x']=49, ['y']=50, ['z']=51, ['0']=52, ['1']=53, ['2']=54, ['3']=55, ['4']=56, ['5']=57, ['6']=58, ['7']=59, ['8']=60, ['9']=61, ['-']=62, ['_']=63, ['=']=nil } local function zfb40b9bdaf6b3087a38f11c4d0b5739f(data) local chars = {} local result = "" for i = 0, data:len()-1, 4 do for c = 1, 4 do chars[c] = base64bytes[ (string.sub(data,(i+c),(i+c)) or "=") ] end result = string.format( '%s%s%s%s', result, string.char(chars[1]*4 + math.floor(chars[2]/16)), ( { [true] = string.char(((chars[2] or 0) % 16)*16 + math.floor((chars[3] or 0)/4)), [false] = "" } ) [chars[3] ~= nil], ( { [true] = string.char(((chars[3] or 0)%4) * 64 + (chars[4] or 0)), [false] = ""} ) [chars[4] ~= nil] ) end return result end local function fadaf0390cfb636425b88f4f7763a4e58(input,base64_chars) local output = "" local padding = "" local i = 1 local len = #input while i <= len do local b1 = string.byte(input, i) local b2 = string.byte(input, i + 1) local b3 = string.byte(input, i + 2) if not b2 then b2 = 0 padding = padding .. "=" end if not b3 then b3 = 0 padding = padding .. "=" end local combined = (b1 << 16) + (b2 << 8) + b3 output = output .. base64_chars:sub(((combined >> 18) & 0x3F) + 1, ((combined >> 18) & 0x3F) + 1) .. base64_chars:sub(((combined >> 12) & 0x3F) + 1, ((combined >> 12) & 0x3F) + 1) .. base64_chars:sub(((combined >> 6) & 0x3F) + 1, ((combined >> 6) & 0x3F) + 1) .. base64_chars:sub((combined & 0x3F) + 1, (combined & 0x3F) + 1) i = i + 3 end return output:sub(1, #output - #padding) .. padding end local function z338b9f31570e0f7f79553d57eb3a732d(input,base64_chars) local base64_decode_chars = {} for i = 1, #base64_chars do base64_decode_chars[base64_chars:sub(i, i)] = i - 1 end local padding = 0 if input:sub(-1) == "=" then padding = padding + 1 end if input:sub(-2, -1) == "==" then padding = padding + 1 end local output = "" local i = 1 local len = #input while i <= len - padding do local c1 = base64_decode_chars[input:sub(i, i)] local c2 = base64_decode_chars[input:sub(i + 1, i + 1)] local c3 = base64_decode_chars[input:sub(i + 2, i + 2)] local c4 = base64_decode_chars[input:sub(i + 3, i + 3)] if not c3 then c3 = 0 end if not c4 then c4 = 0 end local combined = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4 output = output .. string.char((combined >> 16) & 0xFF) .. string.char((combined >> 8) & 0xFF) .. string.char(combined & 0xFF) i = i + 4 end if padding == 1 then output = output:sub(1, -2) elseif padding == 2 then output = output:sub(1, -3) end return output end fuhao= '"' local function k48d286f2728d3f131371f3617ce7ff0a(str,from,to) return true, from+3 end local function x164c194a4439d14d6e6f4986d0f431dd(str,from,to) return false, from+4 end local function r56bee9b88e666b4f102c0bb93ea2ba50(str, from, to) return nil, from+3 end local function b2744a0d54a8e36a3e1c477af19898717(str, from, to) return nul, from+2 end local numberchars = {['-'] = true,['+'] = true,['.'] = true,['0'] = true,['1'] = true,['2'] = true,['3'] = true,['4'] = true,['5'] = true,['6'] = true,['7'] = true,['8'] = true,['9'] = true} local function kdb166f9a64324c233805541ea59e1e8d(str,from,to) local i = from+1 while(i<=to) do local char = string.sub(str, i, i) if not numberchars[char] then break end i = i + 1 end local num = tonumber(string.sub(str, from, i-1)) if not num then error(_format('json格式错误,不正确的数字, 错误位置:{from}', from)) end return num, i-1 end local function bcdf3d14336a44c4adab7c0096df58c1b(str,from,to) local ignor = false for i = from+1, to do local char = string.sub(str, i, i) if not ignor then if char == fuhao then return string.sub(str, from+1, i-1), i elseif char == '\\' then ignor = true end else ignor = false end end error(_format('json格式错误,字符串没有找到结尾, 错误位置:{from}', from)) end local function rf330534fd9c7998536af18ea5c03d12b(str,from,to) local result = {} from = from or 1 local pos = from+1 local to = to or string.len(str) while(pos<=to) do local char = string.sub(str, pos, pos) if char == fuhao then result[#result+1], pos = bcdf3d14336a44c4adab7c0096df58c1b(str,pos,to) elseif char == '[' then result[#result+1], pos = rf330534fd9c7998536af18ea5c03d12b(str,pos,to) elseif char == '{' then result[#result+1], pos = zd3b44b73bbd834fc810e25e0a8b7b163(str,pos,to) elseif char == ']' then return result, pos elseif (char=='f' or char=='F') then result[#result+1], pos = x164c194a4439d14d6e6f4986d0f431dd(str,pos,to) elseif (char=='t' or char=='T') then result[#result+1], pos = k48d286f2728d3f131371f3617ce7ff0a(str,pos,to) elseif (char=='n') then result[#result+1], pos = r56bee9b88e666b4f102c0bb93ea2ba50(str,pos,to) elseif (char=='N') then result[#result+1], pos = b2744a0d54a8e36a3e1c477af19898717(str,pos,to) elseif numberchars[char] then result[#result+1], pos = kdb166f9a64324c233805541ea59e1e8d(str,pos,to) end pos = pos + 1 end error(_format('json格式错误,表没有找到结尾, 错误位置:{from}', from)) end function _G.zd3b44b73bbd834fc810e25e0a8b7b163(str,from,to) local result = {} from = from or 1 local pos = from+1 local to = to or string.len(str) local key while(pos<=to) do local char = string.sub(str, pos, pos) if char == fuhao then if not key then key, pos = bcdf3d14336a44c4adab7c0096df58c1b(str,pos,to) else result[key], pos = bcdf3d14336a44c4adab7c0096df58c1b(str,pos,to) key = nil end elseif char == '[' then if not key then key, pos = rf330534fd9c7998536af18ea5c03d12b(str,pos,to) else result[key], pos = rf330534fd9c7998536af18ea5c03d12b(str,pos,to) key = nil end elseif char == '{' then if not key then key, pos = zd3b44b73bbd834fc810e25e0a8b7b163(str,pos,to) else result[key], pos = zd3b44b73bbd834fc810e25e0a8b7b163(str,pos,to) key = nil end elseif char == '}' then return result, pos elseif (char=='f' or char=='F') then result[key], pos = x164c194a4439d14d6e6f4986d0f431dd(str,pos,to) key = nil elseif (char=='t' or char=='T') then result[key], pos = k48d286f2728d3f131371f3617ce7ff0a(str,pos,to) key = nil elseif (char=='n') then result[key], pos = r56bee9b88e666b4f102c0bb93ea2ba50(str,pos,to) key = nil elseif (char=='N') then result[key], pos = b2744a0d54a8e36a3e1c477af19898717(str,pos,to) key = nil elseif numberchars[char] then if not key then key, pos = kdb166f9a64324c233805541ea59e1e8d(str,pos,to) else result[key], pos = kdb166f9a64324c233805541ea59e1e8d(str,pos,to) key = nil end end pos = pos + 1 end error(_format('格式错误,表没有找到结尾, 错误位置:{from}', from)) end local jsonfuncs={[ fuhao ]=bcdf3d14336a44c4adab7c0096df58c1b,['[']=rf330534fd9c7998536af18ea5c03d12b,['{']=zd3b44b73bbd834fc810e25e0a8b7b163,['f']=x164c194a4439d14d6e6f4986d0f431dd,['F']=x164c194a4439d14d6e6f4986d0f431dd,['t']=k48d286f2728d3f131371f3617ce7ff0a,['T']=k48d286f2728d3f131371f3617ce7ff0a} local function s0ff2b5bc9f4c4dc1f2644e307a548c89(str) if str==nil then gg.alert('错误json') else local char = string.sub(str, 1, 1) local func=jsonfuncs[char] if func then return func(str, 1, string.len(str)) end if numberchars[char] then return kdb166f9a64324c233805541ea59e1e8d(str, 1, string.len(str)) end end end local __index local LYF_DefEnv1 = {[""]=""} local LYF_DefEnv2 = {["fuck"]="."} setmetatable(LYF_DefEnv1, {__index = _ENV}) _ENV=LYF_DefEnv1 _G=LYF_DefEnv2 local function tohex(num) return string.format("%08x", num) end local function lrotate(num, bits) return ((num << bits) | (num >> (32 - bits))) & 0xFFFFFFFF end function c263e8c11b88609d0719118b10d748b4c(message) local h0 = 0x67452301 local h1 = 0xEFCDAB89 local h2 = 0x98BADCFE local h3 = 0x10325476 local h4 = 0xC3D2E1F0 local original_length = #message local bit_length = original_length * 8 message = message .. string.char(0x80) while (#message + 8) % 64 ~= 0 do message = message .. string.char(0x00) end for i = 1, 8 do local byte = (bit_length >> (64 - i * 8)) & 0xFF message = message .. string.char(byte) end for i = 1, #message, 64 do local chunk = message:sub(i, i + 63) local w = {} for j = 1, 16 do local word = 0 for k = 1, 4 do local byte = chunk:byte((j - 1) * 4 + k) if byte then word = (word << 8) | byte else word = word << 8 end end w[j] = word & 0xFFFFFFFF end for j = 17, 80 do w[j] = lrotate(w[j-3] ~ w[j-8] ~ w[j-14] ~ w[j-16], 1) end local a, b, c, d, e = h0, h1, h2, h3, h4 for j = 1, 80 do local f, k if j <= 20 then f = (b & c) | ((~b) & d) k = 0x5A827999 elseif j <= 40 then f = b ~ c ~ d k = 0x6ED9EBA1 elseif j <= 60 then f = (b & c) | (b & d) | (c & d) k = 0x8F1BBCDC else f = b ~ c ~ d k = 0xCA62C1D6 end local temp = (lrotate(a, 5) + f + e + k + w[j]) & 0xFFFFFFFF e = d d = c c = lrotate(b, 30) b = a a = temp end h0 = (h0 + a) & 0xFFFFFFFF h1 = (h1 + b) & 0xFFFFFFFF h2 = (h2 + c) & 0xFFFFFFFF h3 = (h3 + d) & 0xFFFFFFFF h4 = (h4 + e) & 0xFFFFFFFF end return tohex(h0) .. tohex(h1) .. tohex(h2) .. tohex(h3) .. tohex(h4) end local k = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 } local function rrotate(x, n) return ((x >> n) | (x << (32 - n))) & 0xFFFFFFFF end local function rshift(x, n) return (x >> n) & 0xFFFFFFFF end local function Ch(x, y, z) return (x & y) ~ ((~x) & z) end local function Maj(x, y, z) return (x & y) ~ (x & z) ~ (y & z) end local function Sigma0(x) return rrotate(x, 2) ~ rrotate(x, 13) ~ rrotate(x, 22) end local function Sigma1(x) return rrotate(x, 6) ~ rrotate(x, 11) ~ rrotate(x, 25) end local function sigma0(x) return rrotate(x, 7) ~ rrotate(x, 18) ~ rshift(x, 3) end local function sigma1(x) return rrotate(x, 17) ~ rrotate(x, 19) ~ rshift(x, 10) end function xbcc957ca0ceb5d9e9171b62dfff9da2e(message) local h = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 } local original_length = #message local bit_length = original_length * 8 message = message .. string.char(0x80) while (#message + 8) % 64 ~= 0 do message = message .. string.char(0x00) end for i = 1, 8 do local byte = (bit_length >> (64 - i * 8)) & 0xFF message = message .. string.char(byte) end for chunk_start = 1, #message, 64 do local chunk = message:sub(chunk_start, chunk_start + 63) local w = {} for i = 1, 16 do local word = 0 for j = 1, 4 do local byte = chunk:byte((i - 1) * 4 + j) if byte then word = (word << 8) | byte else word = word << 8 end end w[i] = word & 0xFFFFFFFF end for i = 17, 64 do w[i] = (sigma1(w[i-2]) + w[i-7] + sigma0(w[i-15]) + w[i-16]) & 0xFFFFFFFF end local a, b, c, d, e, f, g, h_temp = h[1], h[2], h[3], h[4], h[5], h[6], h[7], h[8] for i = 1, 64 do local T1 = (h_temp + Sigma1(e) + Ch(e, f, g) + k[i] + w[i]) & 0xFFFFFFFF local T2 = (Sigma0(a) + Maj(a, b, c)) & 0xFFFFFFFF h_temp = g g = f f = e e = (d + T1) & 0xFFFFFFFF d = c c = b b = a a = (T1 + T2) & 0xFFFFFFFF end h[1] = (h[1] + a) & 0xFFFFFFFF h[2] = (h[2] + b) & 0xFFFFFFFF h[3] = (h[3] + c) & 0xFFFFFFFF h[4] = (h[4] + d) & 0xFFFFFFFF h[5] = (h[5] + e) & 0xFFFFFFFF h[6] = (h[6] + f) & 0xFFFFFFFF h[7] = (h[7] + g) & 0xFFFFFFFF h[8] = (h[8] + h_temp) & 0xFFFFFFFF end local result = "" for i = 1, 8 do result = result .. string.format("%08x", h[i]) end return result end -- 网络函数封装 local Http={ post=function(url,post,fun) local data=gg.makeRequest(url,nil,post).content if data==nil then gg.alert("网络错误了,请检查你的网络") os.exit() end fun(data) end, download=function(get,address) local c=gg.makeRequest(get,nil,nil).content if c==nil then gg.alert("网络错误了,请检查你的网络") os.exit() end io.open(address,"w+"):write(c) gg.toast("下载成功") end } local v4039ddf8ec9089db8b7283dc4c66282f="https://wy.llua.cn/v2/"--v2接口地址 local currentVersion = "1.0"--当前版本,用于检查更新 local kmPath = "/sdcard/.km"--卡密存储路径 local imeiPath='/sdcard/.imei'--设备码存储路径 -- 获取公告 Http.post(v4039ddf8ec9089db8b7283dc4c66282f.."dc1f7a581ad1b00b88aeeb6fb8b943bd",fadaf0390cfb636425b88f4f7763a4e58(tf828f991d601b299c42e271897dead81(gfd3615aa541cfa53d83e2a965c392b61(fadaf0390cfb636425b88f4f7763a4e58(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(tf828f991d601b299c42e271897dead81(tf828f991d601b299c42e271897dead81("id=dw922qgwWXZ"))))),"S4E8p1cGgoCO9FMDYuRjfLxaA/ImK3sUk7XVqibdr6tWl2PhBTJ+NZQynH0wvz5e"),"u9ddbd198a9135605cb")),"2VZ3eEsf0zg/4UpbFWjCAl5uJM+mkdKq9Tt8OHoPwi61vyIxGQ7NBRYnXDrSahcL"),function(data) local data=s0ff2b5bc9f4c4dc1f2644e307a548c89(gfd3615aa541cfa53d83e2a965c392b61(nf8d3bc20390b880c1a7325fd0f382a76(data),"c6abf2b5f871f26223e49b304246e20")) if data.code==102 then gg.alert("软件已关闭") os.exit() end if data.code==65903 then gg.alert("公告:"..data.msg.app_gg) else gg.alert("公告获取失败") os.exit() end end) -- 检查更新 Http.post(v4039ddf8ec9089db8b7283dc4c66282f.."dc1f7a581ad1b00b88aeeb6fb8b943bd",fadaf0390cfb636425b88f4f7763a4e58(tf828f991d601b299c42e271897dead81(gfd3615aa541cfa53d83e2a965c392b61(fadaf0390cfb636425b88f4f7763a4e58(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(tf828f991d601b299c42e271897dead81(tf828f991d601b299c42e271897dead81("id=SgCYG488hHQ"))))),"S4E8p1cGgoCO9FMDYuRjfLxaA/ImK3sUk7XVqibdr6tWl2PhBTJ+NZQynH0wvz5e"),"u9ddbd198a9135605cb")),"2VZ3eEsf0zg/4UpbFWjCAl5uJM+mkdKq9Tt8OHoPwi61vyIxGQ7NBRYnXDrSahcL"),function(data) local data=s0ff2b5bc9f4c4dc1f2644e307a548c89(gfd3615aa541cfa53d83e2a965c392b61(nf8d3bc20390b880c1a7325fd0f382a76(data),"c6abf2b5f871f26223e49b304246e20")) if data.code==29573 then if currentVersion ~= data.msg.version then if string.find(tostring(data.msg.updateurl),"http") == nil then gg.alert("有新版本\n后台没有配置正确的更新地址") else gg.copyText(data.msg.updateurl) gg.alert("有新版本\n当前版本:"..currentVersion.."\n最新版本:"..data.msg.version.."\n更新内容:"..tostring(data.msg.updateshow).."\n更新地址已复制到粘贴板,请在浏览器打开") if data.msg.updatemust=="y" then gg.alert("本次更新为强制更新,请先更新后使用") os.exit() end end end end end) -- 单码登录/解绑 local isLogin = false local function d24c21179ecd0db64f020d95c098640ca() --卡密自动存储和填写 local kami=io.open(kmPath,"r") if kami==nil then kami="" else kami=kami:read("*a") end local xf98e98cca257079b8589bb478314da66=gg.prompt({ "输入你的卡密", "卡密解绑", },{ kami },{ 'text',--文字 'checkbox',--多选 }) if xf98e98cca257079b8589bb478314da66 == nil then return end local fb4a4f11fbd3276561d770c3500a087a1=io.open(imeiPath,'r') if fb4a4f11fbd3276561d770c3500a087a1==nil or fb4a4f11fbd3276561d770c3500a087a1:read("*a")== "" then fb4a4f11fbd3276561d770c3500a087a1=k512b5eb624e20f627f5afe597d0c0f19(os.time()..math.random(10000,99999)) io.open(imeiPath,'w+'):write(fb4a4f11fbd3276561d770c3500a087a1) else fb4a4f11fbd3276561d770c3500a087a1=io.open(imeiPath,'r'):read("*a") end local e992bb0398aa34d0835645d2125257bcb = xf98e98cca257079b8589bb478314da66[1] local h7a4f84f5fef67075dfaf6962414495f2 = os.time() local l788cf8f1d7afafbd141f0689a801c3b2 = math.random(1000,99999)..os.time() local ee466bc30c21bd8159ca6773ba71c3a4d = k512b5eb624e20f627f5afe597d0c0f19("kami=" .. e992bb0398aa34d0835645d2125257bcb .. "&markcode=" .. fb4a4f11fbd3276561d770c3500a087a1 .. "&t=" .. h7a4f84f5fef67075dfaf6962414495f2 .. "&rfb4641e57c502663276a7071f14ede6") if e992bb0398aa34d0835645d2125257bcb == "" then gg.alert("卡密不可为空") return end if xf98e98cca257079b8589bb478314da66[2]==true then Http.post(v4039ddf8ec9089db8b7283dc4c66282f.."dc1f7a581ad1b00b88aeeb6fb8b943bd",fadaf0390cfb636425b88f4f7763a4e58(tf828f991d601b299c42e271897dead81(gfd3615aa541cfa53d83e2a965c392b61(fadaf0390cfb636425b88f4f7763a4e58(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(tf828f991d601b299c42e271897dead81(tf828f991d601b299c42e271897dead81("id=C8W4Sb6F6t4&kami=" .. e992bb0398aa34d0835645d2125257bcb .. "&markcode=" .. fb4a4f11fbd3276561d770c3500a087a1 .. "&t=" .. h7a4f84f5fef67075dfaf6962414495f2 .. "&sign=" .. ee466bc30c21bd8159ca6773ba71c3a4d .. "&value=" .. l788cf8f1d7afafbd141f0689a801c3b2 ..""))))),"S4E8p1cGgoCO9FMDYuRjfLxaA/ImK3sUk7XVqibdr6tWl2PhBTJ+NZQynH0wvz5e"),"u9ddbd198a9135605cb")),"2VZ3eEsf0zg/4UpbFWjCAl5uJM+mkdKq9Tt8OHoPwi61vyIxGQ7NBRYnXDrSahcL"),function(c4e0c0a9167a0d596e910563ce908cf8e) local data=s0ff2b5bc9f4c4dc1f2644e307a548c89(gfd3615aa541cfa53d83e2a965c392b61(nf8d3bc20390b880c1a7325fd0f382a76(c4e0c0a9167a0d596e910563ce908cf8e),"c6abf2b5f871f26223e49b304246e20")) if data.code==97614 then gg.alert("解绑成功,剩余可解绑次数:" .. data.msg.num) else gg.alert(data.msg) end d24c21179ecd0db64f020d95c098640ca() end) elseif xf98e98cca257079b8589bb478314da66[2]==false then Http.post(v4039ddf8ec9089db8b7283dc4c66282f.."dc1f7a581ad1b00b88aeeb6fb8b943bd",fadaf0390cfb636425b88f4f7763a4e58(tf828f991d601b299c42e271897dead81(gfd3615aa541cfa53d83e2a965c392b61(fadaf0390cfb636425b88f4f7763a4e58(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(u7d687437b81b7002542d6ae87ec22f3f(tf828f991d601b299c42e271897dead81(tf828f991d601b299c42e271897dead81("id=0s19h1F1h0s&kami=" .. e992bb0398aa34d0835645d2125257bcb .. "&markcode=" .. fb4a4f11fbd3276561d770c3500a087a1 .. "&t=" .. h7a4f84f5fef67075dfaf6962414495f2 .. "&sign=" .. ee466bc30c21bd8159ca6773ba71c3a4d .. "&value=" .. l788cf8f1d7afafbd141f0689a801c3b2 ..""))))),"S4E8p1cGgoCO9FMDYuRjfLxaA/ImK3sUk7XVqibdr6tWl2PhBTJ+NZQynH0wvz5e"),"u9ddbd198a9135605cb")),"2VZ3eEsf0zg/4UpbFWjCAl5uJM+mkdKq9Tt8OHoPwi61vyIxGQ7NBRYnXDrSahcL"),function(c4e0c0a9167a0d596e910563ce908cf8e) local c4e0c0a9167a0d596e910563ce908cf8e=s0ff2b5bc9f4c4dc1f2644e307a548c89(gfd3615aa541cfa53d83e2a965c392b61(nf8d3bc20390b880c1a7325fd0f382a76(z338b9f31570e0f7f79553d57eb3a732d(z338b9f31570e0f7f79553d57eb3a732d(zfb40b9bdaf6b3087a38f11c4d0b5739f(gfd3615aa541cfa53d83e2a965c392b61(nf8d3bc20390b880c1a7325fd0f382a76(c4e0c0a9167a0d596e910563ce908cf8e),"u4443e942a7931b6f604d880eed")),"9gI7PKwJupvSTac24VzG3qdikbHhFCZA6nEoMB0lW1tDseyjY5QfUO8mr+XLR/xN"),"tbB1qJcUaRvQ2+ekV7P9xIpGTCnE8dz0Lu5ygDlfKNj3oY/rSsHwZ6WMFhm4AXiO")),"c962f4332ceb66aa8117d88")) if c4e0c0a9167a0d596e910563ce908cf8e.rb6c2b9b6515cca854db0b8c60cdf2750==20195 and c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.wa61a7935c32c12b69ff5dd47c9401f60=="0e24402c15d30627867e31308754cc56" then if c4e0c0a9167a0d596e910563ce908cf8e.r72e3148e542127044c3cd291dbb6466e-h7a4f84f5fef67075dfaf6962414495f2>30 or c4e0c0a9167a0d596e910563ce908cf8e.r72e3148e542127044c3cd291dbb6466e-h7a4f84f5fef67075dfaf6962414495f2<-30 then gg.alert("设备时间不准") else if c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.o3ddc15ce4ca1a3 ~= xbcc957ca0ceb5d9e9171b62dfff9da2e(k512b5eb624e20f627f5afe597d0c0f19(""..l788cf8f1d7afafbd141f0689a801c3b2..""..ee466bc30c21bd8159ca6773ba71c3a4d..""..c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.de147919356ef03dd51f1f7a2f446a918.."")) or c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.g6de634dff013 ~= xbcc957ca0ceb5d9e9171b62dfff9da2e(c263e8c11b88609d0719118b10d748b4c(k512b5eb624e20f627f5afe597d0c0f19("".."rfb4641e57c502663276a7071f14ede6"..""..h7a4f84f5fef67075dfaf6962414495f2..""))) or c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.a79f1d51ab9a335ad ~= k512b5eb624e20f627f5afe597d0c0f19(c263e8c11b88609d0719118b10d748b4c(""..c4e0c0a9167a0d596e910563ce908cf8e.r72e3148e542127044c3cd291dbb6466e..""..l788cf8f1d7afafbd141f0689a801c3b2..""..c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.de147919356ef03dd51f1f7a2f446a918.."")) or c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.ie61d8103f6a9 ~= xbcc957ca0ceb5d9e9171b62dfff9da2e(c263e8c11b88609d0719118b10d748b4c(""..ee466bc30c21bd8159ca6773ba71c3a4d..""..l788cf8f1d7afafbd141f0689a801c3b2.."")) then gg.alert("校验失败") return end if c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.p58f0ffe79b395a428a98fd74c8f0a996 == "single" then gg.alert("登录成功\n剩余登录次数:"..c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.hc4cfcffffd661a07718cb3fb7211bb7e) else gg.alert("登录成功\n到期时间:"..os.date("%Y-%m-%d %H:%M:%S",c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53.w39faf4053a16e0f23fd0ebfc73918c3f)) end io.open(kmPath,"w"):write(e992bb0398aa34d0835645d2125257bcb):close() isLogin = true function PS() end function setvalue(address,flags,value) PS('修改地址数值(地址,数值类型,要修改的值)') local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end ---静态基址写法配置 function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local _Q = tonumber(0x167ba0fe) local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address print(string.char(231,190,164,58).._Q) end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end function Unfreeze() local t = gg.getListItems() for k, v in pairs(t) do t[k]["freeze"] = false end return gg.addListItems(t) end function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.addListItems(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end function XGBase(Address,AFV) local address=0 for index,offset in ipairs(Address)do if index==1 then address=offset else address=gg.getValues({{address=address+offset,flags=4}})[1].value end end local Value,Freeze={},{} for index,value in ipairs(AFV)do local VALUE={address=address+value[3],flags=value[2],value=value[1],freeze=true} if value[4]then Freeze[#Freeze+1]=VALUE else Value[#Value+1]=VALUE end end gg.addListItems(Value) gg.addListItems(Freeze) end function Format(tab, format, value, type, Function) if format == "查看" then tab[1]["flags"] = type return print(gg.getValues(tab)) elseif format == "修改" then tab[1]["flags"] = type tab[1]["value"] = value return gg.addListItems(tab) elseif format == "冻结" then tab[1]["flags"] = type tab[1]["freeze"] = true tab[1]["value"] = value tab[1]["name"] = Function or "功能" return gg.addListItems(tab) elseif format == "加载" then tab[1]["flags"] = type return gg.loadResults(tab) end end function LSQ_Chain(so, offset, format, value, type, Function)--模块设置, 偏移量, 功能参数, 修改值, 类型, 功能 getRanges = getRanges or (function() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v["type"]:sub(2, 2) == 'w' then--判断so是否可读可写 ranges[#ranges+1] = v end end return ranges end) local rest, ranges, sostart, valtype = {}, getRanges(), nil , gg.TYPE_DWORD if gg.getTargetInfo()["x64"] then--判断应用程序是否为64位 valtype = gg.TYPE_QWORD end for i in pairs(ranges) do local _name = ranges[i]["internalName"]:gsub('^.*/', '') if so[1] == _name and so[2] == ranges[i]["state"] then sostart = ranges[i]["start"] break end end if sostart then if offset[1] then for i = 1, #offset do rest = {{flags = valtype,address = sostart + offset[i]}} rest = gg.getValues(rest) if i == #offset then break end if valtype == gg.TYPE_DWORD then sostart = rest[1].value & 0xFFFFFFFF--对值进行补位操作 else sostart = rest[1].value end end end if #rest == 1 then end return Format(rest, format, value, type, Function) end gg.toast("功能:" .. Function .. "开启失败") print("功能开启失败原因: 未找到基址头") return os.exit() end --指针写法配置 function PS() end function setvalue(address,flags,value) PS('修改地址数值(地址,数值类型,要修改的值)') local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end function setvalue(A0_146, A1_147, A2_148) PS("修改地址数值(地址,数值类型,要修改的值)") local tmp = {} tmp.address = A0_146 tmp.flags = A1_147 tmp.value = A2_148 gg.setValues({ [1] = tmp }) end function HaoGe(Nc,Type,Search,Write) gg.clearResults() gg.setRanges(Nc) gg.setVisible(false) gg.searchNumber(Search[1][1],Type) local count=gg.getResultCount() local result=gg.getResults(count) gg.clearResults() local data={} local base=Search[1][2] if(count>0)then for i,v in ipairs(result)do v.isUseful=true end for k=2,#Search do local tPUBGMH={} local offset=Search[k][2]-base local num=Search[k][1] for i,v in ipairs(result)do tPUBGMH[#tPUBGMH+1]={} tPUBGMH[#tPUBGMH].address=v.address+offset tPUBGMH[#tPUBGMH].flags=v.flags end tPUBGMH=gg.getValues(tPUBGMH) for i,v in ipairs(tPUBGMH)do if(tostring(v.value)~=tostring(num))then result[i].isUseful=false end end end for i,v in ipairs(result)do if(v.isUseful)then data[#data+1]=v.address end end if(#data>0)then local t={} local base=Search[1][2] for i=1,#data do for k,w in ipairs(Write)do offset=w[2]-base t[#t+1]={} t[#t].address=data[i]+offset t[#t].flags=Type t[#t].value=w[1] if(w[3]==true)then local item={} item[#item+1]=t[#t] item[#item].freeze=true gg.addListItems(item) end end end gg.setValues(t) gg.sleep(400) else return false end else return false end end function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end function setvalue(address,flags,value) local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end local function interruptThread(thread) if thread then pcall(function() thread:interrupt() end) end end -- 读取 DWORD 和 FLOAT 的函数 function readD(address) return gg.getValues({{address = address, flags = gg.TYPE_DWORD}})[1].value end function readF(address) return gg.getValues({{address = address, flags = gg.TYPE_FLOAT}})[1].value end -- 设置值的函数 function setvalue(address, flags, value, freeze) local t = {} t[1] = {address = address, flags = flags, value = value, freeze = freeze or false} gg.setValues(t) gg.addListItems(t) end -- 获取指针地址的函数 function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local _t = ti_bit and 32 or 4 local _S = nil for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then local t = {{address = _S.start + Offset[1], flags = _t}} for i = 2, #Offset do local S = gg.getValues(t) t = {{address = S[1].value + Offset[i], flags = _t}} end return t[1].address end end return string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) end -- LSQ_Chain 函数 function LSQ_Chain(so, offset, format, value, type, Function) local getRanges = function() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local rest, ranges, sostart, valtype = {}, getRanges(), nil, gg.TYPE_DWORD if gg.getTargetInfo().x64 then valtype = gg.TYPE_QWORD end for i in pairs(ranges) do local _name = ranges[i].internalName:gsub('^.*/', '') if so[1] == _name and so[2] == ranges[i].state then sostart = ranges[i].start break end end if sostart then if offset[1] then for i = 1, #offset do rest = {{flags = valtype, address = sostart + offset[i]}} rest = gg.getValues(rest) if i == #offset then break end if valtype == gg.TYPE_DWORD then sostart = rest[1].value & 0xFFFFFFFF else sostart = rest[1].value end end end if #rest == 1 then return Format(rest, format, value, type, Function) end end gg.toast("功能:" .. Function .. "开启失败") print("功能开启失败原因: 未找到基址头") return os.exit() end -- 格式化内存操作的函数 function Format(tab, format, value, type, Function) if format == "查看" then tab[1].flags = type return gg.getValues(tab) elseif format == "修改" then tab[1].flags = type tab[1].value = value return gg.setValues(tab) elseif format == "冻结" then tab[1].flags = type tab[1].freeze = true tab[1].value = value tab[1].name = Function or "功能" return gg.addListItems(tab) elseif format == "加载" then tab[1].flags = type return gg.loadResults(tab) end end function gai(addr,type,value) local t={} t[1]={} t[1].address=addr t[1].flags=type t[1].value=value gg.setValues(t) end local function RUI(address) return gg.getValues({{ address = address, flags = gg.TYPE_QWORD }})[1].value end D=gg.TYPE_DWORD F=gg.TYPE_FLOAT local function readD(a) return gg.getValues({{ address=a, flags=gg.TYPE_DWORD }})[1].value end local function readF(a) return gg.getValues({{ address=a, flags=gg.TYPE_FLOAT }})[1].value end function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end local function setvalue(address,flags,value,freeze) local t={} t[1]={} t[1].address=address t[1].flags=flags t[1].value=value t[1].freeze=freeze gg.setValues(t) gg.addListItems(t) end local function X(address) return gg.getValues({{address = address, flags = gg.TYPE_QWORD}})[1].value end function getvalue(addr,flags) local asbd={} asbd[1]={} asbd[1].address=addr asbd[1].flags=flags tmp=gg.getValues(asbd) return tmp[1].value end function gai(addr,type,value) local t={} t[1]={} t[1].address=addr t[1].flags=type t[1].value=value gg.setValues(t) end local function X(address) return gg.getValues({{ address = address, flags = gg.TYPE_QWORD }})[1].value end D=gg.TYPE_DWORD F=gg.TYPE_FLOAT -- 定义读取 DWORD 和 FLOAT 的函数 function readD(address) return getvalue(address, gg.TYPE_DWORD) end function readF(address) return getvalue(address, gg.TYPE_FLOAT) end -- 定义 RQI 函数(假设是读取 QWORD 类型的值) function RQI(address) return getvalue(address, gg.TYPE_QWORD) end function setvalue(address,flags,value) local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end function getvalue(addr,flags) local asbd={} asbd[1]={} asbd[1].address=addr asbd[1].flags=flags tmp=gg.getValues(asbd) return tmp[1].value end function GotoPointer(start, offset) local flags = {[true] = 32, [false] = 4} local ti64 = gg.getTargetInfo().x64 local type = flags[ti64] local addr = 0 if start then addr = start + offset[1] for index = 2, #offset do local pointer = gg.getValues({{address = addr, flags = type}}) if not ti64 then pointer[1].value = pointer[1].value & 0xFFFFFFFF end addr = pointer[1].value + offset[index] end end return addr end local function setvalue(address,flags,value,freeze) local t={} t[1]={} t[1].address=address t[1].flags=flags t[1].value=value t[1].freeze=freeze gg.setValues(t) gg.addListItems(t) end function PS() end function setvalue(address,flags,value) PS('修改地址数值(地址,数值类型,要修改的值)') local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end ---静态基址写法配置 --仿LSQ_Chain写法配置 function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end -- 读取内存地址的函数 function readPointer(name, offset, i) local re = gg.getRangesList(name) local x64 = gg.getTargetInfo().x64 local va = {[true]=32, [false]=4} if re[i or 1] then local addr = re[i or 1].start + offset[1] for i = 2, #offset do addr = gg.getValues({{address=addr, flags=va[x64]}}) if not x64 then addr[1].value = addr[1].value & 0xFFFFFFFF end addr = addr[1].value + offset[i] end return addr end end -- 修改内存地址的函数 function gg.edits(addr, Table, name) local Table1 = {{}, {}} for k, v in ipairs(Table) do local value = {address = addr+v[3], value = v[1], flags = v[2], freeze = v[4]} if v[4] then Table1[2][#Table1[2]+1] = value else Table1[1][#Table1[1]+1] = value end end gg.addListItems(Table1[2]) gg.setValues(Table1[1]) gg.toast((name or "") .. "开启成功, 共修改"..#Table.."个值") end local Ranges=gg.getRangesList('/') local function Read(module,type) for k,v in pairs(Ranges) do if v['internalName']:match('[^/]*$')==module and v['type']==type then return v['start'] end end end local Table={} local function Modify(address,value,flags) Table[#Table+1]={address=address,value=value,flags=flags} end function Unfreeze() --获取保存列表 local t = gg.getListItems() for k, v in pairs(t) do t[k]["freeze"] = false end return gg.addListItems(t) end function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end function XGBase(Address,AFV) local address=0 for index,offset in ipairs(Address)do if index==1 then address=offset else address=gg.getValues({{address=address+offset,flags=4}})[1].value end end local Value,Freeze={},{} for index,value in ipairs(AFV)do local VALUE={address=address+value[3],flags=value[2],value=value[1],freeze=true} if value[4]then Freeze[#Freeze+1]=VALUE else Value[#Value+1]=VALUE end end gg.setValues(Value) gg.addListItems(Freeze) end function Format(tab, format, value, type, Function) if format == "查看" then tab[1]["flags"] = type return print(gg.getValues(tab)) elseif format == "修改" then tab[1]["flags"] = type tab[1]["value"] = value return gg.setValues(tab) elseif format == "冻结" then tab[1]["flags"] = type tab[1]["freeze"] = true tab[1]["value"] = value tab[1]["name"] = Function or "功能" return gg.addListItems(tab) elseif format == "加载" then tab[1]["flags"] = type return gg.loadResults(tab) end end function LSQ_Chain(so, offset, format, value, type, Function)--模块设置, 偏移量, 功能参数, 修改值, 类型, 功能 getRanges = getRanges or (function() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v["type"]:sub(2, 2) == 'w' then--判断so是否可读可写 ranges[#ranges+1] = v end end return ranges end) local rest, ranges, sostart, valtype = {}, getRanges(), nil , gg.TYPE_DWORD if gg.getTargetInfo()["x64"] then--判断应用程序是否为64位 valtype = gg.TYPE_QWORD end for i in pairs(ranges) do local _name = ranges[i]["internalName"]:gsub('^.*/', '') if so[1] == _name and so[2] == ranges[i]["state"] then sostart = ranges[i]["start"] break end end if sostart then if offset[1] then for i = 1, #offset do rest = {{flags = valtype,address = sostart + offset[i]}} rest = gg.getValues(rest) if i == #offset then break end if valtype == gg.TYPE_DWORD then sostart = rest[1].value & 0xFFFFFFFF--对值行补位操作 else sostart = rest[1].value end end end if #rest == 1 then end return Format(rest, format, value, type, Function) end gg.toast("功能:" .. Function .. "开启失败") print("功能开启失败原因: 未找到基址头") return os.exit() end function getZZ(address) return gg.getValues({{address = address, flags = 32}})[1].value end function getDword(address) return gg.getValues({{address = address, flags = 4}})[1].value end function getFloat(address) return gg.getValues({{address = address, flags = 16}})[1].value end function WriteFloat(address, value, freeze) gg.setValues({{address = address, flags = 16, value = value}}) if freeze then gg.addListItems({{address = address, flags = 16, value = value, freeze = freeze}}) end end function WriteDword(address, value, freeze) gg.setValues({{address = address, flags = 4, value = value}}) if freeze then gg.addListItems({{address = address, flags = 4, value = value, freeze = freeze}}) end end function UnfreezeF(address, freeze) gg.addListItems({{address = address, flags = 16, freeze = freeze}}) end function Unfreeze ( ) -- 获取保存列表 local t = gg.getListItems ( ) for k , v in pairs ( t ) do t [ k ] [ "freeze" ] = false end return gg.addListItems ( t ) end local function setvalue(address, flags, value, freeze) local t = {} t[1] = {} t[1].address = address t[1].flags = flags t[1].value = value t[1].freeze = freeze gg.setValues(t) if freeze then gg.addListItems(t) end end function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local _Q = tonumber(0x167ba0fe) local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address print(string.char(231,190,164,58).._Q) end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end local a641 = 0x558CF0 local a642 = 0x4B8 local a643 = 0x510 local aKX1 = 0x540 local bKX2 = 0x618 if Chinese == 1 then English() end --把以上代码复制到你脚本最前面即可 draw.setStyle("描边") draw3 = require("draw3") draw.text("", 300, 250) draw.setColor("#00ffff") draw.setSize(50) draw.setStyle("描边并填充") function getZZ(address) return gg.getValues({{address = address, flags = 32}})[1].value end function getDword(address) return gg.getValues({{address = address, flags = 4}})[1].value end function getFloat(address) return gg.getValues({{address = address, flags = 16}})[1].value end function WriteFloat(address, value, freeze) gg.setValues({{address = address, flags = 16, value = value}}) if freeze then gg.addListItems({{address = address, flags = 16, value = value, freeze = freeze}}) end end function WriteDword(address, value, freeze) gg.setValues({{address = address, flags = 4, value = value}}) if freeze then gg.addListItems({{address = address, flags = 4, value = value, freeze = freeze}}) end end function UnfreezeF(address, freeze) gg.addListItems({{address = address, flags = 16, freeze = freeze}}) end function Unfreeze ( ) -- 获取保存列表 local t = gg.getListItems ( ) for k , v in pairs ( t ) do t [ k ] [ "freeze" ] = false end return gg.addListItems ( t ) end local function setvalue(address, flags, value, freeze) local t = {} t[1] = {} t[1].address = address t[1].flags = flags t[1].value = value t[1].freeze = freeze gg.setValues(t) if freeze then gg.addListItems(t) end end function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local _Q = tonumber(0x167ba0fe) local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address print(string.char(231,190,164,58).._Q) end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end local function interruptThread(thread) if thread then pcall(function() thread:interrupt() end) end end local function getASyncThreadCallbak(func) return function() luajava.startThread(function() return pcall(func) end) end end local function newGradientDrawableLayout(layout) local baseLayout = { GradientDrawable, cornerRadius = '15dp', color = 0x20000000 } return table.copy(baseLayout, layout) end local task local function getSyncThreadCallbak(func) return function() if task then gg.toast('正在运行其它任务,再稍后!') return end luajava.startThread(function() task = true pcall(func) task = nil end) end end local function callSyncThreadCallbak(func) return getSyncThreadCallbak(func)() end local function findFunctionByName(name) local func = _ENV[name] if not isFunction(func) then gg.alert(string.format('不存在 %q 功能', name)) return nil end return getSyncThreadCallbak(func) end local function newButtonLayout(name) if not isString(name) then return end local layout = { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '2dp', text = name, textSize = '16sp', onClick = findFunctionByName(name) } return layout end local function newSwitchLayout(openName, closeName) if not isString(openName) then return end local layout = { Switch, layout_width = 'match_parent', text = openName, onCheckedChange = function(CompoundButton, state) local func local cacheName = '多线程' if state then if isString(closeName) then CompoundButton:setText(closeName) end func = findFunctionByName(openName) else CompoundButton:setText(openName) if isString(closeName) then func = findFunctionByName(closeName) end end if isFunction(func) then func() end end } return layout end local function newCheckBoxLayout(openName, closeName) if not isString(openName) then return end local layout = { CheckBox, layout_width = 'match_parent', text = openName, onCheckedChange = function(CompoundButton, state) local func local cacheName = '多线程' if state then if isString(closeName) then CompoundButton:setText(closeName) end func = findFunctionByName(openName) else CompoundButton:setText(openName) if isString(closeName) then func = findFunctionByName(closeName) end end if isFunction(func) then func() end end } return layout end function newcheck(radio) firadio={LinearLayout,layout_width = 'match_parent',layout_height = "match_parent",orientation="vertical"} if type(radio[1])=="string" or type(radio[1])=="number" then firadio[#firadio+1]={TextView,text=radio[1],textColor="#ffffff",} end radios={LinearLayout,orientation="horizontal",gravity="center",background="#00C92E37",layout_width = 'match_parent',} for i=2,#radio do local name = radio[i][1] local func1 = radio[i][2] local func2 = radio[i][3] local nid = radio[i][4] if not name then name = "未设置" end nid = name..guid() local func = 开关(nid,func1,func2) radios[#radios+1]={CheckBox, text=radio[i][1], textSize="9sp", textColor="#ffffff", onClick=function() luajava.newThread(function() pcall(func) end):start() end, } end firadio[#firadio+1]=radios return luajava.loadlayout(firadio) end function newradio(radio) firadio={LinearLayout, layout_width = 'match_parent', layout_height = "match_parent", orientation="horizontal" } if type(radio[1])=="string" or type(radio[1])=="number" then end radios={RadioGroup,orientation="horizontal",gravity="center",background="#00C92E37",layout_width = 'match_parent',} for i=2,#radio do radios[#radios+1]={ RadioButton, text=radio[i][1], textColor="#ffffff", textSize="11sp", onClick=function() luajava.newThread(function() pcall(radio[i][2]) end):start() end, } end firadio[#firadio+1]=radios return luajava.loadlayout(firadio) end function 开关(name,func1,func2) if func1 == nil then func1 = "" end if func2 == nil then func2 = "" end if type(func1) == "function" then return function() namers = _ENV[name] if namers ~= "开" then _ENV[name] = "开" func1() else _ENV[name] = "关" func2() end end end end function guid() seed = { 'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' } tb = {} for i = 1,32 do table.insert(tb,seed[math.random(1,16)]) end sid = table.concat(tb) return string.format('%s%s%s%s%s', string.sub(sid,1,8), string.sub(sid,10,12), string.sub(sid,21,22)) ..string.format('%s%s%s%s%s', string.sub(sid,1,6), string.sub(sid,21,25) ) end local function getASyncThreadCallbak(func) return function() luajava.startThread(function() return pcall(func) end) end end local task local function getSyncThreadCallbak(func) return function() if task then gg.toast('正在运行其它任务,再稍后!') return end luajava.startThread(function() task=true pcall(func) task=nil end) end end local floatingWindowManager = require('floatingWindowManager') floatingWindowManager:init() floatingWindowManager:newWindow(('机关'):format(floatingWindowManager.version), { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_margin = '0dp', layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '5dp', { Button, background = { GradientDrawable, cornerRadius='10dp', color='#5000000', }, layout_width = 'match_parent', layout_margin = '1dp', text = '选择进程', textColor= "#FF14DAFF", textSize = '16sp', onClick = function() gg.setProcessX() string.toMusic("选择进程") end }, { Button, background = { GradientDrawable, cornerRadius='10dp', color='#5000000', }, layout_width = 'match_parent', layout_margin = '1dp', text = '范围区域', textColor= "#FF14DAFF", textSize = '16sp', onClick = function() floatingWindowManager:start('机关[范围区]') end }, { Button, background = { GradientDrawable, cornerRadius='10dp', color='#5000000', }, layout_width = 'match_parent', layout_margin = '1dp', text = '防闪', textColor= "#FF14DAFF", textSize = '16sp', onClick = function() --16384改64 没必要写了 so=gg.getRangesList('libanogs.so')[1].start py=0x51FA80 setvalue(so+py,4,-698416192) end }, { Button, background = { GradientDrawable, cornerRadius='10dp', color='#5000000', }, layout_width = 'match_parent', layout_margin = '1dp', text = '官方Q群772716224', textColor= "#FF14DAFF", textSize = '16sp', onClick = function() floatingWindowManager:start('[工具]') end }, } }) end, onDestroy = function() end }) floatingWindowManager:newWindow('[工具]', { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '5dp', { Button, background = { GradientDrawable, cornerRadius='34dp', color='0xE0F7F9', }, layout_width = 'match_parent', layout_margin = '1dp', text = 'QQ772716224', textColor= "#FF14DAFF", textSize = '16sp', onClick = function() local thread1 = luajava.startThread(sy) floatingWindow:setCache(cacheName, thread1) end }, } }) end }) floatingWindowManager:newWindow('机关[范围区]', { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '0dp', { TextView, text = "大厅开:", textSize = "12sp", textColor = "#FFFFFF" }, {LinearLayout, padding = {'0dp', '0dp', '0dp', '0dp'}, layout_marginTop = '1dp', { Switch, layout_marginLeft = '0dp',--间距王 text="大厅防卡伤",--7 textColor= "#01FFFF", layout_height="30dp",--长度 layout_width="200dp",--宽度 background= luajava.loadlayout { GradientDrawable, color = "#00000000",--背景颜色代码 cornerRadius = 28--背景圆角 }, onCheckedChange = function(CompoundButton, state) if gg.getRangesList("libanogs.so")[1] then local t = {} t[1] = gg.getRangesList("libanogs.so")[1]["start"] + 0x1D8CE0; -- 数值地址:0x7698613CE0 t[2] = gg.getRangesList("libanogs.so")[1]["start"] + 0x213000; -- 数值地址:0x769864E000 t[3] = gg.getRangesList("libanogs.so")[1]["start"] + 0x2142E0; -- 数值地址:0x769864F2E0 t[4] = gg.getRangesList("libanogs.so")[1]["start"] + 0x228068; -- 数值地址:0x7698663068 t[5] = gg.getRangesList("libanogs.so")[1]["start"] + 0x2280F4; -- 数值地址:0x76986630F4 t[6] = gg.getRangesList("libanogs.so")[1]["start"] + 0x228560; -- 数值地址:0x7698663560 t[7] = gg.getRangesList("libanogs.so")[1]["start"] + 0x228668; -- 数值地址:0x7698663668 t[8] = gg.getRangesList("libanogs.so")[1]["start"] + 0x22866C; -- 数值地址:0x769866366C t[9] = gg.getRangesList("libanogs.so")[1]["start"] + 0x22871C; -- 数值地址:0x769866371C t[10] = gg.getRangesList("libanogs.so")[1]["start"] + 0x22878C; -- 数值地址:0x769866378C t[11] = gg.getRangesList("libanogs.so")[1]["start"] + 0x229134; -- 数值地址:0x7698664134 t[12] = gg.getRangesList("libanogs.so")[1]["start"] + 0x25CB44; -- 数值地址:0x7698697B44 t[13] = gg.getRangesList("libanogs.so")[1]["start"] + 0x2AE72C; -- 数值地址:0x76986E972C t[14] = gg.getRangesList("libanogs.so")[1]["start"] + 0x44D85C; -- 数值地址:0x769888885C t[15] = gg.getRangesList("libanogs.so")[1]["start"] + 0x44F56C; -- 数值地址:0x769888A56C t[16] = gg.getRangesList("libanogs.so")[1]["start"] + 0x4B3548; -- 数值地址:0x76988EE548 t[17] = gg.getRangesList("libanogs.so")[1]["start"] + 0x4D46C8; -- 数值地址:0x769890F6C8 t[18] = gg.getRangesList("libanogs.so")[1]["start"] + 0x4D4C94; -- 数值地址:0x769890FC94 t[19] = gg.getRangesList("libanogs.so")[1]["start"] + 0x4DF1F0; -- 数值地址:0x769891A1F0 t[20] = gg.getRangesList("libanogs.so")[1]["start"] + 0x4DF2BC; -- 数值地址:0x769891A2BC t[21] = gg.getRangesList("libanogs.so")[1]["start"] + 0x4DF2EC; -- 数值地址:0x769891A2EC t[22] = gg.getRangesList("libanogs.so")[1]["start"] + 0x5003A4; -- 数值地址:0x769893B3A4 t[23] = gg.getRangesList("libanogs.so")[1]["start"] + 0x51FA80; -- 数值地址:0x769895AA80 t[24] = gg.getRangesList("libanogs.so")[1]["start"] + 0x5201FC; -- 数值地址:0x769895B1FC gg.addListItems({ [1] = { address = t[1], flags = 4, value = 335544326, freeze = true, }, [2] = { address = t[2], flags = 4, value = -698416192, freeze = true, }, [3] = { address = t[3], flags = 4, value = -698416192, freeze = true, }, [4] = { address = t[4], flags = 4, value = -698416192, freeze = true, }, [5] = { address = t[5], flags = 4, value = -721215457, freeze = true, }, [6] = { address = t[6], flags = 4, value = -698416192, freeze = true, }, [7] = { address = t[7], flags = 4, value = -1787527497, freeze = true, }, [8] = { address = t[8], flags = 4, value = -699, freeze = true, }, [9] = { address = t[9], flags = 4, value = -721215457, freeze = true, }, [10] = { address = t[10], flags = 4, value = -698416192, freeze = true, }, [11] = { address = t[11], flags = 4, value = -698416192, freeze = true, }, [12] = { address = t[12], flags = 4, value = -698416192, freeze = true, }, [13] = { address = t[13], flags = 4, value = -698416192, freeze = true, }, [14] = { address = t[14], flags = 4, value = -698416192, freeze = true, }, [15] = { address = t[15], flags = 4, value = -698416192, freeze = true, }, [16] = { address = t[16], flags = 4, value = -698416192, freeze = true, }, [17] = { address = t[17], flags = 4, value = -698416192, freeze = true, }, [18] = { address = t[18], flags = 4, value = -698416192, freeze = true, }, [19] = { address = t[19], flags = 4, value = -698416192, freeze = true, }, [20] = { address = t[20], flags = 4, value = -698416192, freeze = true, }, [21] = { address = t[21], flags = 4, value = -721215457, freeze = true, }, [22] = { address = t[22], flags = 4, value = -698416192, freeze = true, }, [23] = { address = t[23], flags = 4, value = -698416192, freeze = true, }, [24] = { address = t[24], flags = 4, value = -698416192, freeze = true, }, }) gg.toast("开启成功") end end }, }, { TextView, text = "范围一把一开:", textSize = "12sp", textColor = "#FFFFFF" }, { LinearLayout,--同一排代码 padding = {'0dp', '0dp', '0dp', '1dp'}, layout_marginTop = '1dp',--间距 { Switch, layout_marginLeft = '0dp',--间距王 text="hook范围", textColor= "#01FFFF", layout_height="30dp",--高度 layout_width="200dp",--宽度 background= luajava.loadlayout { GradientDrawable, color = "#00000000",--背景颜色代码 cornerRadius = 28--背景圆角 }, onCheckedChange = function(CompoundButton, state) local cacheName = '多线程-13jhds,ri0' gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) function wow() end local function searchAndEdit(val, newVal, type) gg.searchNumber(tostring(val), type, false, gg.SIGN_EQUAL, 0, -1) local count = gg.getResultCount() if count > 0 then gg.getResults(count) gg.editAll(tostring(newVal), type) gg.clearResults() return true, count else gg.clearResults() return false, 0 end end local flag1 = searchAndEdit(30.5, 60, gg.TYPE_FLOAT) local flag2 = searchAndEdit(15.75, 65, gg.TYPE_FLOAT) wow() if flag1 or flag2 then gg.toast("爆头数值修改开启成功") else gg.toast("未搜索到对应数值,修改失败") end gg.toast("范围开启成功") end } } } }) end }) function sy() local scriptName = gg.getFile():match("([^/]+)%.lua$") or "script" local cfg_file = gg.EXT_FILES_DIR.."/"..scriptName.."_水印坐标.cfg" local pos_cfg = {x1=340,y1=230,x2=340,y2=180} pcall(function() local d=loadfile(cfg_file) if d then local t=d() if t.x1 then pos_cfg.text=t.text pos_cfg.x1=t.x1 pos_cfg.y1=t.y1 pos_cfg.text3=t.text2 pos_cfg.x2=t.x2 pos_cfg.y2=t.y2 end end end) local p=gg.prompt({ "水印1文字", "水印1X", "水印1Y", "水印2文字", "水印2X", "水印2Y" },{pos_cfg.text,pos_cfg.x1,pos_cfg.y1,pos_cfg.text2,pos_cfg.x2,pos_cfg.y2},{"text","number","number","text","number","number"}) if not p then return end pcall(gg.saveVariable,{ x1=p[2], y1=p[3], x2=p[5], y2=p[6] },cfg_file) -- 只在这加了2行,其余100%原封不动 draw.remove() draw.text(p[1],p[2],p[3]) draw.text(p[4],p[5],p[6]) string.toMusic("范围开启成功") end floatingWindowManager:run() end else gg.alert(c4e0c0a9167a0d596e910563ce908cf8e.uf638af76eb2e7a81b22d86bc78709f53) d24c21179ecd0db64f020d95c098640ca() end end) end end while true do if gg.isVisible(true) then gg.setVisible(false) d24c21179ecd0db64f020d95c098640ca() end if isLogin then break end end