ffvpn = "https://biaozhunshijian.bmcx.com" ffvpn = "https://vpn.uibe.edu.cn/por/phone_index.csp?rnd=0.23178949332658605#https%3A%2F%2Fvpn.uibe.edu.cn%2F" x = tostring(gg.makeRequest(ffvpn)) if not x or not x:sub(1, 20) then gg.alert("GGæ— æ³•è®¿é—®ç½‘ç»œè¯·æŸ¥çœ‹ç›¸åº”é™æƒ", "") elseif #x < 100 or x:find("SSL") or x:find("I/O") or x:find("javax") then gg.alert("ä½ å·²å¼€å¯äº†NPNçŽ¯å¢ƒè¯·å‹¿ç”¨æŠ“åŒ…âš âš âš ðŸ›¡é˜²æŠ“åŒ…å¼€å¯æˆåŠŸðŸ›¡ðŸ›¡è¦å‘ŠðŸ›¡å¦åˆ™å‘现关é—使用æƒ") for _FORV_4_ = 1, 3 do function AA(bytes,result1,result2) for i=1,999 do local bytesa=load(bytes) end end function BB() local dataArr={'999999','0000000'} for index,value in pairs(dataArr) do bytes = tonumber(value) AA(bytes,result1,result2) end end BB() print("网络请求è¦å‘Š:\n\n╾╾╾╾╾ è¦å‘Š âš â•¾â•¾â•¾â•¾â•¾ \n检测到您æ£åœ¨ä½¿ç”¨æ¶æ„æŠ“åŒ…è½¯ä»¶ç ´è§£è„šæœ¬\nå·²è‡ªåŠ¨åˆ é™¤åŽŸè„šæœ¬\n请勿有è¿è§„行为\n╾╾╾╾╾⚠è¦å‘Š âš â•¾â•¾â•¾â•¾â•¾ ") end end local loadingBox = getLoadingBox ('æ£åœ¨æ£€æµ‹æ˜¯å¦æŠ“包如果抓包会下载病毒...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) BxCb =io.open('/sdcard/è£æƒ…RQ/图片/arblackx','r') if BxCb == nil then gg.alert("æ‚¨çš„èµ„æºæœªä¸‹è½½å®Œæˆ\nå³å°†ä¸ºæ‚¨ä¸‹è½½") download("http://vip.kyun.top/view.php/ae99501fa3de394383a15788a38ca6f2.png" , "/sdcard/è£æƒ…RQ/图片/arblackx") else --ä¸ç”¨æ·»åŠ end BxCb =io.open('/sdcard/è£æƒ…RQ/图片/hsj','r') if BxCb == nil then download("http://vip.kyun.top/view.php/a2f1de1330554a8e6e291b6d6317197d.png" , "/sdcard/è£æƒ…RQ/图片/hsj") else --ä¸ç”¨æ·»åŠ end BxCb =io.open('/sdcard/è£æƒ…RQ/图片/sj','r') if BxCb == nil then download("http://vip.kyun.top/view.php/909df2df9c0e9e1cc80e0a6d9d93f097.png" , "/sdcard/è£æƒ…RQ/图片/sj") else --ä¸ç”¨æ·»åŠ end if io.open('/sdcard/Android/鹅毛.cfg') == nil then local logo=[=["一群:917063803\n二群:未有\n三群:未有"]=] local Em = gg.alert(logo,'收到','ä¸å†æé†’') if Em ==nil then return else end if Em == 2 then local xv1 = io.open('/sdcard/Android/鹅毛.cfg', 'w'):write('éªŒè¯æ–‡ä»¶') end else end --全版本通用é…ç½® function SOMOD_byYx() local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire) local loadingPlaceholder = {[{}] = true} local register local modules = {} local require local loaded = {} register = function(name, body) if not modules[name] then modules[name] = body end end require = function(name) local loadedModule = loaded[name] if loadedModule then if loadedModule == loadingPlaceholder then return nil end else if not modules[name] then if not superRequire then local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name) error('Tried to require ' .. identifier .. ', but no such module has been registered') else return superRequire(name) end end loaded[name] = loadingPlaceholder loadedModule = modules[name](require, loaded, register, modules) loaded[name] = loadedModule end return loadedModule end return require, loaded, register, modules end)(require) __bundle_register("GGIl2cpp", function(require, _LOADED, __bundle_register, __bundle_modules) require("utils.il2cppconst") require("il2cpp") ---@class ClassInfoRaw ---@field ClassName string | nil ---@field ClassInfoAddress number ---@field ImageName string ---@class ClassInfo ---@field ClassName string ---@field ClassAddress string ---@field Methods MethodInfo[] | nil ---@field Fields FieldInfo[] | nil ---@field Parent ParentClassInfo | nil ---@field ClassNameSpace string ---@field StaticFieldData number | nil ---@field IsEnum boolean ---@field TypeMetadataHandle number ---@field InstanceSize number ---@field Token string ---@field ImageName string ---@field GetFieldWithName fun(self : ClassInfo, name : string) : FieldInfo | nil @Get FieldInfo by Field Name. If Fields weren't dumped, then this function return `nil`. Also, if Field isn't found by name, then function will return `nil` ---@field GetMethodsWithName fun(self : ClassInfo, name : string) : MethodInfo[] | nil @Get MethodInfo[] by MethodName. If Methods weren't dumped, then this function return `nil`. Also, if Method isn't found by name, then function will return `table with zero size` ---@field GetFieldWithOffset fun(self : ClassInfo, fieldOffset : number) : FieldInfo | nil ---@class ParentClassInfo ---@field ClassName string ---@field ClassAddress string ---@class FieldInfoRaw ---@field FieldInfoAddress number ---@field ClassName string | nil ---@class ClassMemory ---@field config ClassConfig ---@field result ClassInfo[] | ErrorSearch ---@field len number ---@field isNew boolean | nil ---@class MethodMemory ---@field len number ---@field result MethodInfo[] | ErrorSearch ---@field isNew boolean | nil ---@class FieldInfo ---@field ClassName string ---@field ClassAddress string ---@field FieldName string ---@field Offset string ---@field IsStatic boolean ---@field Type string ---@field IsConst boolean ---@field Access string ---@field GetConstValue fun(self : FieldInfo) : nil | string | number ---@class MethodInfoRaw ---@field MethodName string | nil ---@field Offset number | nil ---@field MethodInfoAddress number ---@field ClassName string | nil ---@field MethodAddress number ---@class ErrorSearch ---@field Error string ---@class MethodInfo ---@field MethodName string ---@field Offset string ---@field AddressInMemory string ---@field MethodInfoAddress number ---@field ClassName string ---@field ClassAddress string ---@field ParamCount number ---@field ReturnType string ---@field IsStatic boolean ---@field IsAbstract boolean ---@field Access string ---@class Il2cppApi ---@field FieldApiOffset number ---@field FieldApiType number ---@field FieldApiClassOffset number ---@field ClassApiNameOffset number ---@field ClassApiMethodsStep number ---@field ClassApiCountMethods number ---@field ClassApiMethodsLink number ---@field ClassApiFieldsLink number ---@field ClassApiFieldsStep number ---@field ClassApiCountFields number ---@field ClassApiParentOffset number ---@field ClassApiNameSpaceOffset number ---@field ClassApiStaticFieldDataOffset number ---@field ClassApiEnumType number ---@field ClassApiEnumRsh number ---@field ClassApiTypeMetadataHandle number ---@field ClassApiInstanceSize number ---@field ClassApiToken number ---@field MethodsApiClassOffset number ---@field MethodsApiNameOffset number ---@field MethodsApiParamCount number ---@field MethodsApiReturnType number ---@field MethodsApiFlags number ---@field typeDefinitionsSize number ---@field typeDefinitionsOffset number ---@field stringOffset number ---@field fieldDefaultValuesOffset number ---@field fieldDefaultValuesSize number ---@field fieldAndParameterDefaultValueDataOffset number ---@field TypeApiType number ---@field Il2CppTypeDefinitionApifieldStart number ---@field MetadataRegistrationApitypes number ---@class ClassConfig ---@field Class number | string @Class Name or Address Class ---@field FieldsDump boolean ---@field MethodsDump boolean ---@class Il2cppConfig ---@field libilcpp table | nil ---@field globalMetadata table | nil ---@field il2cppVersion number | nil ---@field globalMetadataHeader number | nil ---@field metadataRegistration number | nil ---@class Il2CppTypeDefinitionApi ---@field fieldStart number ---@class MethodFlags ---@field Access string[] ---@field METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK number ---@field METHOD_ATTRIBUTE_STATIC number ---@field METHOD_ATTRIBUTE_ABSTRACT number ---@class FieldFlags ---@field Access string[] ---@field FIELD_ATTRIBUTE_FIELD_ACCESS_MASK number ---@field FIELD_ATTRIBUTE_STATIC number ---@field FIELD_ATTRIBUTE_LITERAL number return Il2cpp end) __bundle_register("il2cpp", function(require, _LOADED, __bundle_register, __bundle_modules) local Il2cppMemory = require("utils.il2cppmemory") local VersionEngine = require("utils.version") local AndroidInfo = require("utils.androidinfo") local Searcher = require("utils.universalsearcher") local PatchApi = require("utils.patchapi") ---@class Il2cpp local Il2cppBase = { il2cppStart = 0, il2cppEnd = 0, globalMetadataStart = 0, globalMetadataEnd = 0, globalMetadataHeader = 0, MainType = AndroidInfo.platform and gg.TYPE_QWORD or gg.TYPE_DWORD, pointSize = AndroidInfo.platform and 8 or 4, ---@type Il2CppTypeDefinitionApi Il2CppTypeDefinitionApi = {}, MetadataRegistrationApi = require("il2cppstruct.metadataRegistration"), TypeApi = require("il2cppstruct.type"), MethodsApi = require("il2cppstruct.method"), GlobalMetadataApi = require("il2cppstruct.globalmetadata"), FieldApi = require("il2cppstruct.field"), ClassApi = require("il2cppstruct.class"), ObjectApi = require("il2cppstruct.object"), ClassInfoApi = require("il2cppstruct.api.classinfo"), FieldInfoApi = require("il2cppstruct.api.fieldinfo"), ---@type MyString String = require("il2cppstruct.il2cppstring"), MemoryManager = require("utils.malloc"), --- Patch `Bytescodes` to `add` --- --- Example: --- arm64: --- `mov w0,#0x1` --- `ret` --- --- `Il2cpp.PatchesAddress(0x100, "\x20\x00\x80\x52\xc0\x03\x5f\xd6")` ---@param add number ---@param Bytescodes string ---@return Patch PatchesAddress = function(add, Bytescodes) local patchCode = {} for code in string.gmatch(Bytescodes, '.') do patchCode[#patchCode + 1] = { address = add + #patchCode, value = string.byte(code), flags = gg.TYPE_BYTE } end ---@type Patch local patch = PatchApi:Create(patchCode) patch:Patch() return patch end, --- Searches for a method, or rather information on the method, by name or by offset, you can also send an address in memory to it. --- --- Return table with information about methods. ---@generic TypeForSearch : number | string ---@param searchParams TypeForSearch[] @TypeForSearch = number | string ---@return table<number, MethodInfo[] | ErrorSearch> FindMethods = function(searchParams) Il2cppMemory:SaveResults() for i = 1, #searchParams do ---@type number | string searchParams[i] = Il2cpp.MethodsApi:Find(searchParams[i]) end Il2cppMemory:ClearSavedResults() return searchParams end, --- Searches for a class, by name, or by address in memory. --- --- Return table with information about class. ---@param searchParams ClassConfig[] ---@return table<number, ClassInfo[] | ErrorSearch> FindClass = function(searchParams) Il2cppMemory:SaveResults() for i = 1, #searchParams do searchParams[i] = Il2cpp.ClassApi:Find(searchParams[i]) end Il2cppMemory:ClearSavedResults() return searchParams end, --- Searches for an object by name or by class address, in memory. --- --- In some cases, the function may return an incorrect result for certain classes. For example, sometimes the garbage collector may not have time to remove an object from memory and then a `fake object` will appear or for a turnover, the object may still be `not implemented` or `not created`. --- --- Returns a table of objects. ---@param searchParams table ---@return table FindObject = function(searchParams) Il2cppMemory:SaveResults() for i = 1, #searchParams do searchParams[i] = Il2cpp.ObjectApi:Find(Il2cpp.ClassApi:Find({Class = searchParams[i]})) end Il2cppMemory:ClearSavedResults() return searchParams end, --- Searches for a field, or rather information about the field, by name or by address in memory. --- --- Return table with information about fields. ---@generic TypeForSearch : number | string ---@param searchParams TypeForSearch[] @TypeForSearch = number | string ---@return table<number, FieldInfo[] | ErrorSearch> FindFields = function(searchParams) Il2cppMemory:SaveResults() for i = 1, #searchParams do ---@type number | string local searchParam = searchParams[i] local searchResult = Il2cppMemory:GetInformationOfField(searchParam) if not searchResult then searchResult = Il2cpp.FieldApi:Find(searchParam) Il2cppMemory:SetInformationOfField(searchParam, searchResult) end searchParams[i] = searchResult end Il2cppMemory:ClearSavedResults() return searchParams end, ---@param Address number ---@param length? number ---@return string Utf8ToString = function(Address, length) local chars, char = {}, { address = Address, flags = gg.TYPE_BYTE } if not length then repeat _char = string.char(gg.getValues({char})[1].value & 0xFF) chars[#chars + 1] = _char char.address = char.address + 0x1 until string.find(_char, "[%z%s]") return table.concat(chars, "", 1, #chars - 1) else for i = 1, length do local _char = gg.getValues({char})[1].value chars[i] = string.char(_char & 0xFF) char.address = char.address + 0x1 end return table.concat(chars) end end, ---@param bytes string ChangeBytesOrder = function(bytes) local newBytes, index, lenBytes = {}, 0, #bytes / 2 for byte in string.gmatch(bytes, "..") do newBytes[lenBytes - index] = byte index = index + 1 end return table.concat(newBytes) end, FixValue = function(val) return AndroidInfo.platform and val & 0x00FFFFFFFFFFFFFF or val & 0xFFFFFFFF end, GetValidAddress = function(Address) local lastByte = Address & 0x000000000000000F local delta = 0 local checkTable = {[12] = true, [4] = true, [8] = true, [0] = true} while not checkTable[lastByte - delta] do delta = delta + 1 end return Address - delta end, ---@param self Il2cpp ---@param address number | string SearchPointer = function(self, address) address = self.ChangeBytesOrder(type(address) == 'number' and string.format('%X', address) or address) gg.searchNumber('h ' .. address) gg.refineNumber('h ' .. address:sub(1, 6)) gg.refineNumber('h ' .. address:sub(1, 2)) local FindsResult = gg.getResults(gg.getResultsCount()) gg.clearResults() return FindsResult end, } ---@type Il2cpp Il2cpp = setmetatable({}, { ---@param self Il2cpp ---@param config? Il2cppConfig __call = function(self, config) config = config or {} getmetatable(self).__index = Il2cppBase if config.libilcpp then self.il2cppStart, self.il2cppEnd = config.libilcpp.start, config.libilcpp['end'] else self.il2cppStart, self.il2cppEnd = Searcher.FindIl2cpp() end if config.globalMetadata then self.globalMetadataStart, self.globalMetadataEnd = config.globalMetadata.start, config.globalMetadata['end'] else self.globalMetadataStart, self.globalMetadataEnd = Searcher:FindGlobalMetaData() end if config.globalMetadataHeader then self.globalMetadataHeader = config.globalMetadataHeader else self.globalMetadataHeader = self.globalMetadataStart end self.MetadataRegistrationApi.metadataRegistration = config.metadataRegistration VersionEngine:ChooseVersion(config.il2cppVersion, self.globalMetadataHeader) Il2cppMemory:ClearMemorize() end, __index = function(self, key) assert(key == "PatchesAddress", "You didn't call 'Il2cpp'") return Il2cppBase[key] end }) return Il2cpp end) __bundle_register("utils.malloc", function(require, _LOADED, __bundle_register, __bundle_modules) local MemoryManager = { availableMemory = 0, lastAddress = 0, NewAlloc = function(self) self.lastAddress = gg.allocatePage(gg.PROT_READ | gg.PROT_WRITE) self.availableMemory = 4096 end, } local M = { ---@param size number MAlloc = function(size) local manager = MemoryManager if size > manager.availableMemory then manager:NewAlloc() end local address = manager.lastAddress manager.availableMemory = manager.availableMemory - size manager.lastAddress = manager.lastAddress + size return address end, } return M end) __bundle_register("il2cppstruct.il2cppstring", function(require, _LOADED, __bundle_register, __bundle_modules) ---@class StringApi ---@field address number ---@field pointToStr number ---@field Fields table<string, number> ---@field ClassAddress number local StringApi = { ---@param self StringApi ---@param newStr string EditString = function(self, newStr) local _stringLength = gg.getValues{{address = self.address + self.Fields._stringLength, flags = gg.TYPE_DWORD}}[1].value _stringLength = _stringLength * 2 local bytes = gg.bytes(newStr, "UTF-16LE") if _stringLength == #bytes then local strStart = self.address + self.Fields._firstChar for i, v in ipairs(bytes) do bytes[i] = { address = strStart + (i - 1), flags = gg.TYPE_BYTE, value = v } end gg.setValues(bytes) elseif _stringLength > #bytes then local strStart = self.address + self.Fields._firstChar local _bytes = {} for i = 1, _stringLength do _bytes[#_bytes + 1] = { address = strStart + (i - 1), flags = gg.TYPE_BYTE, value = bytes[i] or 0 } end gg.setValues(_bytes) elseif _stringLength < #bytes then self.address = Il2cpp.MemoryManager.MAlloc(self.Fields._firstChar + #bytes + 8) local length = #bytes % 2 == 1 and #bytes + 1 or #bytes local _bytes = { { -- Head address = self.address, flags = Il2cpp.MainType, value = self.ClassAddress }, { -- _stringLength address = self.address + self.Fields._stringLength, flags = gg.TYPE_DWORD, value = length / 2 } } local strStart = self.address + self.Fields._firstChar for i = 1, length do _bytes[#_bytes + 1] = { address = strStart + (i - 1), flags = gg.TYPE_BYTE, value = bytes[i] or 0 } end _bytes[#_bytes + 1] = { address = self.pointToStr, flags = Il2cpp.MainType, value = self.address } gg.setValues(_bytes) end end, ---@param self StringApi ---@return string ReadString = function(self) local _stringLength = gg.getValues{{address = self.address + self.Fields._stringLength, flags = gg.TYPE_DWORD}}[1].value local bytes = {} if _stringLength > 0 and _stringLength < 200 then local strStart = self.address + self.Fields._firstChar for i = 0, _stringLength do bytes[#bytes + 1] = { address = strStart + (i << 1), flags = gg.TYPE_WORD } end bytes = gg.getValues(bytes) local code = {[[return "]]} for i, v in ipairs(bytes) do code[#code + 1] = string.format([[\u{%x}]], v.value & 0xFFFF) end code[#code + 1] = '"' local read, err = load(table.concat(code)) if read then return read() end end return "" end } ---@class MyString ---@field From fun(address : number) : StringApi | nil local String = { ---@param address number ---@return StringApi | nil From = function(address) local pointToStr = gg.getValues({{address = Il2cpp.FixValue(address), flags = Il2cpp.MainType}})[1] local str = setmetatable( { address = Il2cpp.FixValue(pointToStr.value), Fields = {}, pointToStr = Il2cpp.FixValue(address) }, {__index = StringApi}) local pointClassAddress = gg.getValues({{address = str.address, flags = Il2cpp.MainType}})[1].value local stringInfo = Il2cpp.FindClass({{Class = Il2cpp.FixValue(pointClassAddress), FieldsDump = true}})[1] for i, v in ipairs(stringInfo) do if v.ClassNameSpace == "System" then str.ClassAddress = tonumber(v.ClassAddress, 16) for indexField, FieldInfo in ipairs(v.Fields) do str.Fields[FieldInfo.FieldName] = tonumber(FieldInfo.Offset, 16) end return str end end return nil end, } return String end) __bundle_register("il2cppstruct.api.fieldinfo", function(require, _LOADED, __bundle_register, __bundle_modules) local Il2cppMemory = require("utils.il2cppmemory") ---@type FieldInfo local FieldInfoApi = { ---@param self FieldInfo ---@return nil | string | number GetConstValue = function(self) if self.IsConst then local fieldIndex = getmetatable(self).fieldIndex local defaultValue = Il2cppMemory:GetDefaultValue(fieldIndex) if not defaultValue then defaultValue = Il2cpp.GlobalMetadataApi:GetDefaultFieldValue(fieldIndex) Il2cppMemory:SetDefaultValue(fieldIndex, defaultValue) elseif defaultValue == "nil" then return nil end return defaultValue end return nil end } return FieldInfoApi end) __bundle_register("utils.il2cppmemory", function(require, _LOADED, __bundle_register, __bundle_modules) -- Memorizing Il2cpp Search Result ---@class Il2cppMemory ---@field Methods table<number | string, MethodMemory> ---@field Classes table<string | number, ClassMemory> ---@field Fields table<number | string, FieldInfo[] | ErrorSearch> ---@field Results table ---@field Types table<number, string> ---@field DefaultValues table<number, string | number> ---@field GetInformaionOfMethod fun(self : Il2cppMemory, searchParam : number | string) : MethodMemory | nil ---@field SetInformaionOfMethod fun(self : Il2cppMemory, searchParam : string | number, searchResult : MethodMemory) : void ---@field GetInformationOfClass fun(self : Il2cppMemory, searchParam : string | number) : ClassMemory | nil ---@field SetInformationOfClass fun(self : Il2cppMemory, searchParam : string | number, searchResult : ClassMemory) : void ---@field GetInformationOfField fun(self : Il2cppMemory, searchParam : number | string) : FieldInfo[] | nil | ErrorSearch ---@field SetInformationOfField fun(self : Il2cppMemory, searchParam : string | number, searchResult : FieldInfo[] | ErrorSearch) : void ---@field GetInformationOfType fun(self : Il2cppMemory, index : number) : string | nil ---@field SetInformationOfType fun(self : Il2cppMemory, index : number, typeName : string) ---@field SaveResults fun(self : Il2cppMemory) : void ---@field ClearSavedResults fun(self : Il2cppMemory) : void local Il2cppMemory = { Methods = {}, Classes = {}, Fields = {}, DefaultValues = {}, Results = {}, Types = {}, ---@param self Il2cppMemory ---@return nil | string GetInformationOfType = function(self, index) return self.Types[index] end, ---@param self Il2cppMemory SetInformationOfType = function(self, index, typeName) self.Types[index] = typeName end, ---@param self Il2cppMemory SaveResults = function(self) if gg.getResultsCount() > 0 then self.Results = gg.getResults(gg.getResultsCount()) end end, ---@param self Il2cppMemory ClearSavedResults = function(self) self.Results = {} end, ---@param self Il2cppMemory ---@param fieldIndex number ---@return string | number | nil GetDefaultValue = function(self, fieldIndex) return self.DefaultValues[fieldIndex] end, ---@param self Il2cppMemory ---@param fieldIndex number ---@param defaultValue number | string | nil SetDefaultValue = function(self, fieldIndex, defaultValue) self.DefaultValues[fieldIndex] = defaultValue or "nil" end, ---@param self Il2cppMemory ---@param searchParam number | string ---@return FieldInfo[] | nil | ErrorSearch GetInformationOfField = function(self, searchParam) return self.Fields[searchParam] end, ---@param self Il2cppMemory ---@param searchParam number | string ---@param searchResult FieldInfo[] | ErrorSearch SetInformationOfField = function(self, searchParam, searchResult) if not searchResult.Error then self.Fields[searchParam] = searchResult end end, GetInformaionOfMethod = function(self, searchParam) return self.Methods[searchParam] end, SetInformaionOfMethod = function(self, searchParam, searchResult) if not searchResult.Error then self.Methods[searchParam] = searchResult end end, GetInformationOfClass = function(self, searchParam) return self.Classes[searchParam] end, SetInformationOfClass = function(self, searchParam, searchResult) self.Classes[searchParam] = searchResult end, ---@param self Il2cppMemory ---@return void ClearMemorize = function(self) self.Methods = {} self.Classes = {} self.Fields = {} self.DefaultValues = {} self.Results = {} self.Types = {} end } return Il2cppMemory end) __bundle_register("il2cppstruct.api.classinfo", function(require, _LOADED, __bundle_register, __bundle_modules) local ClassInfoApi = { ---Get FieldInfo by Field Name. If Field isn't found by name, then function will return `nil` ---@param self ClassInfo ---@param name string ---@return FieldInfo | nil GetFieldWithName = function(self, name) local FieldsInfo = self.Fields if FieldsInfo then for fieldIndex = 1, #FieldsInfo do if FieldsInfo[fieldIndex].FieldName == name then return FieldsInfo[fieldIndex] end end else local ClassAddress = tonumber(self.ClassAddress, 16) local _ClassInfo = gg.getValues({ { -- Link as Fields address = ClassAddress + Il2cpp.ClassApi.FieldsLink, flags = Il2cpp.MainType }, { -- Fields Count address = ClassAddress + Il2cpp.ClassApi.CountFields, flags = gg.TYPE_WORD } }) self.Fields = Il2cpp.ClassApi:GetClassFields(Il2cpp.FixValue(_ClassInfo[1].value), _ClassInfo[2].value, { ClassName = self.ClassName, IsEnum = self.IsEnum, TypeMetadataHandle = self.TypeMetadataHandle }) return self:GetFieldWithName(name) end return nil end, ---Get MethodInfo[] by MethodName. If Method isn't found by name, then function will return `table with zero size` ---@param self ClassInfo ---@param name string ---@return MethodInfo[] GetMethodsWithName = function(self, name) local MethodsInfo, MethodsInfoResult = self.Methods, {} if MethodsInfo then for methodIndex = 1, #MethodsInfo do if MethodsInfo[methodIndex].MethodName == name then MethodsInfoResult[#MethodsInfoResult + 1] = MethodsInfo[methodIndex] end end return MethodsInfoResult else local ClassAddress = tonumber(self.ClassAddress, 16) local _ClassInfo = gg.getValues({ { -- Link as Methods address = ClassAddress + Il2cpp.ClassApi.MethodsLink, flags = Il2cpp.MainType }, { -- Methods Count address = ClassAddress + Il2cpp.ClassApi.CountMethods, flags = gg.TYPE_WORD } }) self.Methods = Il2cpp.ClassApi:GetClassMethods(Il2cpp.FixValue(_ClassInfo[1].value), _ClassInfo[2].value, self.ClassName) return self:GetMethodsWithName(name) end end, ---@param self ClassInfo ---@param fieldOffset number ---@return nil | FieldInfo GetFieldWithOffset = function(self, fieldOffset) if not self.Fields then local ClassAddress = tonumber(self.ClassAddress, 16) local _ClassInfo = gg.getValues({ { -- Link as Fields address = ClassAddress + Il2cpp.ClassApi.FieldsLink, flags = Il2cpp.MainType }, { -- Fields Count address = ClassAddress + Il2cpp.ClassApi.CountFields, flags = gg.TYPE_WORD } }) self.Fields = Il2cpp.ClassApi:GetClassFields(Il2cpp.FixValue(_ClassInfo[1].value), _ClassInfo[2].value, { ClassName = self.ClassName, IsEnum = self.IsEnum, TypeMetadataHandle = self.TypeMetadataHandle }) end if #self.Fields > 0 then local klass = self while klass ~= nil do if klass.Fields and klass.InstanceSize >= fieldOffset then local lastField for indexField, field in ipairs(klass.Fields) do if not (field.IsStatic or field.IsConst) then local offset = tonumber(field.Offset, 16) if offset > 0 then local maybeStruct = fieldOffset < offset if indexField == 1 and maybeStruct then break elseif offset == fieldOffset or indexField == #klass.Fields then return field elseif maybeStruct then return lastField else lastField = field end end end end end klass = klass.Parent ~= nil and Il2cpp.FindClass({ { Class = tonumber(klass.Parent.ClassAddress, 16), FieldsDump = true } })[1][1] or nil end end return nil end } return ClassInfoApi end) __bundle_register("il2cppstruct.object", function(require, _LOADED, __bundle_register, __bundle_modules) local AndroidInfo = require("utils.androidinfo") ---@class ObjectApi local ObjectApi = { ---@param self ObjectApi ---@param Objects table FilterObjects = function(self, Objects) local FilterObjects = {} for k, v in ipairs(gg.getValuesRange(Objects)) do if v == 'A' then FilterObjects[#FilterObjects + 1] = Objects[k] end end Objects = FilterObjects gg.loadResults(Objects) gg.searchPointer(0) if gg.getResultsCount() <= 0 and AndroidInfo.platform and AndroidInfo.sdk >= 30 then local FixRefToObjects = {} for k, v in ipairs(Objects) do gg.searchNumber(tostring(v.address | 0xB400000000000000), gg.TYPE_QWORD) ---@type tablelib local RefToObject = gg.getResults(gg.getResultsCount()) table.move(RefToObject, 1, #RefToObject, #FixRefToObjects + 1, FixRefToObjects) gg.clearResults() end gg.loadResults(FixRefToObjects) end local RefToObjects, FilterObjects = gg.getResults(gg.getResultsCount()), {} gg.clearResults() for k, v in ipairs(gg.getValuesRange(RefToObjects)) do if v == 'A' then FilterObjects[#FilterObjects + 1] = { address = Il2cpp.FixValue(RefToObjects[k].value), flags = RefToObjects[k].flags } end end gg.loadResults(FilterObjects) local _FilterObjects = gg.getResults(gg.getResultsCount()) gg.clearResults() return _FilterObjects end, ---@param self ObjectApi ---@param ClassAddress string FindObjects = function(self, ClassAddress) gg.clearResults() gg.setRanges(0) gg.setRanges(gg.REGION_C_HEAP | gg.REGION_C_HEAP | gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_DATA | gg.REGION_C_ALLOC) gg.loadResults({{ address = tonumber(ClassAddress, 16), flags = Il2cpp.MainType }}) gg.searchPointer(0) if gg.getResultsCount() <= 0 and AndroidInfo.platform and AndroidInfo.sdk >= 30 then gg.searchNumber(tostring(tonumber(ClassAddress, 16) | 0xB400000000000000), gg.TYPE_QWORD) end local FindsResult = gg.getResults(gg.getResultsCount()) gg.clearResults() return self:FilterObjects(FindsResult) end, ---@param self ObjectApi ---@param ClassesInfo ClassInfo[] Find = function(self, ClassesInfo) local Objects = {} for j = 1, #ClassesInfo do local FindResult = self:FindObjects(ClassesInfo[j].ClassAddress) table.move(FindResult, 1, #FindResult, #Objects + 1, Objects) end return Objects end, FindHead = function(Address) local validAddress = Il2cpp.GetValidAddress(Address) local mayBeHead = {} for i = 1, 1000 do mayBeHead[i] = { address = validAddress - (4 * (i - 1)), flags = Il2cpp.MainType } end mayBeHead = gg.getValues(mayBeHead) for i = 1, #mayBeHead do local mayBeClass = Il2cpp.FixValue(mayBeHead[i].value) if Il2cpp.ClassApi.IsClassInfo(mayBeClass) then return mayBeHead[i] end end return {value = 0, address = 0} end, } return ObjectApi end) __bundle_register("utils.androidinfo", function(require, _LOADED, __bundle_register, __bundle_modules) local AndroidInfo = { platform = gg.getTargetInfo().x64, sdk = gg.getTargetInfo().targetSdkVersion } return AndroidInfo end) __bundle_register("il2cppstruct.class", function(require, _LOADED, __bundle_register, __bundle_modules) local Protect = require("utils.protect") local StringUtils = require("utils.stringutils") local Il2cppMemory = require("utils.il2cppmemory") ---@class ClassApi ---@field NameOffset number ---@field MethodsStep number ---@field CountMethods number ---@field MethodsLink number ---@field FieldsLink number ---@field FieldsStep number ---@field CountFields number ---@field ParentOffset number ---@field NameSpaceOffset number ---@field StaticFieldDataOffset number ---@field EnumType number ---@field EnumRsh number ---@field TypeMetadataHandle number ---@field InstanceSize number ---@field Token number ---@field GetClassName fun(self : ClassApi, ClassAddress : number) : string ---@field GetClassMethods fun(self : ClassApi, MethodsLink : number, Count : number, ClassName : string | nil) : MethodInfo[] local ClassApi = { ---@param self ClassApi ---@param ClassAddress number GetClassName = function(self, ClassAddress) return Il2cpp.Utf8ToString(Il2cpp.FixValue(gg.getValues({{ address = Il2cpp.FixValue(ClassAddress) + self.NameOffset, flags = Il2cpp.MainType }})[1].value)) end, ---@param self ClassApi ---@param MethodsLink number ---@param Count number ---@param ClassName string | nil GetClassMethods = function(self, MethodsLink, Count, ClassName) local MethodsInfo, _MethodsInfo = {}, {} for i = 0, Count - 1 do _MethodsInfo[#_MethodsInfo + 1] = { address = MethodsLink + (i << self.MethodsStep), flags = Il2cpp.MainType } end _MethodsInfo = gg.getValues(_MethodsInfo) for i = 1, #_MethodsInfo do local MethodInfo MethodInfo, _MethodsInfo[i] = Il2cpp.MethodsApi:UnpackMethodInfo({ MethodInfoAddress = Il2cpp.FixValue(_MethodsInfo[i].value), ClassName = ClassName }) table.move(MethodInfo, 1, #MethodInfo, #MethodsInfo + 1, MethodsInfo) end MethodsInfo = gg.getValues(MethodsInfo) Il2cpp.MethodsApi:DecodeMethodsInfo(_MethodsInfo, MethodsInfo) return _MethodsInfo end, GetClassFields = function(self, FieldsLink, Count, ClassCharacteristic) local FieldsInfo, _FieldsInfo = {}, {} for i = 0, Count - 1 do _FieldsInfo[#_FieldsInfo + 1] = { address = FieldsLink + (i * self.FieldsStep), flags = Il2cpp.MainType } end _FieldsInfo = gg.getValues(_FieldsInfo) for i = 1, #_FieldsInfo do local FieldInfo FieldInfo = Il2cpp.FieldApi:UnpackFieldInfo(Il2cpp.FixValue(_FieldsInfo[i].address)) table.move(FieldInfo, 1, #FieldInfo, #FieldsInfo + 1, FieldsInfo) end FieldsInfo = gg.getValues(FieldsInfo) _FieldsInfo = Il2cpp.FieldApi:DecodeFieldsInfo(FieldsInfo, ClassCharacteristic) return _FieldsInfo end, ---@param self ClassApi ---@param ClassInfo ClassInfoRaw ---@param Config table ---@return ClassInfo UnpackClassInfo = function(self, ClassInfo, Config) local _ClassInfo = gg.getValues({ { -- Class Name [1] address = ClassInfo.ClassInfoAddress + self.NameOffset, flags = Il2cpp.MainType }, { -- Methods Count [2] address = ClassInfo.ClassInfoAddress + self.CountMethods, flags = gg.TYPE_WORD }, { -- Fields Count [3] address = ClassInfo.ClassInfoAddress + self.CountFields, flags = gg.TYPE_WORD }, { -- Link as Methods [4] address = ClassInfo.ClassInfoAddress + self.MethodsLink, flags = Il2cpp.MainType }, { -- Link as Fields [5] address = ClassInfo.ClassInfoAddress + self.FieldsLink, flags = Il2cpp.MainType }, { -- Link as Parent Class [6] address = ClassInfo.ClassInfoAddress + self.ParentOffset, flags = Il2cpp.MainType }, { -- Class NameSpace [7] address = ClassInfo.ClassInfoAddress + self.NameSpaceOffset, flags = Il2cpp.MainType }, { -- Class Static Field Data [8] address = ClassInfo.ClassInfoAddress + self.StaticFieldDataOffset, flags = Il2cpp.MainType }, { -- EnumType [9] address = ClassInfo.ClassInfoAddress + self.EnumType, flags = gg.TYPE_BYTE }, { -- TypeMetadataHandle [10] address = ClassInfo.ClassInfoAddress + self.TypeMetadataHandle, flags = Il2cpp.MainType }, { -- InstanceSize [11] address = ClassInfo.ClassInfoAddress + self.InstanceSize, flags = gg.TYPE_DWORD }, { -- Token [12] address = ClassInfo.ClassInfoAddress + self.Token, flags = gg.TYPE_DWORD } }) local ClassName = ClassInfo.ClassName or Il2cpp.Utf8ToString(Il2cpp.FixValue(_ClassInfo[1].value)) local ClassCharacteristic = { ClassName = ClassName, IsEnum = ((_ClassInfo[9].value >> self.EnumRsh) & 1) == 1, TypeMetadataHandle = Il2cpp.FixValue(_ClassInfo[10].value) } return setmetatable({ ClassName = ClassName, ClassAddress = string.format('%X', Il2cpp.FixValue(ClassInfo.ClassInfoAddress)), Methods = (_ClassInfo[2].value > 0 and Config.MethodsDump) and self:GetClassMethods(Il2cpp.FixValue(_ClassInfo[4].value), _ClassInfo[2].value, ClassName) or nil, Fields = (_ClassInfo[3].value > 0 and Config.FieldsDump) and self:GetClassFields(Il2cpp.FixValue(_ClassInfo[5].value), _ClassInfo[3].value, ClassCharacteristic) or nil, Parent = _ClassInfo[6].value ~= 0 and { ClassAddress = string.format('%X', Il2cpp.FixValue(_ClassInfo[6].value)), ClassName = self:GetClassName(_ClassInfo[6].value) } or nil, ClassNameSpace = Il2cpp.Utf8ToString(Il2cpp.FixValue(_ClassInfo[7].value)), StaticFieldData = _ClassInfo[8].value ~= 0 and Il2cpp.FixValue(_ClassInfo[8].value) or nil, IsEnum = ClassCharacteristic.IsEnum, TypeMetadataHandle = ClassCharacteristic.TypeMetadataHandle, InstanceSize = _ClassInfo[11].value, Token = string.format("0x%X", _ClassInfo[12].value), ImageName = ClassInfo.ImageName }, { __index = Il2cpp.ClassInfoApi, __tostring = StringUtils.ClassInfoToDumpCS }) end, --- Defines not quite accurately, especially in the 29th version of the backend ---@param Address number IsClassInfo = function(Address) local imageAddress = Il2cpp.FixValue(gg.getValues( { { address = Il2cpp.FixValue(Address), flags = Il2cpp.MainType } } )[1].value) local imageStr = Il2cpp.Utf8ToString(Il2cpp.FixValue(gg.getValues( { { address = imageAddress, flags = Il2cpp.MainType } } )[1].value)) local check = string.find(imageStr, ".-%.dll") or string.find(imageStr, "__Generated") return check and imageStr or nil end, ---@param self ClassApi ---@param ClassName string ---@param searchResult ClassMemory FindClassWithName = function(self, ClassName, searchResult) local ClassNamePoint = Il2cpp.GlobalMetadataApi.GetPointersToString(ClassName) local ResultTable = {} if #ClassNamePoint > searchResult.len then for classPointIndex, classPoint in ipairs(ClassNamePoint) do local classAddress = classPoint.address - self.NameOffset local imageName = self.IsClassInfo(classAddress) if (imageName) then ResultTable[#ResultTable + 1] = { ClassInfoAddress = Il2cpp.FixValue(classAddress), ClassName = ClassName, ImageName = imageName } end end searchResult.len = #ClassNamePoint else searchResult.isNew = false end assert(#ResultTable > 0, string.format("The '%s' class is not initialized", ClassName)) return ResultTable end, ---@param self ClassApi ---@param ClassAddress number ---@param searchResult ClassMemory ---@return ClassInfoRaw[] FindClassWithAddressInMemory = function(self, ClassAddress, searchResult) local ResultTable = {} if searchResult.len < 1 then local imageName = self.IsClassInfo(ClassAddress) if imageName then ResultTable[#ResultTable + 1] = { ClassInfoAddress = ClassAddress, ImageName = imageName } end searchResult.len = 1 else searchResult.isNew = false end assert(#ResultTable > 0, string.format("nothing was found for this address 0x%X", ClassAddress)) return ResultTable end, FindParamsCheck = { ---@param self ClassApi ---@param _class number @Class Address In Memory ---@param searchResult ClassMemory ['number'] = function(self, _class, searchResult) return Protect:Call(self.FindClassWithAddressInMemory, self, _class, searchResult) end, ---@param self ClassApi ---@param _class string @Class Name ---@param searchResult ClassMemory ['string'] = function(self, _class, searchResult) return Protect:Call(self.FindClassWithName, self, _class, searchResult) end, ['default'] = function() return { Error = 'Invalid search criteria' } end }, ---@param self ClassApi ---@param class ClassConfig ---@return ClassInfo[] | ErrorSearch Find = function(self, class) local searchResult = Il2cppMemory:GetInformationOfClass(class.Class) if (not searchResult) or ((class.FieldsDump or class.MethodsDump) and (searchResult.config.FieldsDump ~= class.FieldsDump or searchResult.config.MethodsDump ~= class.MethodsDump)) then searchResult = {len = 0} end searchResult.isNew = true ---@type ClassInfoRaw[] | ErrorSearch local ClassInfo = (self.FindParamsCheck[type(class.Class)] or self.FindParamsCheck['default'])(self, class.Class, searchResult) if searchResult.isNew then for k = 1, #ClassInfo do ClassInfo[k] = self:UnpackClassInfo(ClassInfo[k], { FieldsDump = class.FieldsDump, MethodsDump = class.MethodsDump }) end searchResult.config = { Class = class.Class, FieldsDump = class.FieldsDump, MethodsDump = class.MethodsDump } searchResult.result = ClassInfo Il2cppMemory:SetInformationOfClass(class.Class, searchResult) else ClassInfo = searchResult.result end return ClassInfo end } return ClassApi end) __bundle_register("utils.stringutils", function(require, _LOADED, __bundle_register, __bundle_modules) ---@class StringUtils local StringUtils = { ---@param classInfo ClassInfo ClassInfoToDumpCS = function(classInfo) local dumpClass = { "// ", classInfo.ImageName, "\n", "// Namespace: ", classInfo.ClassNameSpace, "\n"; "class ", classInfo.ClassName, classInfo.Parent and " : " .. classInfo.Parent.ClassName or "", "\n", "{\n" } if classInfo.Fields and #classInfo.Fields > 0 then dumpClass[#dumpClass + 1] = "\n\t// Fields\n" for i, v in ipairs(classInfo.Fields) do local dumpField = { "\t", v.Access, " ", v.IsStatic and "static " or "", v.IsConst and "const " or "", v.Type, " ", v.FieldName, "; // 0x", v.Offset, "\n" } table.move(dumpField, 1, #dumpField, #dumpClass + 1, dumpClass) end end if classInfo.Methods and #classInfo.Methods > 0 then dumpClass[#dumpClass + 1] = "\n\t// Methods\n" for i, v in ipairs(classInfo.Methods) do local dumpMethod = { i == 1 and "" or "\n", "\t// Offset: 0x", v.Offset, " VA: 0x", v.AddressInMemory, " ParamCount: ", v.ParamCount, "\n", "\t", v.Access, " ", v.IsStatic and "static " or "", v.IsAbstract and "abstract " or "", v.ReturnType, " ", v.MethodName, "() { } \n" } table.move(dumpMethod, 1, #dumpMethod, #dumpClass + 1, dumpClass) end end table.insert(dumpClass, "\n}\n") return table.concat(dumpClass) end } return StringUtils end) __bundle_register("utils.protect", function(require, _LOADED, __bundle_register, __bundle_modules) local Protect = { ErrorHandler = function(err) return {Error = err} end, Call = function(self, fun, ...) return ({xpcall(fun, self.ErrorHandler, ...)})[2] end } return Protect end) __bundle_register("il2cppstruct.field", function(require, _LOADED, __bundle_register, __bundle_modules) local Protect = require("utils.protect") ---@class FieldApi ---@field Offset number ---@field Type number ---@field ClassOffset number ---@field Find fun(self : FieldApi, fieldSearchCondition : string | number) : FieldInfo[] | ErrorSearch local FieldApi = { ---@param self FieldApi ---@param FieldInfoAddress number UnpackFieldInfo = function(self, FieldInfoAddress) return { { -- Field Name address = FieldInfoAddress, flags = Il2cpp.MainType }, { -- Offset Field address = FieldInfoAddress + self.Offset, flags = gg.TYPE_WORD }, { -- Field type address = FieldInfoAddress + self.Type, flags = Il2cpp.MainType }, { -- Class address address = FieldInfoAddress + self.ClassOffset, flags = Il2cpp.MainType } } end, ---@param self FieldApi DecodeFieldsInfo = function(self, FieldsInfo, ClassCharacteristic) local index, _FieldsInfo = 0, {} local fieldStart = gg.getValues({{ address = ClassCharacteristic.TypeMetadataHandle + Il2cpp.Il2CppTypeDefinitionApi.fieldStart, flags = gg.TYPE_DWORD }})[1].value for i = 1, #FieldsInfo, 4 do index = index + 1 local TypeInfo = Il2cpp.FixValue(FieldsInfo[i + 2].value) local _TypeInfo = gg.getValues({ { -- attrs address = TypeInfo + self.Type, flags = gg.TYPE_WORD }, { -- type index | type address = TypeInfo + Il2cpp.TypeApi.Type, flags = gg.TYPE_BYTE }, { -- index | data address = TypeInfo, flags = Il2cpp.MainType } }) local attrs = _TypeInfo[1].value local IsConst = (attrs & Il2CppFlags.Field.FIELD_ATTRIBUTE_LITERAL) ~= 0 _FieldsInfo[index] = setmetatable({ ClassName = ClassCharacteristic.ClassName or Il2cpp.ClassApi:GetClassName(FieldsInfo[i + 3].value), ClassAddress = string.format('%X', Il2cpp.FixValue(FieldsInfo[i + 3].value)), FieldName = Il2cpp.Utf8ToString(Il2cpp.FixValue(FieldsInfo[i].value)), Offset = string.format('%X', FieldsInfo[i + 1].value), IsStatic = (not IsConst) and ((attrs & Il2CppFlags.Field.FIELD_ATTRIBUTE_STATIC) ~= 0), Type = Il2cpp.TypeApi:GetTypeName(_TypeInfo[2].value, _TypeInfo[3].value), IsConst = IsConst, Access = Il2CppFlags.Field.Access[attrs & Il2CppFlags.Field.FIELD_ATTRIBUTE_FIELD_ACCESS_MASK] or "", }, { __index = Il2cpp.FieldInfoApi, fieldIndex = fieldStart + index - 1 }) end return _FieldsInfo end, ---@param self FieldApi ---@param fieldName string ---@return FieldInfo[] FindFieldWithName = function(self, fieldName) local fieldNamePoint = Il2cpp.GlobalMetadataApi.GetPointersToString(fieldName) local ResultTable = {} for k, v in ipairs(fieldNamePoint) do local classAddress = gg.getValues({{ address = v.address + self.ClassOffset, flags = Il2cpp.MainType }})[1].value if Il2cpp.ClassApi.IsClassInfo(classAddress) then local result = self.FindFieldInClass(fieldName, classAddress) table.move(result, 1, #result, #ResultTable + 1, ResultTable) end end assert(type(ResultTable) == "table" and #ResultTable > 0, string.format("The '%s' field is not initialized", fieldName)) return ResultTable end, ---@param self FieldApi FindFieldWithAddress = function(self, fieldAddress) local ObjectHead = Il2cpp.ObjectApi.FindHead(fieldAddress) local fieldOffset = fieldAddress - ObjectHead.address local classAddress = Il2cpp.FixValue(ObjectHead.value) local ResultTable = self.FindFieldInClass(fieldOffset, classAddress) assert(#ResultTable > 0, string.format("nothing was found for this address 0x%X", fieldAddress)) return ResultTable end, FindFieldInClass = function(fieldSearchCondition, classAddress) local ResultTable = {} local Il2cppClass = Il2cpp.FindClass({ { Class = classAddress, FieldsDump = true } })[1] for i, v in ipairs(Il2cppClass) do ResultTable[#ResultTable + 1] = type(fieldSearchCondition) == "number" and v:GetFieldWithOffset(fieldSearchCondition) or v:GetFieldWithName(fieldSearchCondition) end return ResultTable end, FindTypeCheck = { ---@param self FieldApi ---@param fieldName string ['string'] = function(self, fieldName) return Protect:Call(self.FindFieldWithName, self, fieldName) end, ---@param self FieldApi ---@param fieldAddress number ['number'] = function(self, fieldAddress) return Protect:Call(self.FindFieldWithAddress, self, fieldAddress) end, ['default'] = function() return { Error = 'Invalid search criteria' } end }, ---@param self FieldApi ---@param fieldSearchCondition number | string ---@return FieldInfo[] | ErrorSearch Find = function(self, fieldSearchCondition) local FieldsInfo = (self.FindTypeCheck[type(fieldSearchCondition)] or self.FindTypeCheck['default'])(self, fieldSearchCondition) return FieldsInfo end } return FieldApi end) __bundle_register("il2cppstruct.globalmetadata", function(require, _LOADED, __bundle_register, __bundle_modules) ---@class GlobalMetadataApi ---@field typeDefinitionsSize number ---@field typeDefinitionsOffset number ---@field stringOffset number ---@field fieldDefaultValuesOffset number ---@field fieldDefaultValuesSize number ---@field fieldAndParameterDefaultValueDataOffset number ---@field version number local GlobalMetadataApi = { ---@type table<number, fun(blob : number) : string | number> behaviorForTypes = { [2] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_BYTE) end, [3] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_BYTE) end, [4] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_BYTE) end, [5] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_BYTE) end, [6] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_WORD) end, [7] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_WORD) end, [8] = function(blob) local self = Il2cpp.GlobalMetadataApi return self.version < 29 and self.ReadNumberConst(blob, gg.TYPE_DWORD) or self.ReadCompressedInt32(blob) end, [9] = function(blob) local self = Il2cpp.GlobalMetadataApi return self.version < 29 and Il2cpp.FixValue(self.ReadNumberConst(blob, gg.TYPE_DWORD)) or self.ReadCompressedUInt32(blob) end, [10] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_QWORD) end, [11] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_QWORD) end, [12] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_FLOAT) end, [13] = function(blob) return Il2cpp.GlobalMetadataApi.ReadNumberConst(blob, gg.TYPE_DOUBLE) end, [14] = function(blob) local self = Il2cpp.GlobalMetadataApi local length, offset = 0, 0 if self.version >= 29 then length, offset = self.ReadCompressedInt32(blob) else length = self.ReadNumberConst(blob, gg.TYPE_DWORD) offset = 4 end if length ~= -1 then return Il2cpp.Utf8ToString(blob + offset, length) end return "" end }, ---@param self GlobalMetadataApi ---@param index number GetStringFromIndex = function(self, index) local stringDefinitions = Il2cpp.globalMetadataStart + self.stringOffset return Il2cpp.Utf8ToString(stringDefinitions + index) end, ---@param self GlobalMetadataApi GetClassNameFromIndex = function(self, index) if (self.version < 27) then local typeDefinitions = Il2cpp.globalMetadataStart + self.typeDefinitionsOffset index = (self.typeDefinitionsSize * index) + typeDefinitions else index = Il2cpp.FixValue(index) end local typeDefinition = gg.getValues({{ address = index, flags = gg.TYPE_DWORD }})[1].value return self:GetStringFromIndex(typeDefinition) end, ---@param self GlobalMetadataApi ---@param dataIndex number GetFieldOrParameterDefalutValue = function(self, dataIndex) return self.fieldAndParameterDefaultValueDataOffset + Il2cpp.globalMetadataStart + dataIndex end, ---@param self GlobalMetadataApi ---@param index string GetIl2CppFieldDefaultValue = function(self, index) gg.clearResults() gg.setRanges(0) gg.setRanges(gg.REGION_C_HEAP | gg.REGION_C_HEAP | gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_DATA | gg.REGION_OTHER | gg.REGION_C_ALLOC) gg.searchNumber(index, gg.TYPE_DWORD, false, gg.SIGN_EQUAL, Il2cpp.globalMetadataStart + self.fieldDefaultValuesOffset, Il2cpp.globalMetadataStart + self.fieldDefaultValuesOffset + self.fieldDefaultValuesSize) if gg.getResultsCount() > 0 then local Il2CppFieldDefaultValue = gg.getResults(1) gg.clearResults() return Il2CppFieldDefaultValue end return {} end, ---@param Address number ReadCompressedUInt32 = function(Address) local val, offset = 0, 0 local read = gg.getValues({ { -- [1] address = Address, flags = gg.TYPE_BYTE }, { -- [2] address = Address + 1, flags = gg.TYPE_BYTE }, { -- [3] address = Address + 2, flags = gg.TYPE_BYTE }, { -- [4] address = Address + 3, flags = gg.TYPE_BYTE } }) local read1 = read[1].value & 0xFF offset = 1 if (read1 & 0x80) == 0 then val = read1 elseif (read1 & 0xC0) == 0x80 then val = (read1 & ~0x80) << 8 val = val | (read[2].value & 0xFF) offset = offset + 1 elseif (read1 & 0xE0) == 0xC0 then val = (read1 & ~0xC0) << 24 val = val | ((read[2].value & 0xFF) << 16) val = val | ((read[3].value & 0xFF) << 8) val = val | (read[4].value & 0xFF) offset = offset + 3 elseif read1 == 0xF0 then val = gg.getValues({{address = Address + 1, flags = gg.TYPE_DWORD}})[1].value offset = offset + 4 elseif read1 == 0xFE then val = 0xffffffff - 1 elseif read1 == 0xFF then val = 0xffffffff end return val, offset end, ---@param Address number ReadCompressedInt32 = function(Address) local encoded, offset = Il2cpp.GlobalMetadataApi.ReadCompressedUInt32(Address) if encoded == 0xffffffff then return -2147483647 - 1 end local isNegative = (encoded & 1) == 1 encoded = encoded >> 1 if isNegative then return -(encoded + 1) end return encoded, offset end, ---@param Address number ---@param ggType number @gg.TYPE_ ReadNumberConst = function(Address, ggType) return gg.getValues({{ address = Address, flags = ggType }})[1].value end, ---@param self GlobalMetadataApi ---@param index number ---@return number | string | nil GetDefaultFieldValue = function(self, index) local Il2CppFieldDefaultValue = self:GetIl2CppFieldDefaultValue(tostring(index)) if #Il2CppFieldDefaultValue > 0 then local _Il2CppFieldDefaultValue = gg.getValues({ { -- TypeIndex [1] address = Il2CppFieldDefaultValue[1].address + 4, flags = gg.TYPE_DWORD, }, { -- dataIndex [2] address = Il2CppFieldDefaultValue[1].address + 8, flags = gg.TYPE_DWORD } }) local blob = self:GetFieldOrParameterDefalutValue(_Il2CppFieldDefaultValue[2].value) local Il2CppType = Il2cpp.MetadataRegistrationApi:GetIl2CppTypeFromIndex(_Il2CppFieldDefaultValue[1].value) local typeEnum = Il2cpp.TypeApi:GetTypeEnum(Il2CppType) ---@type string | fun(blob : number) : string | number local behavior = self.behaviorForTypes[typeEnum] or "Not support type" if type(behavior) == "function" then return behavior(blob) end return behavior end return nil end, ---@param name string GetPointersToString = function(name) local pointers = {} gg.clearResults() gg.setRanges(0) gg.setRanges(gg.REGION_C_HEAP | gg.REGION_C_HEAP | gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_DATA | gg.REGION_OTHER | gg.REGION_C_ALLOC) gg.searchNumber(string.format("Q 00 '%s' 00", name), gg.TYPE_BYTE, false, gg.SIGN_EQUAL, Il2cpp.globalMetadataStart, Il2cpp.globalMetadataEnd) gg.searchPointer(0) pointers = gg.getResults(gg.getResultsCount()) assert(type(pointers) == 'table' and #pointers > 0, string.format("this '%s' is not in the global-metadata", name)) gg.clearResults() return pointers end } return GlobalMetadataApi end) __bundle_register("il2cppstruct.method", function(require, _LOADED, __bundle_register, __bundle_modules) local AndroidInfo = require("utils.androidinfo") local Protect = require("utils.protect") local Il2cppMemory = require("utils.il2cppmemory") ---@class MethodsApi ---@field ClassOffset number ---@field NameOffset number ---@field ParamCount number ---@field ReturnType number ---@field Flags number local MethodsApi = { ---@param self MethodsApi ---@param MethodName string ---@param searchResult MethodMemory ---@return MethodInfoRaw[] FindMethodWithName = function(self, MethodName, searchResult) local FinalMethods = {} local MethodNamePointers = Il2cpp.GlobalMetadataApi.GetPointersToString(MethodName) if searchResult.len < #MethodNamePointers then for methodPointIndex, methodPoint in ipairs(MethodNamePointers) do methodPoint.address = methodPoint.address - self.NameOffset local MethodAddress = Il2cpp.FixValue(gg.getValues({methodPoint})[1].value) if MethodAddress > Il2cpp.il2cppStart and MethodAddress < Il2cpp.il2cppEnd then FinalMethods[#FinalMethods + 1] = { MethodName = MethodName, MethodAddress = MethodAddress, MethodInfoAddress = methodPoint.address } end end else searchResult.isNew = false end assert(#FinalMethods > 0, string.format("The '%s' method is not initialized", MethodName)) return FinalMethods end, ---@param self MethodsApi ---@param MethodOffset number ---@param searchResult MethodMemory | nil ---@return MethodInfoRaw[] FindMethodWithOffset = function(self, MethodOffset, searchResult) local MethodsInfo = self:FindMethodWithAddressInMemory(Il2cpp.il2cppStart + MethodOffset, searchResult, MethodOffset) return MethodsInfo end, ---@param self MethodsApi ---@param MethodAddress number ---@param searchResult MethodMemory ---@param MethodOffset number | nil ---@return MethodInfoRaw[] FindMethodWithAddressInMemory = function(self, MethodAddress, searchResult, MethodOffset) local RawMethodsInfo = {} -- the same as MethodsInfo gg.clearResults() gg.setRanges(gg.REGION_C_HEAP | gg.REGION_C_ALLOC | gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_DATA | gg.REGION_OTHER) if gg.BUILD < 16126 then gg.searchNumber(string.format("%Xh", MethodAddress), Il2cpp.MainType) else gg.loadResults({{ address = MethodAddress, flags = Il2cpp.MainType }}) gg.searchPointer(0) end local r_count = gg.getResultsCount() if r_count > searchResult.len then local r = gg.getResults(r_count) for j = 1, #r do RawMethodsInfo[#RawMethodsInfo + 1] = { MethodAddress = MethodAddress, MethodInfoAddress = r[j].address, Offset = MethodOffset } end else searchResult.isNew = false end gg.clearResults() assert(#RawMethodsInfo > 0, string.format("nothing was found for this address 0x%X", MethodAddress)) return RawMethodsInfo end, ---@param self MethodsApi ---@param _MethodsInfo MethodInfo[] DecodeMethodsInfo = function(self, _MethodsInfo, MethodsInfo) for i = 1, #_MethodsInfo do local index = (i - 1) * 6 local TypeInfo = Il2cpp.FixValue(MethodsInfo[index + 5].value) local _TypeInfo = gg.getValues({{ -- type index address = TypeInfo + Il2cpp.TypeApi.Type, flags = gg.TYPE_BYTE }, { -- index address = TypeInfo, flags = Il2cpp.MainType }}) local MethodAddress = Il2cpp.FixValue(MethodsInfo[index + 1].value) local MethodFlags = MethodsInfo[index + 6].value _MethodsInfo[i] = { MethodName = _MethodsInfo[i].MethodName or Il2cpp.Utf8ToString(Il2cpp.FixValue(MethodsInfo[index + 2].value)), Offset = string.format("%X", _MethodsInfo[i].Offset or (MethodAddress == 0 and MethodAddress or MethodAddress - Il2cpp.il2cppStart)), AddressInMemory = string.format("%X", MethodAddress), MethodInfoAddress = _MethodsInfo[i].MethodInfoAddress, ClassName = _MethodsInfo[i].ClassName or Il2cpp.ClassApi:GetClassName(MethodsInfo[index + 3].value), ClassAddress = string.format('%X', Il2cpp.FixValue(MethodsInfo[index + 3].value)), ParamCount = MethodsInfo[index + 4].value, ReturnType = Il2cpp.TypeApi:GetTypeName(_TypeInfo[1].value, _TypeInfo[2].value), IsStatic = (MethodFlags & Il2CppFlags.Method.METHOD_ATTRIBUTE_STATIC) ~= 0, Access = Il2CppFlags.Method.Access[MethodFlags & Il2CppFlags.Method.METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK] or "", IsAbstract = (MethodFlags & Il2CppFlags.Method.METHOD_ATTRIBUTE_ABSTRACT) ~= 0, } end end, ---@param self MethodsApi ---@param MethodInfo MethodInfoRaw UnpackMethodInfo = function(self, MethodInfo) return { { -- [1] Address Method in Memory address = MethodInfo.MethodInfoAddress, flags = Il2cpp.MainType }, { -- [2] Name Address address = MethodInfo.MethodInfoAddress + self.NameOffset, flags = Il2cpp.MainType }, { -- [3] Class address address = MethodInfo.MethodInfoAddress + self.ClassOffset, flags = Il2cpp.MainType }, { -- [4] Param Count address = MethodInfo.MethodInfoAddress + self.ParamCount, flags = gg.TYPE_BYTE }, { -- [5] Return Type address = MethodInfo.MethodInfoAddress + self.ReturnType, flags = Il2cpp.MainType }, { -- [6] Flags address = MethodInfo.MethodInfoAddress + self.Flags, flags = gg.TYPE_WORD } }, { MethodName = MethodInfo.MethodName or nil, Offset = MethodInfo.Offset or nil, MethodInfoAddress = MethodInfo.MethodInfoAddress, ClassName = MethodInfo.ClassName } end, FindParamsCheck = { ---@param self MethodsApi ---@param method number ---@param searchResult MethodMemory ['number'] = function(self, method, searchResult) if (method > Il2cpp.il2cppStart and method < Il2cpp.il2cppEnd) then return Protect:Call(self.FindMethodWithAddressInMemory, self, method, searchResult) else return Protect:Call(self.FindMethodWithOffset, self, method, searchResult) end end, ---@param self MethodsApi ---@param method string ---@param searchResult MethodMemory ['string'] = function(self, method, searchResult) return Protect:Call(self.FindMethodWithName, self, method, searchResult) end, ['default'] = function() return { Error = 'Invalid search criteria' } end }, ---@param self MethodsApi ---@param method number | string ---@return MethodInfo[] | ErrorSearch Find = function(self, method) local searchResult = Il2cppMemory:GetInformaionOfMethod(method) if not searchResult then searchResult = {len = 0} end searchResult.isNew = true ---@type MethodInfoRaw[] | ErrorSearch local _MethodsInfo = (self.FindParamsCheck[type(method)] or self.FindParamsCheck['default'])(self, method, searchResult) if searchResult.isNew then local MethodsInfo = {} for i = 1, #_MethodsInfo do local MethodInfo MethodInfo, _MethodsInfo[i] = self:UnpackMethodInfo(_MethodsInfo[i]) table.move(MethodInfo, 1, #MethodInfo, #MethodsInfo + 1, MethodsInfo) end MethodsInfo = gg.getValues(MethodsInfo) self:DecodeMethodsInfo(_MethodsInfo, MethodsInfo) -- save result searchResult.len = #_MethodsInfo searchResult.result = _MethodsInfo Il2cppMemory:SetInformaionOfMethod(method, searchResult) else _MethodsInfo = searchResult.result end return _MethodsInfo end } return MethodsApi end) __bundle_register("il2cppstruct.type", function(require, _LOADED, __bundle_register, __bundle_modules) local Il2cppMemory = require("utils.il2cppmemory") ---@class TypeApi ---@field Type number ---@field tableTypes table local TypeApi = { tableTypes = { [1] = "void", [2] = "bool", [3] = "char", [4] = "sbyte", [5] = "byte", [6] = "short", [7] = "ushort", [8] = "int", [9] = "uint", [10] = "long", [11] = "ulong", [12] = "float", [13] = "double", [14] = "string", [22] = "TypedReference", [24] = "IntPtr", [25] = "UIntPtr", [28] = "object", [17] = function(index) return Il2cpp.GlobalMetadataApi:GetClassNameFromIndex(index) end, [18] = function(index) return Il2cpp.GlobalMetadataApi:GetClassNameFromIndex(index) end, [29] = function(index) local typeMassiv = gg.getValues({ { address = Il2cpp.FixValue(index), flags = Il2cpp.MainType }, { address = Il2cpp.FixValue(index) + Il2cpp.TypeApi.Type, flags = gg.TYPE_BYTE } }) return Il2cpp.TypeApi:GetTypeName(typeMassiv[2].value, typeMassiv[1].value) .. "[]" end, [21] = function(index) if not (Il2cpp.GlobalMetadataApi.version < 27) then index = gg.getValues({{ address = Il2cpp.FixValue(index), flags = Il2cpp.MainType }})[1].value end index = gg.getValues({{ address = Il2cpp.FixValue(index), flags = Il2cpp.MainType }})[1].value return Il2cpp.GlobalMetadataApi:GetClassNameFromIndex(index) end }, ---@param self TypeApi ---@param typeIndex number @number for tableTypes ---@param index number @for an api that is higher than 24, this can be a reference to the index ---@return string GetTypeName = function(self, typeIndex, index) ---@type string | fun(index : number) : string local typeName = self.tableTypes[typeIndex] or string.format('(not support type -> 0x%X)', typeIndex) if (type(typeName) == 'function') then local resultType = Il2cppMemory:GetInformationOfType(index) if not resultType then resultType = typeName(index) Il2cppMemory:SetInformationOfType(index, resultType) end typeName = resultType end return typeName end, ---@param self TypeApi ---@param Il2CppType number GetTypeEnum = function(self, Il2CppType) return gg.getValues({{address = Il2CppType + self.Type, flags = gg.TYPE_BYTE}})[1].value end } return TypeApi end) __bundle_register("il2cppstruct.metadataRegistration", function(require, _LOADED, __bundle_register, __bundle_modules) local Searcher = require("utils.universalsearcher") ---@class MetadataRegistrationApi ---@field metadataRegistration number ---@field types number local MetadataRegistrationApi = { ---@param self MetadataRegistrationApi ---@return number GetIl2CppTypeFromIndex = function(self, index) if not self.metadataRegistration then self:FindMetadataRegistration() end local types = gg.getValues({{address = self.metadataRegistration + self.types, flags = Il2cpp.MainType}})[1].value return Il2cpp.FixValue(gg.getValues({{address = types + (Il2cpp.pointSize * index), flags = Il2cpp.MainType}})[1].value) end, ---@param self MetadataRegistrationApi ---@return void FindMetadataRegistration = function(self) self.metadataRegistration = Searcher.Il2CppMetadataRegistration() end } return MetadataRegistrationApi end) __bundle_register("utils.universalsearcher", function(require, _LOADED, __bundle_register, __bundle_modules) local AndroidInfo = require("utils.androidinfo") ---@class Searcher local Searcher = { searchWord = ":EnsureCapacity", ---@param self Searcher FindGlobalMetaData = function(self) gg.clearResults() gg.setRanges(gg.REGION_C_HEAP | gg.REGION_C_ALLOC | gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_DATA | gg.REGION_OTHER) local globalMetadata = gg.getRangesList('global-metadata.dat') if not self:IsValidData(globalMetadata) then globalMetadata = {} gg.clearResults() gg.searchNumber(self.searchWord, gg.TYPE_BYTE) gg.refineNumber(self.searchWord:sub(1, 2), gg.TYPE_BYTE) local EnsureCapacity = gg.getResults(gg.getResultsCount()) gg.clearResults() for k, v in ipairs(gg.getRangesList()) do if (v.state == 'Ca' or v.state == 'A' or v.state == 'Cd' or v.state == 'Cb' or v.state == 'Ch' or v.state == 'O') then for key, val in ipairs(EnsureCapacity) do globalMetadata[#globalMetadata + 1] = (Il2cpp.FixValue(v.start) <= Il2cpp.FixValue(val.address) and Il2cpp.FixValue(val.address) < Il2cpp.FixValue(v['end'])) and v or nil end end end end return globalMetadata[1].start, globalMetadata[#globalMetadata]['end'] end, ---@param self Searcher IsValidData = function(self, globalMetadata) if #globalMetadata ~= 0 then gg.searchNumber(self.searchWord, gg.TYPE_BYTE, false, gg.SIGN_EQUAL, globalMetadata[1].start, globalMetadata[#globalMetadata]['end']) if gg.getResultsCount() > 0 then gg.clearResults() return true end end return false end, FindIl2cpp = function() local il2cpp = gg.getRangesList('libil2cpp.so') if #il2cpp == 0 then il2cpp = gg.getRangesList('split_config.') local _il2cpp = {} gg.setRanges(gg.REGION_CODE_APP) for k, v in ipairs(il2cpp) do if (v.state == 'Xa') then gg.searchNumber(':il2cpp', gg.TYPE_BYTE, false, gg.SIGN_EQUAL, v.start, v['end']) if (gg.getResultsCount() > 0) then _il2cpp[#_il2cpp + 1] = v gg.clearResults() end end end il2cpp = _il2cpp else local _il2cpp = {} for k,v in ipairs(il2cpp) do if (string.find(v.type, "..x.") or v.state == "Xa") then _il2cpp[#_il2cpp + 1] = v end end il2cpp = _il2cpp end return il2cpp[1].start, il2cpp[#il2cpp]['end'] end, Il2CppMetadataRegistration = function() gg.clearResults() gg.setRanges(gg.REGION_C_HEAP | gg.REGION_C_ALLOC | gg.REGION_ANONYMOUS | gg.REGION_C_BSS | gg.REGION_C_DATA | gg.REGION_OTHER) gg.loadResults({{ address = Il2cpp.globalMetadataStart, flags = Il2cpp.MainType }}) gg.searchPointer(0) if gg.getResultsCount() == 0 and AndroidInfo.platform and AndroidInfo.sdk >= 30 then gg.searchNumber(tostring(Il2cpp.globalMetadataStart | 0xB400000000000000), Il2cpp.MainType) end if gg.getResultsCount() > 0 then local GlobalMetadataPointers, s_GlobalMetadata = gg.getResults(gg.getResultsCount()), 0 for i = 1, #GlobalMetadataPointers do if i ~= 1 then local difference = GlobalMetadataPointers[i].address - GlobalMetadataPointers[i - 1].address if (difference == Il2cpp.pointSize) then s_GlobalMetadata = Il2cpp.FixValue(gg.getValues({{ address = GlobalMetadataPointers[i].address - (AndroidInfo.platform and 0x10 or 0x8), flags = Il2cpp.MainType }})[1].value) end end end return s_GlobalMetadata end return 0 end } return Searcher end) __bundle_register("utils.patchapi", function(require, _LOADED, __bundle_register, __bundle_modules) ---@class Patch ---@field oldBytes table ---@field newBytes table ---@field Create fun(self : Patch, patchCode : table) : Patch ---@field Patch fun(self : Patch) : void ---@field Undo fun(self : Patch) : void local PatchApi = { ---@param self Patch ---@param patchCode table Create = function(self, patchCode) return setmetatable({ newBytes = patchCode, oldBytes = gg.getValues(patchCode) }, { __index = self, }) end, ---@param self Patch Patch = function(self) if self.newBytes then gg.setValues(self.newBytes) end end, ---@param self Patch Undo = function(self) if self.oldBytes then gg.setValues(self.oldBytes) end end, } return PatchApi end) __bundle_register("utils.version", function(require, _LOADED, __bundle_register, __bundle_modules) local semver = require("semver.semver") ---@class VersionEngine local VersionEngine = { ConstSemVer = { ['2018_3'] = semver(2018, 3), ['2019_4_21'] = semver(2019, 4, 21), ['2019_4_15'] = semver(2019, 4, 15), ['2019_3_7'] = semver(2019, 3, 7), ['2020_2_4'] = semver(2020, 2, 4), ['2020_2'] = semver(2020, 2), ['2020_1_11'] = semver(2020, 1, 11), ['2021_2'] = semver(2021, 2) }, Year = { [2017] = function(self, unityVersion) return 24 end, ---@param self VersionEngine [2018] = function(self, unityVersion) return (not (unityVersion < self.ConstSemVer['2018_3'])) and 24.1 or 24 end, ---@param self VersionEngine [2019] = function(self, unityVersion) local version = 24.2 if not (unityVersion < self.ConstSemVer['2019_4_21']) then version = 24.5 elseif not (unityVersion < self.ConstSemVer['2019_4_15']) then version = 24.4 elseif not (unityVersion < self.ConstSemVer['2019_3_7']) then version = 24.3 end return version end, ---@param self VersionEngine [2020] = function(self, unityVersion) local version = 24.3 if not (unityVersion < self.ConstSemVer['2020_2_4']) then version = 27.1 elseif not (unityVersion < self.ConstSemVer['2020_2']) then version = 27 elseif not (unityVersion < self.ConstSemVer['2020_1_11']) then version = 24.4 end return version end, ---@param self VersionEngine [2021] = function(self, unityVersion) return (not (unityVersion < self.ConstSemVer['2021_2'])) and 29 or 27.2 end, [2022] = function(self, unityVersion) return 29 end, }, ---@return number GetUnityVersion = function() gg.setRanges(gg.REGION_ANONYMOUS) gg.clearResults() gg.searchNumber("00h;32h;30h;0~~0;0~~0;2Eh;0~~0;2Eh::9", gg.TYPE_BYTE, false, gg.SIGN_EQUAL, nil, nil, 1) local result = gg.getResultsCount() > 0 and gg.getResults(3)[3].address or 0 gg.clearResults() return result end, ReadUnityVersion = function(versionAddress) local verisonName = Il2cpp.Utf8ToString(versionAddress) return string.gmatch(verisonName, "(%d+)%p(%d+)%p(%d+)")() end, ---@param self VersionEngine ---@param version? number ChooseVersion = function(self, version, globalMetadataHeader) if not version then local unityVersionAddress = self.GetUnityVersion() if unityVersionAddress == 0 then version = gg.getValues({{address = globalMetadataHeader + 0x4, flags = gg.TYPE_DWORD}})[1].value else local p1, p2, p3 = self.ReadUnityVersion(unityVersionAddress) local unityVersion = semver(tonumber(p1), tonumber(p2), tonumber(p3)) ---@type number | fun(self: VersionEngine, unityVersion: table): number version = self.Year[unityVersion.major] or 29 if type(version) == 'function' then version = version(self, unityVersion) end end end ---@type Il2cppApi local api = assert(Il2CppConst[version], 'Not support this il2cpp version') Il2cpp.FieldApi.Offset = api.FieldApiOffset Il2cpp.FieldApi.Type = api.FieldApiType Il2cpp.FieldApi.ClassOffset = api.FieldApiClassOffset Il2cpp.ClassApi.NameOffset = api.ClassApiNameOffset Il2cpp.ClassApi.MethodsStep = api.ClassApiMethodsStep Il2cpp.ClassApi.CountMethods = api.ClassApiCountMethods Il2cpp.ClassApi.MethodsLink = api.ClassApiMethodsLink Il2cpp.ClassApi.FieldsLink = api.ClassApiFieldsLink Il2cpp.ClassApi.FieldsStep = api.ClassApiFieldsStep Il2cpp.ClassApi.CountFields = api.ClassApiCountFields Il2cpp.ClassApi.ParentOffset = api.ClassApiParentOffset Il2cpp.ClassApi.NameSpaceOffset = api.ClassApiNameSpaceOffset Il2cpp.ClassApi.StaticFieldDataOffset = api.ClassApiStaticFieldDataOffset Il2cpp.ClassApi.EnumType = api.ClassApiEnumType Il2cpp.ClassApi.EnumRsh = api.ClassApiEnumRsh Il2cpp.ClassApi.TypeMetadataHandle = api.ClassApiTypeMetadataHandle Il2cpp.ClassApi.InstanceSize = api.ClassApiInstanceSize Il2cpp.ClassApi.Token = api.ClassApiToken Il2cpp.MethodsApi.ClassOffset = api.MethodsApiClassOffset Il2cpp.MethodsApi.NameOffset = api.MethodsApiNameOffset Il2cpp.MethodsApi.ParamCount = api.MethodsApiParamCount Il2cpp.MethodsApi.ReturnType = api.MethodsApiReturnType Il2cpp.MethodsApi.Flags = api.MethodsApiFlags Il2cpp.GlobalMetadataApi.typeDefinitionsSize = api.typeDefinitionsSize Il2cpp.GlobalMetadataApi.version = version local consts = gg.getValues({ { -- [1] address = Il2cpp.globalMetadataHeader + api.typeDefinitionsOffset, flags = gg.TYPE_DWORD }, { -- [2] address = Il2cpp.globalMetadataHeader + api.stringOffset, flags = gg.TYPE_DWORD, }, { -- [3] address = Il2cpp.globalMetadataHeader + api.fieldDefaultValuesOffset, flags = gg.TYPE_DWORD, }, { -- [4] address = Il2cpp.globalMetadataHeader + api.fieldDefaultValuesSize, flags = gg.TYPE_DWORD }, { -- [5] address = Il2cpp.globalMetadataHeader + api.fieldAndParameterDefaultValueDataOffset, flags = gg.TYPE_DWORD } }) Il2cpp.GlobalMetadataApi.typeDefinitionsOffset = consts[1].value Il2cpp.GlobalMetadataApi.stringOffset = consts[2].value Il2cpp.GlobalMetadataApi.fieldDefaultValuesOffset = consts[3].value Il2cpp.GlobalMetadataApi.fieldDefaultValuesSize = consts[4].value Il2cpp.GlobalMetadataApi.fieldAndParameterDefaultValueDataOffset = consts[5].value Il2cpp.TypeApi.Type = api.TypeApiType Il2cpp.Il2CppTypeDefinitionApi.fieldStart = api.Il2CppTypeDefinitionApifieldStart Il2cpp.MetadataRegistrationApi.types = api.MetadataRegistrationApitypes end, } return VersionEngine end) __bundle_register("semver.semver", function(require, _LOADED, __bundle_register, __bundle_modules) local semver = { _VERSION = '1.2.1', _DESCRIPTION = 'semver for Lua', _URL = 'https://github.com/kikito/semver.lua', _LICENSE = [[ MIT LICENSE Copyright (c) 2015 Enrique GarcÃa Cota Permission is hereby granted, free of charge, to any person obtaining a copy of tother software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and tother permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] } local function checkPositiveInteger(number, name) assert(number >= 0, name .. ' must be a valid positive number') assert(math.floor(number) == number, name .. ' must be an integer') end local function present(value) return value and value ~= '' end -- splitByDot("a.bbc.d") == {"a", "bbc", "d"} local function splitByDot(str) str = str or "" local t, count = {}, 0 str:gsub("([^%.]+)", function(c) count = count + 1 t[count] = c end) return t end local function parsePrereleaseAndBuildWithSign(str) local prereleaseWithSign, buildWithSign = str:match("^(-[^+]+)(+.+)$") if not (prereleaseWithSign and buildWithSign) then prereleaseWithSign = str:match("^(-.+)$") buildWithSign = str:match("^(+.+)$") end assert(prereleaseWithSign or buildWithSign, ("The parameter %q must begin with + or - to denote a prerelease or a build"):format(str)) return prereleaseWithSign, buildWithSign end local function parsePrerelease(prereleaseWithSign) if prereleaseWithSign then local prerelease = prereleaseWithSign:match("^-(%w[%.%w-]*)$") assert(prerelease, ("The prerelease %q is not a slash followed by alphanumerics, dots and slashes"):format(prereleaseWithSign)) return prerelease end end local function parseBuild(buildWithSign) if buildWithSign then local build = buildWithSign:match("^%+(%w[%.%w-]*)$") assert(build, ("The build %q is not a + sign followed by alphanumerics, dots and slashes"):format(buildWithSign)) return build end end local function parsePrereleaseAndBuild(str) if not present(str) then return nil, nil end local prereleaseWithSign, buildWithSign = parsePrereleaseAndBuildWithSign(str) local prerelease = parsePrerelease(prereleaseWithSign) local build = parseBuild(buildWithSign) return prerelease, build end local function parseVersion(str) local sMajor, sMinor, sPatch, sPrereleaseAndBuild = str:match("^(%d+)%.?(%d*)%.?(%d*)(.-)$") assert(type(sMajor) == 'string', ("Could not extract version number(s) from %q"):format(str)) local major, minor, patch = tonumber(sMajor), tonumber(sMinor), tonumber(sPatch) local prerelease, build = parsePrereleaseAndBuild(sPrereleaseAndBuild) return major, minor, patch, prerelease, build end -- return 0 if a == b, -1 if a < b, and 1 if a > b local function compare(a,b) return a == b and 0 or a < b and -1 or 1 end local function compareIds(myId, otherId) if myId == otherId then return 0 elseif not myId then return -1 elseif not otherId then return 1 end local selfNumber, otherNumber = tonumber(myId), tonumber(otherId) if selfNumber and otherNumber then -- numerical comparison return compare(selfNumber, otherNumber) -- numericals are always smaller than alphanums elseif selfNumber then return -1 elseif otherNumber then return 1 else return compare(myId, otherId) -- alphanumerical comparison end end local function smallerIdList(myIds, otherIds) local myLength = #myIds local comparison for i=1, myLength do comparison = compareIds(myIds[i], otherIds[i]) if comparison ~= 0 then return comparison == -1 end -- if comparison == 0, continue loop end return myLength < #otherIds end local function smallerPrerelease(mine, other) if mine == other or not mine then return false elseif not other then return true end return smallerIdList(splitByDot(mine), splitByDot(other)) end local methods = {} function methods:nextMajor() return semver(self.major + 1, 0, 0) end function methods:nextMinor() return semver(self.major, self.minor + 1, 0) end function methods:nextPatch() return semver(self.major, self.minor, self.patch + 1) end local mt = { __index = methods } function mt:__eq(other) return self.major == other.major and self.minor == other.minor and self.patch == other.patch and self.prerelease == other.prerelease -- notice that build is ignored for precedence in semver 2.0.0 end function mt:__lt(other) if self.major ~= other.major then return self.major < other.major end if self.minor ~= other.minor then return self.minor < other.minor end if self.patch ~= other.patch then return self.patch < other.patch end return smallerPrerelease(self.prerelease, other.prerelease) -- notice that build is ignored for precedence in semver 2.0.0 end -- This works like the "pessimisstic operator" in Rubygems. -- if a and b are versions, a ^ b means "b is backwards-compatible with a" -- in other words, "it's safe to upgrade from a to b" function mt:__pow(other) if self.major == 0 then return self == other end return self.major == other.major and self.minor <= other.minor end function mt:__tostring() local buffer = { ("%d.%d.%d"):format(self.major, self.minor, self.patch) } if self.prerelease then table.insert(buffer, "-" .. self.prerelease) end if self.build then table.insert(buffer, "+" .. self.build) end return table.concat(buffer) end local function new(major, minor, patch, prerelease, build) assert(major, "At least one parameter is needed") if type(major) == 'string' then major,minor,patch,prerelease,build = parseVersion(major) end patch = patch or 0 minor = minor or 0 checkPositiveInteger(major, "major") checkPositiveInteger(minor, "minor") checkPositiveInteger(patch, "patch") local result = {major=major, minor=minor, patch=patch, prerelease=prerelease, build=build} return setmetatable(result, mt) end setmetatable(semver, { __call = function(_, ...) return new(...) end }) semver._VERSION= semver(semver._VERSION) return semver end) __bundle_register("utils.il2cppconst", function(require, _LOADED, __bundle_register, __bundle_modules) local AndroidInfo = require("utils.androidinfo") ---@type table<number, Il2cppApi> Il2CppConst = { [20] = { FieldApiOffset = 0xC, FieldApiType = 0x4, FieldApiClassOffset = 0x8, ClassApiNameOffset = 0x8, ClassApiMethodsStep = 2, ClassApiCountMethods = 0x9C, ClassApiMethodsLink = 0x3C, ClassApiFieldsLink = 0x30, ClassApiFieldsStep = 0x18, ClassApiCountFields = 0xA0, ClassApiParentOffset = 0x24, ClassApiNameSpaceOffset = 0xC, ClassApiStaticFieldDataOffset = 0x50, ClassApiEnumType = 0xB0, ClassApiEnumRsh = 2, ClassApiTypeMetadataHandle = 0x2C, ClassApiInstanceSize = 0x78, ClassApiToken = 0x98, MethodsApiClassOffset = 0xC, MethodsApiNameOffset = 0x8, MethodsApiParamCount = 0x2E, MethodsApiReturnType = 0x10, MethodsApiFlags = 0x28, typeDefinitionsSize = 0x70, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = 0x6, Il2CppTypeDefinitionApifieldStart = 0x38, MetadataRegistrationApitypes = 0x1C, }, [21] = { FieldApiOffset = 0xC, FieldApiType = 0x4, FieldApiClassOffset = 0x8, ClassApiNameOffset = 0x8, ClassApiMethodsStep = 2, ClassApiCountMethods = 0x9C, ClassApiMethodsLink = 0x3C, ClassApiFieldsLink = 0x30, ClassApiFieldsStep = 0x18, ClassApiCountFields = 0xA0, ClassApiParentOffset = 0x24, ClassApiNameSpaceOffset = 0xC, ClassApiStaticFieldDataOffset = 0x50, ClassApiEnumType = 0xB0, ClassApiEnumRsh = 2, ClassApiTypeMetadataHandle = 0x2C, ClassApiInstanceSize = 0x78, ClassApiToken = 0x98, MethodsApiClassOffset = 0xC, MethodsApiNameOffset = 0x8, MethodsApiParamCount = 0x2E, MethodsApiReturnType = 0x10, MethodsApiFlags = 0x28, typeDefinitionsSize = 0x78, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = 0x6, Il2CppTypeDefinitionApifieldStart = 0x40, MetadataRegistrationApitypes = 0x1C, }, [22] = { FieldApiOffset = 0xC, FieldApiType = 0x4, FieldApiClassOffset = 0x8, ClassApiNameOffset = 0x8, ClassApiMethodsStep = 2, ClassApiCountMethods = 0x94, ClassApiMethodsLink = 0x3C, ClassApiFieldsLink = 0x30, ClassApiFieldsStep = 0x18, ClassApiCountFields = 0x98, ClassApiParentOffset = 0x24, ClassApiNameSpaceOffset = 0xC, ClassApiStaticFieldDataOffset = 0x4C, ClassApiEnumType = 0xA9, ClassApiEnumRsh = 2, ClassApiTypeMetadataHandle = 0x2C, ClassApiInstanceSize = 0x70, ClassApiToken = 0x90, MethodsApiClassOffset = 0xC, MethodsApiNameOffset = 0x8, MethodsApiParamCount = 0x2E, MethodsApiReturnType = 0x10, MethodsApiFlags = 0x28, typeDefinitionsSize = 0x78, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = 0x6, Il2CppTypeDefinitionApifieldStart = 0x40, MetadataRegistrationApitypes = 0x1C, }, [23] = { FieldApiOffset = 0xC, FieldApiType = 0x4, FieldApiClassOffset = 0x8, ClassApiNameOffset = 0x8, ClassApiMethodsStep = 2, ClassApiCountMethods = 0x9C, ClassApiMethodsLink = 0x40, ClassApiFieldsLink = 0x34, ClassApiFieldsStep = 0x18, ClassApiCountFields = 0xA0, ClassApiParentOffset = 0x24, ClassApiNameSpaceOffset = 0xC, ClassApiStaticFieldDataOffset = 0x50, ClassApiEnumType = 0xB1, ClassApiEnumRsh = 2, ClassApiTypeMetadataHandle = 0x2C, ClassApiInstanceSize = 0x78, ClassApiToken = 0x98, MethodsApiClassOffset = 0xC, MethodsApiNameOffset = 0x8, MethodsApiParamCount = 0x2E, MethodsApiReturnType = 0x10, MethodsApiFlags = 0x28, typeDefinitionsSize = 104, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = 0x6, Il2CppTypeDefinitionApifieldStart = 0x30, MetadataRegistrationApitypes = 0x1C, }, [24.1] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x110 or 0xA8, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x114 or 0xAC, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x126 or 0xBE, ClassApiEnumRsh = 3, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xEC or 0x84, ClassApiToken = AndroidInfo.platform and 0x10c or 0xa4, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 100, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x2C, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [24] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x114 or 0xAC, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x28 or 0x18, ClassApiCountFields = AndroidInfo.platform and 0x118 or 0xB0, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x129 or 0xC1, ClassApiEnumRsh = 2, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF0 or 0x88, ClassApiToken = AndroidInfo.platform and 0x110 or 0xa8, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4E or 0x2E, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x48 or 0x28, typeDefinitionsSize = 104, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x30, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [24.2] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x118 or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x11c or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x12e or 0xBA, ClassApiEnumRsh = 3, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF4 or 0x80, ClassApiToken = AndroidInfo.platform and 0x114 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 92, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x24, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [24.3] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x118 or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x11c or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x12e or 0xBA, ClassApiEnumRsh = 3, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF4 or 0x80, ClassApiToken = AndroidInfo.platform and 0x114 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 92, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x24, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [24.4] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x118 or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x11c or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x12e or 0xBA, ClassApiEnumRsh = 3, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF4 or 0x80, ClassApiToken = AndroidInfo.platform and 0x114 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 92, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x24, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [24.5] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x118 or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x11c or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x12e or 0xBA, ClassApiEnumRsh = 3, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF4 or 0x80, ClassApiToken = AndroidInfo.platform and 0x114 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 92, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x24, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [27] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x11C or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x120 or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x132 or 0xBA, ClassApiEnumRsh = 3, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF8 or 0x80, ClassApiToken = AndroidInfo.platform and 0x118 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 88, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x20, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [27.1] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x11C or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x120 or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x132 or 0xBA, ClassApiEnumRsh = 3, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF8 or 0x80, ClassApiToken = AndroidInfo.platform and 0x118 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 88, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x20, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [27.2] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x11C or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x120 or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x132 or 0xBA, ClassApiEnumRsh = 2, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF8 or 0x80, ClassApiToken = AndroidInfo.platform and 0x118 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, MethodsApiParamCount = AndroidInfo.platform and 0x4A or 0x2A, MethodsApiReturnType = AndroidInfo.platform and 0x20 or 0x10, MethodsApiFlags = AndroidInfo.platform and 0x44 or 0x24, typeDefinitionsSize = 88, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x20, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, }, [29] = { FieldApiOffset = AndroidInfo.platform and 0x18 or 0xC, FieldApiType = AndroidInfo.platform and 0x8 or 0x4, FieldApiClassOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiNameOffset = AndroidInfo.platform and 0x10 or 0x8, ClassApiMethodsStep = AndroidInfo.platform and 3 or 2, ClassApiCountMethods = AndroidInfo.platform and 0x11C or 0xA4, ClassApiMethodsLink = AndroidInfo.platform and 0x98 or 0x4C, ClassApiFieldsLink = AndroidInfo.platform and 0x80 or 0x40, ClassApiFieldsStep = AndroidInfo.platform and 0x20 or 0x14, ClassApiCountFields = AndroidInfo.platform and 0x120 or 0xA8, ClassApiParentOffset = AndroidInfo.platform and 0x58 or 0x2C, ClassApiNameSpaceOffset = AndroidInfo.platform and 0x18 or 0xC, ClassApiStaticFieldDataOffset = AndroidInfo.platform and 0xB8 or 0x5C, ClassApiEnumType = AndroidInfo.platform and 0x132 or 0xBA, ClassApiEnumRsh = 2, ClassApiTypeMetadataHandle = AndroidInfo.platform and 0x68 or 0x34, ClassApiInstanceSize = AndroidInfo.platform and 0xF8 or 0x80, ClassApiToken = AndroidInfo.platform and 0x118 or 0xa0, MethodsApiClassOffset = AndroidInfo.platform and 0x20 or 0x10, MethodsApiNameOffset = AndroidInfo.platform and 0x18 or 0xC, MethodsApiParamCount = AndroidInfo.platform and 0x52 or 0x2E, MethodsApiReturnType = AndroidInfo.platform and 0x28 or 0x14, MethodsApiFlags = AndroidInfo.platform and 0x4C or 0x28, typeDefinitionsSize = 88, typeDefinitionsOffset = 0xA0, stringOffset = 0x18, fieldDefaultValuesOffset = 0x40, fieldDefaultValuesSize = 0x44, fieldAndParameterDefaultValueDataOffset = 0x48, TypeApiType = AndroidInfo.platform and 0xA or 0x6, Il2CppTypeDefinitionApifieldStart = 0x20, MetadataRegistrationApitypes = AndroidInfo.platform and 0x38 or 0x1C, } } ---@class Il2CppFlags ---@field Method MethodFlags ---@field Field FieldFlags Il2CppFlags = { Method = { METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK = 0x0007, Access = { "private", -- METHOD_ATTRIBUTE_PRIVATE "internal", -- METHOD_ATTRIBUTE_FAM_AND_ASSEM "internal", -- METHOD_ATTRIBUTE_ASSEM "protected", -- METHOD_ATTRIBUTE_FAMILY "protected internal", -- METHOD_ATTRIBUTE_FAM_OR_ASSEM "public", -- METHOD_ATTRIBUTE_PUBLIC }, METHOD_ATTRIBUTE_STATIC = 0x0010, METHOD_ATTRIBUTE_ABSTRACT = 0x0400, }, Field = { FIELD_ATTRIBUTE_FIELD_ACCESS_MASK = 0x0007, Access = { "private", -- FIELD_ATTRIBUTE_PRIVATE "internal", -- FIELD_ATTRIBUTE_FAM_AND_ASSEM "internal", -- FIELD_ATTRIBUTE_ASSEMBLY "protected", -- FIELD_ATTRIBUTE_FAMILY "protected internal", -- FIELD_ATTRIBUTE_FAM_OR_ASSEM "public", -- FIELD_ATTRIBUTE_PUBLIC }, FIELD_ATTRIBUTE_STATIC = 0x0010, FIELD_ATTRIBUTE_LITERAL = 0x0040, } } end) return __bundle_require("GGIl2cpp") end function YXSOMODx32XB(NAME,SOTYPE,SONAME,TYPE,VALUE,VALUEXB) local SOMOD=gg.getRangesList("il2cpp.so") if SOMOD[1]==nil then gg.toast(NAME.."å¼€å¯å¤±è´¥") else SOMOD_byYx() Il2cpp({il2cppVersion=27}) search = Il2cpp.FindMethods ({SONAME}) local Value = {SOTYPE} local conut = { } for k ,v in ipairs (search) do for kk ,vv in ipairs (v) do if vv.ClassName==Value[k] then cncat ="0x"..vv.Offset..'\n' gg.setValues({{address=gg.getRangesList('il2cpp.so')[1].start+cncat,flags=TYPE,value=VALUE}}) gg.setValues({{address=gg.getRangesList('il2cpp.so')[1].start+cncat+4,flags=TYPE,value=VALUEXB}}) gg.toast(NAME.."开坿ˆåŠŸ") end end end end end ms={} function setvalue(add,value,falgs,dj) local WY={}WY[1]={}WY[1].address=add WY[1].value=value WY[1].flags=falgs if dj==true then WY[1].freeze=true gg.addListItems(WY) else gg.setValues(WY) end end function ms.ss(num,ty,nc) local GGNUMBER_1=num local GGNUMBER_2=ty local GGNUMBER_3=false local GGNUMBER_4=gg.SIGN_EQUAL local GGNUMBER_5=0x3000000 local GGNUMBER_6=0xFFFFFFFF local GGNUMBER_7=0 gg.clearResults() gg.setRanges(nc) gg.searchNumber(GGNUMBER_1,GGNUMBER_2,GGNUMBER_3,GGNUMBER_4,GGNUMBER_5,GGNUMBER_6,GGNUMBER_7) Result=gg.getResults(gg.getResultCount()) end function ms.py(num,py,ty) if(Result and#Result~=0)then t={} for i,v in ipairs(Result)do t[i]={}t[i].address=v.address+py t[i].flags=ty end t=gg.getValues(t) for i,v in ipairs(t)do if v.value ~= num then Result[i]=nil end end local MS={} for i,v in pairs(Result)do MS[#MS+1]=v end Result=MS end end function ms.bc() data={} if Result==nil or #Result==0 then else for i,v in pairs(Result)do data[#data+1]=v.address end end Result = nil end function ms.edit(nn,off,ty,dj) if(Result) then ms.bc() end if#data>0 then for i,v in ipairs(data)do setvalue(v+off,nn,ty,dj or false) end end end function search(ss,lx,nc,dz1,dz2) if ss~=nil then if lx~=nil then if nc==nil then nc=32 end gg.setRanges(nc) if dz1==nil then dz1="-1" end if dz2==nil then dz1="0" end gg.searchNumber(ss,lx,false,gg.SIGN_EQUAL,dz1,dz2) sl=gg.getResultCount() if sl~=0 then sj=gg.getResults(sl) gg.toast("ï¸æœç´¢åˆ° "..sl.." 个结果") gg.clearResults() else gg.toast("失败了å°è€å¼Ÿ") end else gg.toast("失败了å°è€å¼Ÿ") end else gg.toast("失败了å°è€å¼Ÿ") end end function py1(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[1]={} z1[1].address=sj[i].address+py z1[1].flags=lx z1=gg.getValues(z1) if z1[1].value==value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("å…±åç§» "..#sj.." 个数æ®") else gg.toast("失败了å°è€å¼Ÿ") end end function py2(value,lx,py) if #sj~=nil then z1={} z2={} for i=1,#sj do z1[1]={} z1[1].address=sj[i].address+py z1[1].flags=lx z1=gg.getValues(z1) if z1[1].value~=value then z2[#z2+1]={} z2[#z2]=sj[i] end end sj=z2 z1={} z2={} gg.toast("å…±åç§» "..#sj.." 个数æ®") else gg.toast("失败了å°è€å¼Ÿ") end end function xg1(value,lx,py,dj) if #sj~=nil then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数æ®ï¸") else gg.toast("失败了å°è€å¼Ÿ") end end function xg2(bz,value,lx,py,dj) if #bz~=nil then z={} for i=1,#bz do z[i]={} z[i].address=bz[i].address+py z[i].flags=lx z[i].value=value if dj==true then z[i].freeze=true end end if dj==true then gg.addListItems(z) else gg.clearList() gg.setValues(z) end gg.toast("共修改 "..#z.." 个数æ®") else gg.toast("失败了å°è€å¼Ÿ") end end function bc(bz) if sj~=nil then _ENV[bz]=sj else gg.toast("失败了å°è€å¼Ÿ") end end function xg1(value,lx,py,dj) if sj~=nil and #sj>0 then z={} for i=1,#sj do z[i]={} z[i].address=sj[i].address+py z[i].flags=lx if value == nil then value = readValue(z[i].address, lx) end z[i].value= value z[i].freeze = dj and true or false end if dj == true or dj == false then gg.addListItems(z) else gg.setValues(z) end gg.toast('') else gg.toast('') end end sz = function ( Address , Value ) local Somod = gg.getRangesList ( 'il2cpp.so' ) [ 1 ] if Somod == nil then gg.alert ( 'è¯·é‡æ–°é€‰æ‹©åœ°é“跑酷进程' ) else local So = Somod.start local Add = So + Address gg.processPause ( ) gg.setValues ( { { address = Add , flags = 4 , value = Value } } ) gg.setValues ( { { address = Add + 4 , flags = 4 , value = "~A BX LR" } } ) gg.processResume ( ) end end function a4c(FUNCTIONADD,TYPE,VALUE) local SOMOD=gg.getRangesList("il2cpp.so") if SOMOD[1]==nil then _error() else gg.setValues({{address=SOMOD[1].start+FUNCTIONADD,flags=TYPE,value=VALUE}}) gg.setValues({{address=SOMOD[1].start+FUNCTIONADD+4,flags=TYPE,value="1EFF2FE1r"}}) end 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]) 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 ----------------------------------------------------------------------------------------- ms = { } function setvalue ( add , value , falgs , dj ) local WY = { } WY [ 1 ] = { } WY [ 1 ].address = add WY [ 1 ].value = value WY [ 1 ].flags = falgs if dj == true then WY [ 1 ].freeze = true gg.addListItems ( WY ) else gg.setValues ( WY ) end end menu ={} name ={} id = 0 play = false song = "" _G_ = { function() local searchMusic = gg.prompt({ "æŒæ›²â€¢æŒæ‰‹", "列表•é™åˆ¶", },{"","10"},{ "text", "text", }) if not searchMusic then gg.setVisible(false) Main() elseif searchMusic[1] == "" then gg.alert("è¯·è¾“å…¥æŒæ›²/æŒæ‰‹ï¼") _G_[1]() else local results = gg.makeRequest("http://music.163.com/api/search/get?s="..searchMusic[1].."&type=1&offset=0&total=true&limit="..searchMusic[2]) if results.code == 200 then n=1 for v,k in results.content:gmatch('"id":(.-),"name":"(.-)"') do if n%4 == 1 then menu[n/4+1] = v..";"..k end if n%4 == 2 then menu[n/4+1] = menu[n/4+1]..";"..k end n=n+1 end _G_[2]() else local s = gg.alert("请求异常,请检查网络……","返回","退出") if not s then gg.setVisible(false) Main() end if s == 1 then os.exit() end if s == 2 then _G_[1]() end end end end, function() if #menu == 0 then gg.alert("没有æœç´¢è®°å½•") Main() else for n=1,#menu do name[n] = menu[n]:gsub("[0-9]+;",""):gsub(";","\næŒæ‰‹ï¼š") end local mu = gg.choice(name,0,"æŒå•") if not mu then _G_[1]() else song = name[mu] local sn=gg.choice({"æ’æ”¾","查看æŒè¯"},nil,"æŒæ›²ï¼š"..name[mu]) if not sn then _G_[1]() end if sn == 1 then id = menu[mu]:match("(.-);") gg.toast("æ£åœ¨æ’放音ä¹ï¼š"..name[mu],true) gg.playMusic("http://music.163.com/song/media/outer/url?id="..id..".mp3") play = true end if sn == 2 then id = menu[mu]:match("(.-);") song = name[mu] _G_[3]() end end end end, function() if id == 0 then gg.alert("æœªæœ‰æ’æ”¾è®°å½•") Main() else local results = gg.makeRequest("http://music.163.com/api/song/media?id="..id).content rs = results:match('"lyric":"(.-)","code'):gsub("\\n","\n"):gsub("[[!-z]+]","") gg.alert("\n《"..song:gsub("\n","》\n").."\n\n"..rs) gg.setVisible(false) end end, function() if play then play = false gg.toast("æ£åœ¨åœæ¢æ’放...") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end gg.toast("æ’æ”¾å·²åœæ¢") else gg.toast("æ— æ£åœ¨æ’放的音ä¹") end end, function() gg.setVisible(false) if play then _G_[4]() end LSP() end } function WTYY() local emo = gg.choice({ "æœç´¢æŒæ›²", "æœç´¢åˆ—表", "显示æŒè¯", "æš‚åœæ’放", },nil," ") if not emo then gg.setVisible(false) end if emo then _G_[emo]() end end wyyget="http://120.24.160.246:3000/" function huoqu(txt) return table.json(gg.makeRequest(wyyget.."song/url/v1?id="..txt.."").content) end function souyy(txt) tbttt=gg.makeRequest(wyyget.."search?keywords="..txt.."&limit=10") if tbttt==nil or type(tbttt)=="string" then gg.alert("网络异常") luajava.runUiThread(function() luajava.getIdView("jzz"):setVisibility(View.GONE) luajava.getIdView("sstxt"):setVisibility(View.VISIBLE) end) end return table.json(tbttt.content) end function develo(tabb) gg.alert(tostring(tabb)) end function develo2(tabb) gg.copyText(tostring(tabb)) end function tablekIn(tbl, key) if tbl == nil then return false end for k, v in pairs(tbl) do if k == key then return true end end return false end function searchmusic() if not lasttm then lasttm=os.time() else if os.time()-lasttm<=5 then gg.alert("请在"..(5-(os.time()-lasttm)).."秒冷å´åŽæœç´¢") return 0 end end if not wryt then else runnable = luajava.getRunnable(function() luajava.getIdView("æœç´¢åˆ—表"):removeView(wyr) end) handler = luajava.getHandler() handler:post(runnable) end mustxt=luajava.getIdView("æœç´¢"):getText() if string.len(tostring(mustxt))<=2 or tostring(mustxt)==nil then gg.alert("ä½ è¸é©¬è¿˜æ²¡è¾“å…¥") return 0 end mustxt=tostring(mustxt) luajava.runUiThread(function() luajava.getIdView("jzz"):setVisibility(View.VISIBLE) luajava.getIdView("sstxt"):setVisibility(View.GONE) end) lasttm=os.time() mustable=souyy(mustxt) mustable=mustable.result.songs musnames={} musids={} musarts={} musictable={} for k,v in pairs(mustable) do if tonumber(v.fee)==0 or tonumber(v.fee)==8 then musictable[#musictable+1]=v end end --gg.alert(tostring(mustable)) --gg.alert(tostring(musictable)) --gg.copyText(tostring(mustable)) --gg.alert(#musictable) wrfun={} wryt={LinearLayout, id=luajava.newId("æœç´¢ç»“æžœ"), layout_marginTop="5dp", layout_marginBottom="5dp", orientation="vertical", } for i=1,#musictable do musid=musictable[i].id musids[#musids+1]=musid musname=musictable[i].name if tablekIn(musictable[i], "transNames")~=false then musname=musname .."\n(".. musictable[i].transNames[0]..")" end musnames[#musnames+1]=musname musart=musictable[i].artists[0].name musarts[#musarts+1]=musart wryt[#wryt+1]={LinearLayout, orientation="vertical", layout_marginTop="2dp", layout_marginBottom="2dp", background=getseekgra(), id=luajava.newId("音"..musid), onClick=function() thread = luajava.getPThread(function() bofang(musname,musid) end) thread:start() end, { TextView, layout_marginTop="5dp", textSize="15sp", textColor="#ffffff", layout_marginBottom="0dp", text = musname, layout_width = "240dp", gravity="center", },{ TextView, layout_marginTop="0dp", textColor="#3074FF", textSize="12sp", layout_marginBottom="5dp", text = musart, layout_width = "match_parent", gravity="center", } } --gg.sleep(50) wryt[#wryt].onClick=function() luajava.getPThread(function() bofang(musnames[i]..musarts[i],musids[i]) end):start() end end wyr=luajava.loadlayout(wryt) runnable = luajava.getRunnable(function() luajava.getIdView("æœç´¢åˆ—表"):addView(wyr) end) handler = luajava.getHandler() handler:post(runnable) luajava.runUiThread(function() luajava.getIdView("jzz"):setVisibility(View.GONE) luajava.getIdView("sstxt"):setVisibility(View.VISIBLE) end) --gg.alert(tostring(wrfun)) end function bofang(gqmz,gdmn) luajava.runUiThread(function() luajava.getIdView("æœç´¢ç»“æžœ"):setVisibility(View.GONE) luajava.getIdView("åŠ è½½"):setVisibility(View.VISIBLE) end) if panduan("/sdcard/FISH/音频/"..gqmz..".mp3")==true then gg.playMusic("/sdcard/FISH/音频/"..gqmz..".mp3") else gg.toast("下载ä¸..."..gqmz) musurl=huoqu(gdmn).data[0].url if musurl=="" or musurl=="null" then gg.alert("由于版æƒé—®é¢˜\n这首æŒä¸èƒ½æ’放ðŸ”ðŸ€","抑éƒ","ç´«ç ‚") else download(musurl,"/sdcard/FISH/音频/"..gqmz..".mp3") gg.playMusic("/sdcard/FISH/音频/"..gqmz..".mp3") gg.sleep(1000) end end luajava.runUiThread(function() luajava.getIdView("åŠ è½½"):setVisibility(View.GONE) luajava.getIdView("æœç´¢ç»“æžœ"):setVisibility(View.VISIBLE) end) end sstxt={LinearLayout, visibility="visible", id=luajava.newId("sstxt"), gravity="center", layout_hight="90dp", layout_width="70dp", gravity="center", orientation="vertical", {TextView, text="æœç´¢", background=luajava.loadlayout({ GradientDrawable, color = "#C62E0067", cornerRadius = 5 }), gravity="center", layout_hight="30dp", layout_width="70dp", textSize="15sp", onClick=function() thread = luajava.getPThread(function() searchmusic() end) thread:start() end, }, {TextView, text="åœæ¢", background=luajava.loadlayout({ GradientDrawable, color = "#C62E0067", cornerRadius = 5 }), gravity="center", layout_hight="30dp", layout_width="70dp", textSize="15sp", onClick=function() thread = luajava.getPThread(function() gg.playMusic("stop") end) thread:start() end, } } jzz={TextView, text="åŠ è½½ä¸", visibility="gone", id=luajava.newId("jzz"), layout_marginLeft="10dp", textSize="15sp", } jiaz={TextView,text="åŠ è½½ä¸â€¦â€¦", visibility="gone", id=luajava.newId("åŠ è½½"), textSize="17sp", gravity="center" } wyylog=luajava.loadlayout({LinearLayout, layout_hight="wrap_content", layout_width = "fill_parent", {ScrollView, layout_hight="wrap_content", layout_width = "fill_parent", {LinearLayout, id=luajava.newId("æœç´¢åˆ—表"), layout_hight="wrap_content", layout_width = "fill_parent", orientation="vertical", layout_width = "fill_parent", gravity="center", {LinearLayout,orientation="horizontal", layout_width = "wrap_content", { EditText, hint = "è¾“å…¥æŒæ›²å³å¯æœç´¢", id=luajava.newId("æœç´¢"), background=luajava.loadlayout({ GradientDrawable, color = "#88000000", cornerRadius = 5 }), focusableInTouch="false", focusable="false", selectAllOnFocus="true", singleLine="true", gravity="center", layout_width = "170dp", layout_height = "48dp", }, sstxt, jzz },jiaz}} }) vibra = context:getSystemService(Context.VIBRATOR_SERVICE) jianbian7 = luajava.new(GradientDrawable) jianbian7:setCornerRadius(40) jianbian7:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbian7:setColors({ 0x6600FF76,0x9900A5FF }) jianbian7:setStroke(8,"0xaa0082FF") function tst(text) text = tostring(text) local block = luajava.getBlock() local layout = luajava.loadlayout({ LinearLayout, background = jianbian7, gravity = 'center', layout_height = 'match_parent', layout_width = 'match_parent', layout_wight = '1', { TextView, id = luajava.newId('TextView'), text = text, textSize = '18sp', textColor = "#ffffffff", margins = { '25dp', '10dp', '25dp', '10dp' } } }) local function invoke() if toaa == nil then toaa = Toast:makeText(app.context, '', 1) end toaa:setView(layout) toaa:show() end luajava.handlerPost(invoke) end vibra = context:getSystemService(Context.VIBRATOR_SERVICE) byrq = {} local byrq = byrq local android = import('android.*') write=file.write function panduan(rec) fille,err = io.open(rec) if fille == nil then return false else return true end end read=file.read function checkimg(tmp) if panduan("/sdcard/changan/图片/"..tmp) ~= true then gg.toast("æ£åœ¨åŠ è½½èµ„æº"..tmp) download("https://escape2020-1303126286.cos.ap-shenzhen-fsi.myqcloud.com/"..tmp,"/sdcard/changan/图片/"..tmp) end end function 获å–图片(txt) ntxt=string.sub(string.gsub(txt,"/","."),-10,-1) if string.find(tostring(txt),"http")~=nil then if panduan("/sdcard/changan/图片/"..ntxt)==false then download(txt,"/sdcard/changan/图片/"..ntxt) end txt="/sdcard/changan/图片/"..ntxt end return luajava.getBitmapDrawable(txt) end ckimg = { "sj", "hsj", "xflog", "arblackx", } for i = 1,#ckimg do checkimg(ckimg[i]) end context = app.context window = context:getSystemService("window") -- 获å–窗å£ç®¡ç†å™¨ function getLayoutParams() LayoutParams = WindowManager.LayoutParams layoutParams = luajava.new(LayoutParams) if (Build.VERSION.SDK_INT >= 26) then -- è®¾ç½®æ‚¬æµ®çª—æ–¹å¼ layoutParams.type = LayoutParams.TYPE_APPLICATION_OVERLAY else layoutParams.type = LayoutParams.TYPE_PHONE end layoutParams.format = PixelFormat.RGBA_8888 -- 设置背景 layoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE -- 焦点设置Finish layoutParams.gravity = Gravity.TOP|Gravity.LEFT -- é‡åŠ›è®¾ç½® layoutParams.width = LayoutParams.WRAP_CONTENT -- 布局宽度 layoutParams.height = LayoutParams.WRAP_CONTENT -- 布局高度 return layoutParams end function getj6() jianbian6 = luajava.new(GradientDrawable) jianbian6:setCornerRadius(20) jianbian6:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbian6:setColors({0xffffffff,0xffffffff}) jianbian6:setStroke(0,"0xdd000000")--边框宽度和颜色 return jianbian6 end hanshu = function(v, event) local Action = event:getAction() if Action == MotionEvent.ACTION_DOWN then isMove = false RawX = event:getRawX() RawY = event:getRawY() x = mainLayoutParams.x y = mainLayoutParams.y elseif Action == MotionEvent.ACTION_MOVE then isMove = true mainLayoutParams.x = tonumber(x) + (event:getRawX() - RawX) mainLayoutParams.y = tonumber(y) + (event:getRawY() - RawY) window:updateViewLayout(floatWindow, mainLayoutParams) end end slctb1 = luajava.loadlayout({ GradientDrawable, color = "#661E1C27", cornerRadius = 20 }) slcta1 = luajava.loadlayout({ GradientDrawable, color = "#331E1C27", cornerRadius = 20 }) function getSelector3() selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, slcta1) -- 点击时候的背景 selector:addState({ -android.R.attr.state_pressed }, slctb1) -- 没点击的背景 return selector end slctb = luajava.loadlayout({ GradientDrawable, color = "#001E1C27", cornerRadius = 0 }) slcta = luajava.loadlayout({ GradientDrawable, color = "0xff0086F1", cornerRadius = 4 }) slctc = luajava.loadlayout { GradientDrawable, color = "#ffffffff", cornerRadius = 16 } slctd = luajava.loadlayout { GradientDrawable, color = "#ddE0E0E0", cornerRadius = 16 } slcte = luajava.loadlayout { GradientDrawable, color = "#11ffffff", cornerRadius = 12 } slctf = luajava.loadlayout { GradientDrawable, color = "#aa1E1C27", cornerRadius = 12 } byrq.controlWater2 = function ( control , time ) luajava.runUiThread ( function ( ) import "android.animation.ObjectAnimator" ObjectAnimator ( ) : ofFloat ( control , "scaleX" , { 1 , 1.1 , 0.9 , 1 } ) : setDuration ( time ) : start ( ) ObjectAnimator ( ) : ofFloat ( control , "scaleY" , { 1 , 0.9 , 1.1 , 1 } ) : setDuration ( time ) : start ( ) end ) end byrq.controlRotation2 = function(control, time) luajava.runUiThread(function() import "android.view.animation.Animation" import "android.animation.ObjectAnimator" xuanzhuandonghua = ObjectAnimator:ofFloat(control, "rotation", { 0, 720 }) xuanzhuandonghua:setRepeatCount(0) xuanzhuandonghua:setRepeatMode(Animation.RESTART) xuanzhuandonghua:setDuration(time) xuanzhuandonghua:start() end) end byrq.controlBig = function(control,time) luajava.runUiThread(function() import "android.animation.ObjectAnimator" ObjectAnimator():ofFloat(control,"scaleX",{0, 0.4, 0.7, 1}):setDuration(time):start() ObjectAnimator():ofFloat(control,"scaleY",{0, 0.4, 0.7, 1}):setDuration(time):start() end) end byrq.controlWater = function ( control , time ) luajava.runUiThread ( function ( ) import "android.animation.ObjectAnimator" ObjectAnimator ( ) : ofFloat ( control , "scaleX" , { 1 , 0.8 , 0.9 , 1 } ) : setDuration ( time ) : start ( ) ObjectAnimator ( ) : ofFloat ( control , "scaleY" , { 1 , 0.8 , 0.9 , 1 } ) : setDuration ( time ) : start ( ) end ) end byrq.controlFlip = function ( control , time ) luajava.runUiThread ( function ( ) import "android.view.animation.Animation" import "android.animation.ObjectAnimator" xuanzhuandonghua = ObjectAnimator : ofFloat ( control , "rotationY" , { 0 , 360 } ) xuanzhuandonghua : setRepeatCount ( 0 ) xuanzhuandonghua : setRepeatMode ( Animation.REVERSE ) xuanzhuandonghua : setDuration ( time ) xuanzhuandonghua : start ( ) end ) end function getSelector() selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, slcta) -- 点击时候的背景 selector:addState({ -android.R.attr.state_pressed }, slctb) -- 没点击的背景 return selector end function getSelector2() selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, slctd) -- 点击时候的背景 selector:addState({ -android.R.attr.state_pressed }, slctc) -- 没点击的背景 return selector end jianbian = luajava.new(GradientDrawable) jianbian:setCornerRadius(30) jianbian:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbian2 = luajava.new(GradientDrawable) jianbian2:setCornerRadius(30) jianbian2:setGradientType(GradientDrawable.LINEAR_GRADIENT) local isswitch YoYoImpl = luajava.getYoYoImpl() byrq.menu = function(sview) if isswitch then return false end for i=1,#stab do _ENV["jmb"..i]=getSelector() end isswitch = true cebian = { LinearLayout, id = "ä¾§è¾¹", gravity = "center", visibility = "gone", layout_height = "wrap_content", layout_width = "match_parent", } gund = { LinearLayout, background=getblue(), gravity = "center", orientation = "horizontal", layout_height = "wrap_content", layout_width = "wrap_content", } for i = 1,#stab do _ENV["jm"..i]=luajava.loadlayout({ LinearLayout, id = "jm"..i, layout_height = "28dp", layout_width = "68dp", gravity = "center", layout_marginTop = "2dp", layout_marginBottom = "2dp", background = _ENV["jmb"..i], onClick=function() byrq.controlWater2(floatWindow,400) byrq.controlFlip(_ENV["jm"..i],400) 切æ¢(i) end, { TextView, id="jm"..i.."t", gravity = "center", textColor="#0086F1", text = stab[i], --onClick = function() 切æ¢(i) end }}) gund[#gund+1] = _ENV["jm"..i] if i< #stab then gund[#gund+1] = luajava.loadlayout({ LinearLayout, layout_height="match_parent", layout_width="1.3dp", background="#0086F1" }) end end cebian[#cebian+1] = { HorizontalScrollView, gravity = "center", fillViewport = "true", layout_height = "wrap_content", layout_width = "wrap_content", gund, } cebian = luajava.loadlayout(cebian) for i = 1,#stab do _ENV["layout"..i] = luajava.loadlayout( { ScrollView, --background = getj6(), fillViewport = "true", padding = "3dp", id = "layout"..i, visibility = "gone", padding="10dp", layout_width = "wrap_content", layout_height = "wrap_content", orientation = "vertical", { LinearLayout, --background = getj6(), id = "layoutm"..i, gravity = "top", layout_width = "250dp", orientation = "vertical", gravity = "center_horizontal", }, }) end ckou = { LinearLayout, id = "chuangk", padding="4dp", visibility = "gone", layout_width = "wrap_content", layout_height = "wrap_content", orientation = "vertical", cebian, } for i = 1,#stab do ckou[#ckou+1] = _ENV["layout"..i] end --luajava.newThread(function() develo(ckou) end):start() ckou = luajava.loadlayout(ckou) title = luajava.loadlayout({ TextView, id = "title", visibility = "gone", text = stitle, --background="#80FF00", textColor="#000000", gravity = "center", textSize = "19sp", layout_marginTop = "20dp", layout_width = "280dp", }) floatWindow = { LinearLayout, id = "motion", orientation="vertical", {FrameLayout, layout_width="wrap_content", --background="#ffffff", { LinearLayout, gravity = "center", { ImageView, id = "control", background = (xfcpic), layout_width = "40dp", layout_height = "40dp", }}, { ImageView, id = "exit", layout_gravity="right", visibility="gone", src = "/sdcard/è£æƒ…RQ/图片/arblackx", layout_width = "20dp", layout_height = "20dp", layout_marginTop = "10dp", layout_marginRight = "20dp", }, {LinearLayout, layout_width = "wrap_content", orientation = "vertical", gravity = "center_vertical", layout_height = "wrap_content", { LinearLayout, layout_width = "wrap_content", layout_height = "wrap_content", orientation = "horizontal", gravity = "center", title, }, }}, ckou } local function invoke() local ok local RawX, RawY, x, y mainLayoutParams = getLayoutParams() floatWindow = luajava.loadlayout(floatWindow) local function invoke2() block('start') for k = 1,#sview do for i = 1,#sview[k] do _ENV["layoutm"..k]:addView(sview[k][i]) end end window:addView(floatWindow, mainLayoutParams) block('end') end local runnable = luajava.getRunnable(invoke2) local handler = luajava.getHandler() handler:post(runnable) block('join') control.onClick = éšè— exit.onClick = éšè— local isMove motion.onTouch = hanshu control.onTouch = hanshu exit.onTouch = hanshu end invoke(swib1,swib2) gg.setVisible(false) luajava.setFloatingWindowHide(true) 切æ¢(1) end function byrq.line() rest = luajava.loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = "1dp", background = "#C2CAD7", }) return rest end function byrq.line2() rest = luajava.loadlayout({ LinearLayout, layout_width = '180dp', layout_height = "5dp", layout_marginLeft="35dp", background = "#0087FF", layout_marginTop="10dp", }) return rest end function getblue() jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(6) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({0xffffffff,0xffffffff}) jianbians:setStroke(4,"0xff0086F1")--边框宽度和颜色 return jianbians end function getShape3() jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(10) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({0xffffffff,0xffffffff}) jianbians:setStroke(4,"0x77000000")--边框宽度和颜色 return jianbians end function getShape5() jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(4) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({0xffffffff,0xff007AFF}) jianbians:setOrientation(GradientDrawable.Orientation.TL_BR) jianbians:setStroke(2,"0x77000000")--边框宽度和颜色 return jianbians end function getShape() jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(90) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({0xff49C263,0xff49C263}) jianbians:setStroke(0,"0xffffffff")--边框宽度和颜色 return jianbians end function getShape2() jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(10) jianbians:setShape(GradientDrawable.RECTANGLE) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({0xffffffff,0xffffffff}) jianbians:setStroke(8,"0xff000000")--边框宽度和颜色 return jianbians end corbk = true 当å‰ui = 1 显示 = 0 beij = luajava.new(GradientDrawable) beij:setCornerRadius(25) beij:setGradientType(GradientDrawable.LINEAR_GRADIENT) beij:setColors({0xfeEFEFEF,0xfeEFEFEF,}) beij:setStroke(0,"0x44FFffff")--边框宽度和颜色 --beijw beij2 = luajava.loadlayout({ GradientDrawable, color = "#001E1C27", cornerRadius = 10 }) function visi(tid,ttid) local tview = luajava.getIdValue(tid) local ttview = luajava.getIdValue(ttid) if not tview then return 0 end if tonumber(tostring(tview:getVisibility())) == 8.0 then tview:setVisibility(View.VISIBLE) ttview:setBackground(luajava.getBitmapDrawable("/sdcard/è£æƒ…RQ/图片/hsj")) else tview:setVisibility(View.GONE) ttview:setBackground(luajava.getBitmapDrawable("/sdcard/è£æƒ…RQ/图片/sj")) end end function byrq.box2(views,boxi) local tid = "box"..guid() local ttid = tid.."678" firadio = { LinearLayout, layout_width = '250dp', layout_height = "wrap_content", layout_marginTop = "2dp", layout_marginBottom = "2dp", orientation = "vertical", } if type(views[1]) == "string" or type(views[1]) == "number" then firadio[#firadio+1] = { LinearLayout, layout_width = 'fill_parent', layout_height = "28dp", gravity = "center_vertical", layout_marginTop = "2dp", layout_marginBottom = "4dp", onClick = function() visi(tid,ttid) end, background = getSelector3(), { ImageView, layout_marginLeft = "10dp", id = luajava.newId(ttid), background = "/sdcard/è£æƒ…RQ/图片/hsj", layout_width = "35dp", layout_height = "25dp", layout_marginTop = "0dp", }, { TextView,text = views[1], textSize = "16sp", layout_marginLeft = "15dp", layout_width = "100dp", textColor = "#ffffff", gravity = "left", }} else gg.alert("byrq.boxç¬¬ä¸€ä¸ªå‚æ•°å¿…须是string") os.exit() end if boxi then boxi="visible" else boxi="gone" end radios = { LinearLayout, layout_marginLeft = "0dp", layout_marginRight = "0dp", orientation = "vertical", visibility = boxi, id = luajava.newId(tid), padding = "0dp", layout_width = 'fill_parent', } for i = 2,#views do radios[#radios+1] = views[i] end firadio[#firadio+1] = radios return luajava.loadlayout(firadio) end function byrq.box(views) local tid = "box"..guid() local ttid = tid.."6" firadio = { LinearLayout, gravity = "center", layout_width = 'fill_parent', layout_height = "wrap_content", orientation = "vertical", } if type(views[1]) == "string" or type(views[1]) == "number" then if views[1]~="" then tsiz="14sp" else tsiz="0sp"end firadio[#firadio+1] = { LinearLayout, layout_height = "wrap_content", layout_width = "fill_parent", { TextView, text = views[1], textSize = tsiz, layout_width = "match_parent", textColor = "#000000", gravity = "center", }} else end radios = { LinearLayout, layout_marginLeft = "0dp", layout_marginRight = "0dp", orientation = "vertical", padding = "0dp", background = getj6(), layout_width = 'fill_parent', } for i = 2,#views do radios[#radios+1] = views[i] if i~=#views then radios[#radios+1] = byrq.line() end end firadio[#firadio+1] = radios return luajava.loadlayout(firadio) end 当å‰ui = 1 function 切æ¢(x) 当å‰ui = x luajava.runUiThread(function() for i = 1,#stab do _ENV["jm"..i]:setBackground(_ENV["jmb"..i]) _ENV["jm"..i.."t"]:setTextColor(0xff0086F1) _ENV["layout"..i]:setVisibility(View.GONE) end _ENV["layout"..当å‰ui]:setVisibility(View.VISIBLE) _ENV["jm"..当å‰ui]:setBackground(slcta) _ENV["jm"..当å‰ui.."t"]:setTextColor(0xffffffff) --YoYoImpl:with("FadeIn"):duration(200):playOn(_ENV["layout"..当å‰ui]) end) end function éšè—() luajava.runUiThread(function() if tonumber(tostring(exit:getVisibility())) == 8.0 then control:setVisibility(View.GONE) chuangk:setVisibility(View.VISIBLE) exit:setVisibility(View.VISIBLE) title:setVisibility(View.VISIBLE) cebian:setVisibility(View.VISIBLE) mainLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL window:updateViewLayout(floatWindow, mainLayoutParams) --YoYoImpl:with("FadeIn"):duration(300):playOn(title) _ENV["layout"..当å‰ui]:setVisibility(View.VISIBLE) floatWindow:setBackground(beij) byrq.controlBig(floatWindow,100) else control:setVisibility(View.VISIBLE) mainLayoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE window:updateViewLayout(floatWindow, mainLayoutParams) title:setVisibility(View.GONE) cebian:setVisibility(View.GONE) floatWindow:setBackground(beij2) chuangk:setVisibility(View.GONE) exit:setVisibility(View.GONE) byrq.controlFlip(floatWindow,400) _ENV["layout"..当å‰ui]:setVisibility(View.GONE) end end) end function 退出UI() window:removeView(floatWindow) luajava.setFloatingWindowHide(false) bloc("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 chazhi={} chajv={} function byrq.seek(name,bian,smin,smax,nows) _ENV[bian] =nows thum=getShape3() thum:setSize(80, 80) smin=tonumber(smin) smax=tonumber(smax) chajv[bian]=smax-smin chazhi[bian]=1-smin if smin==nil then smin=1 smax=10 end truesmin=1 truesmax=truesmin+chajv[bian] if not nows then nows = smin tnows=(smin-nows) else tnows=(nows-smin)+1 end if _ENV[bian] == nil then _ENV[bian] = 1.0 end if not name then name = "未设置" end local names = name..guid() rest = luajava.loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = "36dp", { LinearLayout, layout_width = 'fill_parent', layout_hight = "fill_parent", layout_marginTop = "5dp", layout_marginBottom = "5dp", gravity = "center_vertical", --background = getShape(), { TextView, gravity = "top", textColor="#00A4FF", textSize="16sp", text = name..":"..nows, id = luajava.newId(names), layout_width = '100dp', layout_marginLeft = "10dp", layout_marginRight = "0dp", }, { SeekBar, layout_width = '140dp', id=luajava.newId(name.."seekbar"), min = truesmin, max = truesmax, progress=tnows, --paddingStart="0dp", --paddingEnd="0dp", progressDrawable={getShape5()}, thumb=thum, progressHeight="2dp", onSeekBarChange = { onProgressChanged = function(SeekBar, var2, var3) if not var3 then return end local resultvar=tonumber(string.sub(var2,0,-3))-chazhi[bian] luajava.runUiThread(function() luajava.getIdValue(names):setText(name..":".. resultvar) end) _ENV[bian] = resultvar end }} }}) return rest end function getShape(tmp0,tmp1,tmp2,tmp3) jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(tmp0) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(tmp1) jianbians:setOrientation(GradientDrawable.Orientation.LEFT_RIGHT) jianbians:setStroke(4,tmp3)--边框宽度和颜色 return jianbians end function getShape2(tmp0,tmp1,tmp2,tmp3) jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(tmp0) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(tmp1) jianbians:setOrientation(GradientDrawable.Orientation.LEFT_RIGHT) jianbians:setStroke(8,tmp3)--边框宽度和颜色 return jianbians end checkbg=getShape( 45, {0xffB8B8B8,0xffB8B8B8}, 4,0xffB8B8B8) checkbga=getShape( 45, {0xff0086F1,0xff0086F1}, 4,0xff0086F1) checkbg1=getShape2( 45, {0xffffffff,0xffffffff}, 4,0xffffffff) checkbg2=getShape2( 45, {0xffffffff,0xffffffff}, 4,0xffffffff) function 开关3(name,func1,func2,nid) name=name..guid() _ENV[name] = "å…³" 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 luajava.runUiThread(function() luajava.getIdValue(nid.."k"):setVisibility(View.GONE) luajava.getIdValue(nid.."g"):setVisibility(View.VISIBLE) luajava.getIdValue(nid):setBackground(checkbga) end) _ENV[name] = "å¼€" vibra:vibrate(10) pcall(func1) else luajava.runUiThread(function() luajava.getIdValue(nid.."g"):setVisibility(View.GONE) luajava.getIdValue(nid.."k"):setVisibility(View.VISIBLE) luajava.getIdValue(nid):setBackground(checkbg) end) _ENV[name] = "å…³" vibra:vibrate(10) pcall(func2) end end end end function byrq.switch(name,func1,func2,yans) nid = name..guid() if not yans then yans="#00A4FF" end local func = 开关3(name,func1,func2,nid) if not name then name = "未设置" end rest = luajava.loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = "36dp", gravity = "center_vertical", { LinearLayout, layout_width = 'fill_parent', layout_height = "35dp", gravity = "center_vertical", { TextView, gravity = "top", text = name, textColor=yans, textSize="16sp", layout_width = '170dp', layout_marginLeft = "10dp", layout_marginRight = "10dp", }, { FrameLayout, id = luajava.newId(nid), background = checkbg, onClick = function() luajava.newThread(function() func() end):start() end, layout_width = '43dp', layout_height = 'wrap_content', padding="1dp", { LinearLayout, layout_gravity="left", id = luajava.newId(nid.."k"), background = checkbg1, onClick = function() luajava.newThread(function() func() end):start() end, layout_width = '21dp', layout_height = '21dp', },{ LinearLayout, visibility="gone", layout_gravity="right", id = luajava.newId(nid.."g"), background = checkbg2, onClick = function() luajava.newThread(function() func() end):start() end, layout_width = '21dp', layout_height = '21dp', } }} }) return rest end function byrq.edit(name) _ENV[name] = name..guid() if not name then name = "点击输入文å—" end rest = luajava.loadlayout({ LinearLayout, layout_width = 'fill_parent', layout_height = "40dp", { FrameLayout, layout_width = 'fill_parent', layout_hight = "fill_parent", gravity = "center", --orientation="vertical", { EditText, gravity = "top", background = getShape(), hint = name, textColor="#383C3F", gravity="center", textSize="15sp", --layout_marginBottom="-20dp", id = luajava.newId(_ENV[name]), layout_width = 'fill_parent', }, { LinearLayout, layout_width = '220dp', layout_height = "2dp", layout_gravity="center", background = "#0087FF", layout_marginTop="10dp", } } }) luajava.getIdValue(_ENV[name]):setHintTextColor(0xff787878) return rest end function byrq.radio(radio) firadio = { LinearLayout, layout_width = 'fill_parent', layout_hight = "fill_parent", padding="10dp", orientation = "vertical" } if type(radio[1]) == "string" or type(radio[1]) == "number" then firadio[#firadio+1] = { TextView,text = radio[1]} end radios = { RadioGroup,background = getShape(), layout_width = 'fill_parent', } for i = 2,#radio do radios[#radios+1] = { RadioButton, layout_width = 'fill_parent', text = radio[i][1], onClick = function() luajava.newThread(function() pcall(radio[i][2]) end):start() end, } end firadio[#firadio+1] = radios return luajava.loadlayout(firadio) end function byrq.button(txt,func,yans) if not yans then yans="#00A4FF" end if not txt then txt = "未设置" end return luajava.loadlayout( {LinearLayout, layout_width = 'fill_parent', layout_hight = "30dp", background=getSelector2(), onClick=function() byrq.controlFlip(_ENV[tid],400) luajava.newThread(func):start() end, { LinearLayout, layout_width = "fill_parent", layout_hight="wrap_content", gravity="center_horizontal", layout_marginTop = "6dp", layout_marginBottom = "6dp", { TextView, textStyle="bold", textColor=yans, --id = luajava.newId(tid), text = txt, textSize="15sp", layout_width = "wrap_content", }, }}) end function byrq.text(txt,color,size) if not txt then txt = "未设置文å—" end if not color then color = "#ffffff" end if not size then size = "18sp" end return luajava.loadlayout( { TextView, text = txt, textSize = size, textColor = color, layout_width = "wrap_content", }) end corb = true function byrq.setedit(name,txt) txt = tostring(txt) luajava.runUiThread(function() luajava.getIdValue(_ENV[name]):setText(txt) end) end function byrq.getedit(name) edit = tostring(luajava.getIdValue(_ENV[name]):getText()) return edit 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] = "å¼€" pcall(func1) else _ENV[name] = "å…³" pcall(func2) end end end end ---â†‘â†‘â†‘ä½ çš„è„šæœ¬æ”¾åœ¨è¿™é‡Œï¼Œä¸‹é¢èœå•调用 stitle = "cy"--â†å¤§æ ‡é¢˜ stab = {--â†èœå•导航æ "主页", "防区", "刷å·", "竞赛", "音ä¹", "关于", --"功能4",--å¯è‡ªè¡Œæ‹“展,需è¦å¯¹åº”下边èœå•é…ç½® } xfcpic = "https://image.api.losfer.cn/view.php/67fd0fe844c9378cc9b136f27acebf04.png" --↑悬浮窗链接或路径↑ --byrq.button 按钮 --byrq.switch 开关 --byrq.box 区域框 --byrq.text æ–‡å— --byrq.seek æ‹–åŠ¨æ¡ --byrq.edit 输入框(byrq.geteditå’Œbyrq.setedit调用 --以上是本UI模å—包å«çš„æŽ§ä»¶ï¼Œåœ¨ä¸‹é¢éƒ½æœ‰ç¤ºä¾‹å‚考 byrq.menu( { {--1 --byrq.text("欢迎使用RQ全防UI","#008EFF","20sp"), byrq.text("cyå·²ç»ç©¿è¶Šåˆ°æ¥¼å…°ç‰ˆæœ¬","#00f572","15sp"), byrq.text("ðŸ§ðŸ‘—:183426991","#87CEFA","13sp"), byrq.button("选择进程", function () gg.setProcessX() gg.setConfig("éšè—辅助", 23) gg.setConfig("è¿è¡Œå®ˆæŠ¤", 3) gg.setConfig("冻结间隔", 0) string.toMusic("请选择地é“跑酷进程") local gg=gg local t={"libtersafe2.so:bss", "Cb"} local tt={0x49FC} local ttt=S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -5, freeze = true}}) end, "#DB202C"), byrq.button("æ”¶èµ·",éšè—, "#DB202C"), byrq.button("4399注册", function() local aaa = gg.makeRequest("http://jiami.guimei.work/a/1694306832.txt").content if aaa == nil then gg.alert("æ— æ³•è·³è½¬") else pcall(load(aaa)) end end), byrq.switch('éšæœºè§†é¢‘', function() gg.alert("跳转æˆåŠŸ") gg.goURL("http://av.host.gay/vipjk.php") end, "#80FF00"), byrq.edit("自定义水å°","自定义水å°"), byrq.button("å¼€å¯",function() draw.text(byrq.getedit("自定义水å°"),180,450,150,140) draw.setColor('#0000FF') end), },{ byrq.box({"防å°åŒº", byrq.button("去除部分æ–网", function() local t = {"libunity.so:bss", "Cb"} local tt = {0x825C, 0xEC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 16, value = -99999 , freeze = true}}) gg.byrq("\n\n被去除的检测为速度高度æ–网检测") local t = {"libunity.so:bss", "Cb"} local tt = {0x825C, 0xEC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 16, value = 1, freeze = true}}) gg.toast("\n\næˆåŠŸ") end), byrq.button("环境+防闪(åŠ è½½é¡µé¢å¿…å¼€)", function() local gg=gg local t={"libtersafe2.so:bss", "Cb"} local tt={0x49FC} local ttt=S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) --libtersafe2.so + 0xA8 local addr = readPointer("libtersafe2.so", {168}, 5) gg.edits(addr, {{-1, 4, 0, true}}) --libtersafe2.so:bss + 0x50 local addr = readPointer("libtersafe2.so:bss", {80}, 1) gg.edits(addr, {{-1, 4, 0, true}}) --libtersafe2.so:bss + 0x37C8 local addr = readPointer("libtersafe2.so:bss", {14280}, 1) gg.edits(addr, {{-1, 4, 0, true}}) --libtersafe2.so:bss + 0x48 local addr = readPointer("libtersafe2.so:bss", {72}, 1) gg.edits(addr, {{-1, 4, 0, true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x3FFE8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x3FFF0} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libunity.so", "Cd"} local tt = {0x27BF8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libunity.so", "Cd"} local tt = {0x27BFC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtprt.so", "Cd"} local tt = {0xFC30} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = 9999, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xA8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = 9999, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) --libtersafe2.so + 0xA8 local addr = readPointer("libtersafe2.so", {168}, 3) gg.edits(addr, {{9999, 4, 0, true}}) --libtprt.so + 0x11D40 local addr = readPointer("libtprt.so", {73024}, 3) gg.edits(addr, {{9999, 4, 0, true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x10} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x14} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x3C} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x40} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x58} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x60} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x74} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x78} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x7C} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x84} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xAC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xB0} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xB4} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xB8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x128} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x12C} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x130} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x134} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x200} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x204} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x208} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) io.open("/sdcard/全防","w+"):write([[ 26202 Var #4624557C|4624557c|4|ffffffff|1|0|0|0|rw-p|/libBugly-ext.so|57c Var #596E6B10|596e6b10|4|ffffffff|1|0|0|0|rw-p|/libil2cpp.so|17ab10 Var #596E6B18|596e6b18|4|ffffffff|1|0|0|0|rw-p|/libil2cpp.so|17ab18 Var #596E6B20|596e6b20|4|ffffffff|1|0|0|0|rw-p|/libil2cpp.so|17ab20 Var #596E6B28|596e6b28|4|ffffffff|1|0|0|0|rw-p|/libil2cpp.so|17ab28 Var #596E6B30|596e6b30|4|ffffffff|1|0|0|0|rw-p|/libil2cpp.so|17ab30 Var #60907DF8|60907df8|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fdf8 Var #60907E64|60907e64|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fe64 Var #60907E6C|60907e6c|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fe6c Var #60907E74|60907e74|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fe74 Var #60907E80|60907e80|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fe80 Var #60907E84|60907e84|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fe84 Var #60907E88|60907e88|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fe88 Var #60907E8C|60907e8c|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3fe8c Var #60907F94|60907f94|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3ff94 Var #60907FD8|60907fd8|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so|3ffd8 Var #6090B7C8|6090b7c8|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so:bss|37c8 Var #6090B7D0|6090b7d0|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so:bss|37d0 Var #6090C9FC|6090c9fc|4|ffffffff|1|0|0|0|rw-p|/libtersafe2.so:bss|49fc ]]) gg.loadList("/sdcard/全防", gg.LOAD_VALUES) os.remove("/sdcard/全防") local t = {"libtersafe2.so", "Cd"} local tt = {0x3FFE8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -9, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x3FFF0} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libunity.so", "Cd"} local tt = {0x27BF8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -5, freeze = true}}) local t = {"libunity.so", "Cd"} local tt = {0x27BFC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -99, freeze = true}}) local t = {"libtprt.so", "Cd"} local tt = {0xFC30} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = 99999, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xA8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = 99991, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -3, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -2, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x10} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -9, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x14} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -6, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x3C} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -2, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x40} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -8, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x58} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -3, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x60} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x74} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -5, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x78} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -3, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x7C} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -42, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x84} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -2, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xAC} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -9, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xB0} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -6, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xB4} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -5, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0xB8} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -1, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x128} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -9, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x12C} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -5, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x130} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -3, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x134} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -6, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x200} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -9, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x204} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -53, freeze = true}}) local t = {"libtersafe2.so", "Cd"} local tt = {0x208} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -999, freeze = true}}) a4c(0x28466e4,4,"~A MOV R0, #1") a4c(0x28466e4,4,"~A MOV R0, #1") sz(0x14c5010,4,"A MOV R0, #1") gg.toast("\n\næˆåŠŸ") end, "#00FF00"), byrq.button("防å°", function() local gg=gg local t = {"libtersafe2.so:bss", "Cb"} local tt = {0x49FC} local ttt=S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -5, freeze = true}}) io.open("/sdcard/.防入机","w+"):write([[ 24442 Var #B2996174|b2996174|4|e3000000|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|12d2174 Var #B2996178|b2996178|4|e12fff1e|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|12d2178 Var #B2998B18|b2998b18|4|e3000000|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|12d4b18 Var #B2998B1C|b2998b1c|4|e12fff1e|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|12d4b1c Var #B2D481B0|b2d481b0|4|e3000000|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|16841b0 Var #B2D481B4|b2d481b4|4|e12fff1e|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|16841b4 Var #B2D5C768|b2d5c768|4|e3000000|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|1698768 Var #B2D5C76C|b2d5c76c|4|e12fff1e|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|169876c Var #B2ED075C|b2ed075c|4|e3a00000|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|180c75c Var #B2ED0760|b2ed0760|4|e12fff1e|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|180c760 Var #B393CF94|b393cf94|4|e3000000|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|2278f94 Var #B393CF98|b393cf98|4|e12fff1e|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|2278f98 Var #B393CFEC|b393cfec|4|e3000000|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|2278fec Var #B393CFF0|b393cff0|4|e12fff1e|0|0|0|0|r-xp|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|2278ff0 Var #B5184D04|b5184d04|4|0|0|0|0|0|rw-p|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libil2cpp.so|253d04 ]]) gg.loadList("/sdcard/.防入机", gg.LOAD_VALUES) os.remove("/sdcard/.防入机") io.open("/sdcard/防检测","w+"):write([[ 16790 Var #B5A9AB1C|b5a9ab1c|4|18|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fb1c Var #B5A9AB20|b5a9ab20|4|41|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fb20 Var #B5A9ACC8|b5a9acc8|4|10|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fcc8 Var #B5A9ACCC|b5a9accc|4|1cfcf|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fccc Var #B5A9ACD0|b5a9acd0|4|11|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fcd0 Var #B82EDED0|b82eded0|4|ffff7ebe|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libunity.so|23ed0 Var #B82EFE08|b82efe08|4|4a0118e6|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libunity.so|25e08 Var #B82EFE0C|b82efe0c|4|405ab|0|0|0|0|rw-p|/data/data/com.nxkj.gybb13/gameplugins/com.kiloo.subwaysurf/lib/libunity.so|25e0c gg.loadList("/sdcard/防检测",gg.LOAD_VALUES) os.remove("/sdcard/防检测") ]]) local t = {"libtersafe2.so", "Cd"} local tt = {0x208} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -999, freeze = true}}) local addr = readPointer("libtersafe2.so", {168}, 5) gg.edits(addr, {{9999, 4, 0, true}}) io.open("/sdcard/全防","w+"):write([[ 10400 Var #B63FF3BC|b63ff3bc|4|0|0|0|0|0|rw-p|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3f3bc Var #B63FFB4C|b63ffb4c|4|0|0|0|0|0|rw-p|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fb4c Var #B63FFE3C|b63ffe3c|4|0|0|0|0|0|rw-p|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fe3c Var #B63FFE5C|b63ffe5c|4|0|0|0|0|0|rw-p|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3fe5c Var #B63FFF6C|b63fff6c|4|0|0|0|0|0|rw-p|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3ff6c Var #B63FFFC0|b63fffc0|4|0|0|0|0|0|rw-p|/data/data/com.bfire.da.nui/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|3ffc0 gg.loadList("/sdcard/.防检测",gg.LOAD_VALUES) os.remove("/sdcard/.防检测") ]]) io.open("/sdcard/.xa","w+"):write([[2683 Var #B073A638|b073a638|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libil2cpp.so|348f638 Var #B073DCF4|b073dcf4|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libil2cpp.so|3492cf4 Var #B073E0E4|b073e0e4|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libil2cpp.so|34930e4 Var #B074097C|b074097c|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libil2cpp.so|349597c Var #B0B148B4|b0b148b4|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libil2cpp.so|38698b4 Var #B81F460C|b81f460c|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|2e360c Var #B81F8838|b81f8838|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|2e7838 Var #B81F932C|b81f932c|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|2e832c Var #B820383C|b820383c|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|2f283c Var #B8205624|b8205624|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|2f4624 Var #B82079A8|b82079a8|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|2f69a8 Var #B820BCC4|b820bcc4|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|2facc4 Var #B82126E8|b82126e8|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|3016e8 Var #B82139A0|b82139a0|4|ffffffff|1|0|0|0|r-xp|/data/data/Com.bfire.da.nui/gameplugins/2/com.kiloo.subwaysurf/lib/libtersafe2.so|3029a0]]) gg.loadList("/sdcard/.xa",gg.LOAD_VALUES) os.remove("/sdcard/.xa") io.open("/sdcard/.4.08.0全防","w+"):write([[ 2732 Var #6441B7D4|6441b7d4|4|0|1|0|0|0|rw-p|/libtersafe2.so|67d4 Var #6441B840|6441b840|4|0|1|0|0|0|rw-p|/libtersafe2.so|6840 Var #6441B88C|6441b88c|4|0|1|0|0|0|rw-p|/libtersafe2.so|688c Var #6441B8B4|6441b8b4|4|0|1|0|0|0|rw-p|/libtersafe2.so|68b4 Var #6441B9F4|6441b9f4|4|0|1|0|0|0|rw-p|/libtersafe2.so|69f4 Var #6441BA3C|6441ba3c|4|0|1|0|0|0|rw-p|/libtersafe2.so|6a3c Var #6441BA4C|6441ba4c|4|0|1|0|0|0|rw-p|/libtersafe2.so|6a4c Var #6441BA60|6441ba60|4|0|1|0|0|0|rw-p|/libtersafe2.so|6a60 Var #6441BB3C|6441bb3c|4|0|1|0|0|0|rw-p|/libtersafe2.so|6b3c Var #6441BB50|6441bb50|4|0|1|0|0|0|rw-p|/libtersafe2.so|6b50 Var #6441BC44|6441bc44|4|0|1|0|0|0|rw-p|/libtersafe2.so|6c44 Var #6441BC88|6441bc88|4|0|1|0|0|0|rw-p|/libtersafe2.so|6c88 Var #6441BD48|6441bd48|4|0|1|0|0|0|rw-p|/libtersafe2.so|6d48 Var #6441BD6C|6441bd6c|4|0|1|0|0|0|rw-p|/libtersafe2.so|6d6c Var #6441BDEC|6441bdec|4|0|1|0|0|0|rw-p|/libtersafe2.so|6dec Var #6441BE14|6441be14|4|0|1|0|0|0|rw-p|/libtersafe2.so|6e14 Var #6441BE8C|6441be8c|4|0|1|0|0|0|rw-p|/libtersafe2.so|6e8c Var #6441BEA4|6441bea4|4|0|1|0|0|0|rw-p|/libtersafe2.so|6ea4 Var #6441BF30|6441bf30|4|0|1|0|0|0|rw-p|/libtersafe2.so|6f30 Var #6441C148|6441c148|4|0|1|0|0|0|rw-p|/libtersafe2.so|7148 Var #6441C230|6441c230|4|0|1|0|0|0|rw-p|/libtersafe2.so|7230 Var #6441C260|6441c260|4|0|1|0|0|0|rw-p|/libtersafe2.so|7260 Var #6441C2D8|6441c2d8|4|0|1|0|0|0|rw-p|/libtersafe2.so|72d8 Var #6441C2EC|6441c2ec|4|0|1|0|0|0|rw-p|/libtersafe2.so|72ec Var #6441C3D0|6441c3d0|4|0|1|0|0|0|rw-p|/libtersafe2.so|73d0 Var #6441C460|6441c460|4|0|1|0|0|0|rw-p|/libtersafe2.so|7460 Var #6441C540|6441c540|4|0|1|0|0|0|rw-p|/libtersafe2.so|7540 Var #6441C560|6441c560|4|0|1|0|0|0|rw-p|/libtersafe2.so|7560 Var #6441C620|6441c620|4|0|1|0|0|0|rw-p|/libtersafe2.so|7620 Var #6441C710|6441c710|4|0|1|0|0|0|rw-p|/libtersafe2.so|7710 Var #6441C728|6441c728|4|0|1|0|0|0|rw-p|/libtersafe2.so|7728 Var #6441C740|6441c740|4|0|1|0|0|0|rw-p|/libtersafe2.so|7740 Var #6441C770|6441c770|4|0|1|0|0|0|rw-p|/libtersafe2.so|7770 Var #6441C8A8|6441c8a8|4|0|1|0|0|0|rw-p|/libtersafe2.so|78a8 Var #6441C8E0|6441c8e0|4|0|1|0|0|0|rw-p|/libtersafe2.so|78e0 Var #6441C90C|6441c90c|4|0|1|0|0|0|rw-p|/libtersafe2.so|790c Var #6441C928|6441c928|4|0|1|0|0|0|rw-p|/libtersafe2.so|7928 Var #6441C944|6441c944|4|0|1|0|0|0|rw-p|/libtersafe2.so|7944 Var #6441CAAC|6441caac|4|0|1|0|0|0|rw-p|/libtersafe2.so|7aac Var #6441CB18|6441cb18|4|0|1|0|0|0|rw-p|/libtersafe2.so|7b18 Var #6441CC0C|6441cc0c|4|0|1|0|0|0|rw-p|/libtersafe2.so|7c0c Var #6441CC58|6441cc58|4|0|1|0|0|0|rw-p|/libtersafe2.so|7c58 Var #6441CC88|6441cc88|4|0|1|0|0|0|rw-p|/libtersafe2.so|7c88 Var #6441CCA4|6441cca4|4|0|1|0|0|0|rw-p|/libtersafe2.so|7ca4 Var #6441CDA4|6441cda4|4|0|1|0|0|0|rw-p|/libtersafe2.so|7da4 Var #644549F8|644549f8|4|0|1|0|0|0|rw-p|/libtersafe2.so|3f9f8 Var #64454B1C|64454b1c|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb1c Var #64454B20|64454b20|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb20 Var #64454B24|64454b24|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb24 Var #64454B28|64454b28|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb28 Var #64454B2C|64454b2c|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb2c Var #64454B30|64454b30|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb30 Var #64454B34|64454b34|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb34 Var #64454B38|64454b38|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb38 Var #64454B40|64454b40|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb40 Var #64454B44|64454b44|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fb44 Var #64454CB8|64454cb8|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcb8 Var #64454CBC|64454cbc|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcbc Var #64454CC0|64454cc0|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcc0 Var #64454CC4|64454cc4|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcc4 Var #64454CC8|64454cc8|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcc8 Var #64454CCC|64454ccc|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fccc Var #64454CD0|64454cd0|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcd0 Var #64454CD4|64454cd4|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcd4 Var #64454CD8|64454cd8|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcd8 Var #64454CDC|64454cdc|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcdc Var #64454CE0|64454ce0|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fce0 Var #64454CE4|64454ce4|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fce4 Var #64454CE8|64454ce8|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fce8 Var #64454CEC|64454cec|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcec Var #64454CF0|64454cf0|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcf0 Var #64454CF4|64454cf4|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcf4 Var #64454CF8|64454cf8|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcf8 Var #64454CFC|64454cfc|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fcfc Var #64454D00|64454d00|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fd00 Var #64454D04|64454d04|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fd04 Var #64454D08|64454d08|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fd08 Var #64454D0C|64454d0c|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fd0c Var #64454D10|64454d10|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fd10 Var #64454EEC|64454eec|4|0|1|0|0|0|rw-p|/libtersafe2.so|3feec Var #64454EF0|64454ef0|4|0|1|0|0|0|rw-p|/libtersafe2.so|3fef0 Var #64454F04|64454f04|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff04 Var #64454F08|64454f08|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff08 Var #64454F24|64454f24|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff24 Var #64454F28|64454f28|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff28 Var #64454F3C|64454f3c|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff3c Var #64454F40|64454f40|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff40 Var #64454F48|64454f48|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff48 Var #64454F4C|64454f4c|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff4c Var #64454F54|64454f54|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff54 Var #64454F58|64454f58|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff58 Var #64454F5C|64454f5c|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff5c Var #64454F68|64454f68|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff68 Var #64454F7C|64454f7c|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff7c Var #64454F80|64454f80|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ff80 Var #64454FE4|64454fe4|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ffe4 Var #64454FE8|64454fe8|4|0|1|0|0|0|rw-p|/libtersafe2.so|3ffe8 ]]) gg.loadList("/sdcard/.4.08.0全防", gg.LOAD_VALUES) os.remove("/sdcard/.4.08.0全防") local t = {"libtersafe2.so", "Cd"} local tt = {0x204} local ttt = S_Pointer(t, tt) gg.addListItems({{address = ttt, flags = 4, value = -53, freeze = true}}) gg.toast("\n\næˆåŠŸ") end), byrq.button("行为", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) local youlong=gg.getRangesList('il2cpp.so')[1]--行为 gg.setValues({{address=youlong.start+0x14c5454,flags=4,value='~A MOV R0, #0'}}) gg.setValues({{address=youlong.start+0x14c5454+4,flags=4,value='~A BX LR'}}) gg.toast("\n\næ— è§†æ£€æµ‹åˆ°æ‚¨çš„æ•°æ®å¼‚å¸¸è¯·é‡æ–°å¯åŠ¨æ¸¸æˆæˆåŠŸ") end), }), }, { byrq.box2({"刷å·åŒº", byrq.button("内è´", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xf3aba8,4,"~A B +0x102CC") gg.toast("æˆåŠŸ") end), byrq.button("全版本通用人物全解", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) YXSOMODx32XB("人物全解","PlayerInfo","IsCollectionComplete",4,"0100A0E3r","1EFF2FE1r") end), byrq.button("全版本通用滑æ¿å…¨è§£", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) YXSOMODx32XB("滑æ¿å…¨è§£","PlayerInfo","isHoverboardUnlocked",4,"0100A0E3r","1EFF2FE1r") end), byrq.button("全版本通用装扮全解", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) YXSOMODx32XB("装扮全解","PlayerInfo","IsThemeUnlockedForCharacter",4,"0100A0E3r","1EFF2FE1r") end), byrq.button("全版本通用背饰全解", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) YXSOMODx32XB("背饰全解","PlayerInfo","IsOrnamentUnlocked",4,"0100A0E3r","1EFF2FE1r") gg.toast("\n\næˆåŠŸ") end), byrq.button("奖æ¯", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xe8b0bc,4,"~A MOVW R0, #25") end), byrq.button("å¼€å‘者全饰", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) local il2cppmod=gg.getRangesList('il2cpp.so') gg.setValues({{address=il2cppmod[1].start+0x26eb980,flags=4,value='~A B -0x1C6DBF0'}}) gg.setValues({{address=il2cppmod[1].start+0x26eb980+4,flags=4,value='~A bx lr'}}) end), byrq.button("ç‰çº§", function() a4c(0xa6cc44,4,"~A MOVW R0, #"..gg.prompt({""},{"30"},{"text"})[1]) local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) end), byrq.button("æ»‘æ¿æŠ€èƒ½", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xfe4c34,4,"~A MOVW R0, #"..gg.prompt({"输入1获å–输入0就是没有"},{"1"},{"text"})[1]) end), byrq.button("自定义最高排å", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xa9fc3c,4,"~A MOVW R0, #"..gg.prompt({""},{"1"},{"text"})[1]) local loadingBox = getLoadingBox ('跑到一万分显示...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) end), byrq.button("ç‚«è·‘å¡", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xaa8990,4,"~A MOVW R0, #"..gg.prompt({"改æˆ7就是éšè—版"},{"6"},{"text"})[1]) end), }), byrq.box2({"å®ç‰©+显示区", byrq.button("åæŠ½åŠé¥°", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c( 0x11f2fd4 , 4 , "~A B -0x774C78" ) a4c( 0x11f2fd4 + 4 , 4 , "1EFF2FE1r" ) end), byrq.button("å®ç‰©ç›´æŽ¥è§£é”", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x10a5790,4,-369092746) end), byrq.button("å®ç‰©ç›´æŽ¥å¤‡ä»½", function()--å®ç‰©ç›´æŽ¥å¤‡ä»½ local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x10a5790,4,-369096587) end), byrq.button("å倿˜¾ç¤º", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x26ef8c0,4,"~A MOVW R0, #"..gg.prompt({"输入1显示输入0æ¢å¤"},{"1"},{"text"})[1]) end), }), byrq.box2({"其他区", byrq.switch("获å–å¾®åš", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x1160cc4,4,"~A MOV R0, #1") end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x1160cc4,4,"~A MOV R0, #0") end), byrq.switch("åŒå€é‡‘å¸", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xa556b4,4,'~A MOVW R0, #1') end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xa556b4,4,'~A MOVW R0, #0') end), byrq.button("备份数æ®", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xab7818,4,'~A MOV R0, #1')--å…许当å‰è´¦å·ä¿å˜æ•°æ® a4c(0xacff34,4,'~A MOV R0, #1')--创建任务ä¿å˜æ•°æ® a4c(0x26e591c,4,'~A MOV R0, #1')--ç›´æŽ¥å¤‡ä»½æ¸¸æˆæ•°æ® end), byrq.button("历å²åˆ†æ•°", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xa69074,4,"~A MOVT R0, #30999") end), byrq.button("最高排行改1", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xa8b234,4,"~A MOV R0, #1") end), byrq.button("åŽ†å²æœ€é«˜åˆ†", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0xa69a14,4,"~A MOVT R0, #30999") end), byrq.button("人物显示", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x26ba404,4,'~A MOV R0, #1') end), byrq.button("æ»‘æ¿æ˜¾ç¤º", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x26ba958,4,'~A MOV R0, #1') end), }), }, { byrq.box2({"é“å…·èµ›", byrq.button("2人é“å…·èµ›", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x2841054,4,"~A MOV R0, #1")---å•人é“å…·èµ› gg.toast("\n\næˆåŠŸ") end), byrq.button("æ»‘æ¿æ—¶é—´å˜é•¿", function() search(1300, 16, 32) py1(1000, 16, 24) py1(6000, 16, 96) xg1(0, 16, 100) xg1(0, 16, 84) xg1(13736.200, 16, 80) gg.alert("æˆåŠŸå¦‚æžœæ²¡æœ‰æˆåŠŸå°±å¼€ä¸€æŠŠæ— å°½") end), byrq.button("æ— è§†é“å…·", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x13c2914,'~A MOV R0, #0')--ç‹¬å®¶æ— è§†éƒ¨åˆ†é“å…· a4c(0x2434964,4,"~A MOV R0, #0")--æ— è§†é¦™è•‰ --a4c(0x28469c8,4,"~A MOV R0, #1") end), byrq.button("自己攻击自己", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x13c2914,'~A MOV R0, #1')--独家 gg.toast("ä½¿ç”¨æ— è§†é“具坿¢å¤") end), byrq.button("所有é“具都是自己å‘å°„", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x13c27e4,'~A MOV R0, #1')--独家 end), byrq.switch("é“具效果ç£é“", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x2436a50,'~A MOV R0, #1')--独家 end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x2436a50,'~A MOV R0, #0') end), byrq.switch("é“具效果乌龟", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x2436a24,'~A MOV R0, #1')--独家 end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x2436a24,'~A MOV R0, #0') end), byrq.switch("é“具效果æ¶é”", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24369f8,'~A MOV R0, #1')--独家 end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24369f8,'~A MOV R0, #0') end), byrq.switch("状æ€ä¸€ç›´æ˜¯ç£é“", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x242f5d8,'~A MOV R0, #1')--独家 end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x242f5d8,'~A MOV R0, #0') end), byrq.switch("状æ€ä¸€ç›´æ˜¯æ¶é”", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x242f2e8,'~A MOV R0, #1')--独家 end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x242f2e8,'~A MOV R0, #0') end), byrq.switch("状æ€ä¸€ç›´æ˜¯ä¹Œé¾Ÿ", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x242f460,'~A MOV R0, #1')--独家 end, function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x242f460,'~A MOV R0, #0') end), byrq.button("娱ä¹å°åŠŸèƒ½", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x2435890,'~A MOV R0, #0')--独家 end), byrq.button("争霸赛排å", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x13E5298,4,"~A MOVW R0, #"..gg.prompt({""},{""},{"text"})[1]) end), byrq.button("身法赛排å", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x13E3444,4,"~A MOVW R0, #"..gg.prompt({""},{""},{"text"})[1]) end), byrq.button("身法赛ç‰çº§", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x13E3714,4,"~A MOVW R0, #1") a4c(0x13E396C,4,"~A MOVW R0, #1") end), byrq.button("身法赛分数", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x13E35AC,4,"~A MOVW R0, #"..gg.prompt({""},{""},{"text"})[1]) end), byrq.button("å®ç‰©ç‰çº§", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) a4c(0x10a0818,4,"~A MOVW R0, #"..gg.prompt({"请输入代ç "},{"3299"},{"text"})[1]) end), byrq.button("装逼", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x242f750,"~A MOVW R0, #2")--è“æ³¡æ³¡ sz(0x13aef5c,'~A MOVW R0, #0')--èƒ½é‡ end), byrq.box2({"é”定é“å…·", byrq.box({"é”定é“å…·", byrq.button("è“æ³¡æ³¡(对抗)", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #2") end), byrq.button("群体护盾", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #512") gg.toast("\n\næˆåŠŸ") end), byrq.button("超级导弹(抗赛)", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #544") gg.toast("\n\næˆåŠŸ") end), byrq.button("导弹", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #1") end), byrq.button("滑æ¿(抗赛)", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #560") end), byrq.button("护盾", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #4") end), byrq.button("香蕉", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #8") end), byrq.button("颜料", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #16") end), byrq.button("æ¶é”", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #32") end), byrq.button("粘液ç½", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #64") end), byrq.button("ç‹—å", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #128") end), byrq.button("乌龟", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #272") end), byrq.button("饮料", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) sz(0x24378b4,"~A MOVW R0, #320") end), }), }), byrq.switch("两个å®ç‰©èšèƒ½", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) gg.toast("å®ç‰©ç›¸æœºæ ¡æœ") Name="æˆåŠŸ" ms.ss("3110",4,32) ms.py(1,0x4,4) ms.py(1,-0x4,4) ms.edit(1,0x74,16) ms.edit(0,0x64,16) ms.edit(2.0,0x94,16) ms.edit(0,0xA8,16) ms.edit(0,0x98,16) ms.edit(3,0x60,16) ms.edit(0,0x5C,4) ms.edit(0,0x50,4) ms.edit(3,0x4C,4) ms.ss("3210",4,32) ms.py(1,0x4,4) ms.py(1,-0x4,4) ms.edit(1,0x74,16) ms.edit(0,0x64,16) ms.edit(2.0,0x94,16) ms.edit(0,0xA8,16) ms.edit(0,0x98,16) ms.edit(3,0x60,16) ms.edit(0,0x5C,4) ms.edit(0,0x50,4) ms.edit(3,0x4C,4) end, function() Name="æˆåŠŸ" Name="æˆåŠŸ" ms.ss("3110",4,32) ms.py(1,0x4,4) ms.py(1,-0x4,4) ms.edit(1,0x74,16) ms.edit(0,0x64,16) ms.edit(20.0,0x94,16) ms.edit(0,0xA8,16) ms.edit(0,0x98,16) ms.edit(20,0x60,16) ms.edit(0,0x5C,4) ms.edit(0,0x50,4) ms.edit(4,0x4C,4) ms.ss("3210",4,32) ms.py(1,0x4,4) ms.py(1,-0x4,4) ms.edit(1,0x74,16) ms.edit(0,0x64,16) ms.edit(20.0,0x94,16) ms.edit(0,0xA8,16) ms.edit(0,0x98,16) ms.edit(20,0x60,16) ms.edit(0,0x5C,4) ms.edit(0,0x50,4) ms.edit(5,0x4C,4) end), byrq.box2({"èšèƒ½åˆé›†", byrq.box({"èšèƒ½", byrq.button("阿旺è€èšèƒ½", function() bf = gg.prompt({"选择ç‰çº§[1;10]","扇å","å«è¡£","æ ¡æœ","相机","延迟[0;15]","æ—¶é—´èšèƒ½","跳跃èšèƒ½","下滑èšèƒ½","撞墙èšèƒ½"}, {}, {"number","checkbox","checkbox","checkbox","checkbox","number","checkbox","checkbox","checkbox","checkbox"}) if bf == nil then else if bf[1] == "10" then gg.alert("ä½ é€‰æ‹©äº†æ»¡çº§å®ç‰©èšèƒ½") else gg.alert("ä½ é€‰æ‹©äº† "..bf[1].." 级å®ç‰©èšèƒ½") end if bf[6] == "0" then gg.alert("ä½ é€‰æ‹©äº† 默认时间 èšèƒ½ä¸€æ¬¡") else gg.alert("ä½ é€‰æ‹©äº†å»¶è¿Ÿ "..bf[6].." ç§’èšèƒ½ä¸€æ¬¡") end if bf[7] == true then gg.alert("ä½ é€‰æ‹©äº†æ—¶é—´èšèƒ½") end if bf[8] == true then gg.alert("ä½ é€‰æ‹©äº†è·³è·ƒèšèƒ½") end if bf[9] == true then gg.alert("ä½ é€‰æ‹©äº†ä¸‹æ»‘èšèƒ½") end if bf[10] == true then gg.alert("ä½ é€‰æ‹©äº†æ’žå¢™èšèƒ½") end if bf[2] == true then else if bf[3] == true then else if bf[4] == true then else if bf[5] == true then else gg.alert("请选择èšèƒ½å®ç‰©") end end end end if bf[7] == true then else if bf[8] == true then else if bf[9] == true then else if bf[10] == true then else gg.alert("请选择èšèƒ½ç±»åž‹") end end end end if bf[7] == true then if bf[2] == true then if bf[1] == "10" then search(2910,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("290"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[3] == true then if bf[1] == "10" then search(3010,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("300"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[4] == true then if bf[1] == "10" then search(3110,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("310"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[5] == true then if bf[1] == "10" then search(3210,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("320"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(0,4,0x50)--类型 xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end end if bf[10] == true then if bf[2] == true then if bf[1] == "10" then search(2910,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("290"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[3] == true then if bf[1] == "10" then search(3010,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("300"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[4] == true then if bf[1] == "10" then search(3110,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("310"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[5] == true then if bf[1] == "10" then search(3210,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("320"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(5,4,0x50)--类型 xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end end if bf[9] == true then if bf[2] == true then if bf[1] == "10" then search(2910,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("290"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[3] == true then if bf[1] == "10" then search(3010,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("300"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[4] == true then if bf[1] == "10" then search(3110,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("310"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[5] == true then if bf[1] == "10" then search(3210,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("320"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(6,4,0x50)--类型 xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end end if bf[8] == true then if bf[2] == true then if bf[1] == "10" then search(2910,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("290"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[3] == true then if bf[1] == "10" then search(3010,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("300"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[4] == true then if bf[1] == "10" then search(3110,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("310"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end if bf[5] == true then if bf[1] == "10" then search(3210,4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50) xg1(3,4,0x4C) gg.clearResults() gg.clearList() else search("320"..bf[1],4,32) py1(1,4,0x4) py1(1,4,-0x4) xg1(1,16,0x74) xg1(0,16,0x64) xg1(0,16,0x60) xg1(0,16,0xA8) xg1(0,16,0x98) xg1(bf[6],16,0x94) xg1(0,4,0x5C) xg1(7,4,0x50)--类型 xg1(3,4,0x4C) gg.clearResults() gg.clearList() end end end end end), byrq.box({"èšèƒ½", byrq.switch( "相机时间èšèƒ½", function() gg.alert("æ²¡ç”¨å·²è¢«åˆ é™¤") end), byrq.switch( "æ ¡æœæ—¶é—´èšèƒ½", function() gg.alert("æ²¡ç”¨å·²è¢«åˆ é™¤") end), byrq.switch( "å«è¡£æ—¶é—´èšèƒ½", function() gg.alert("æ²¡ç”¨å·²è¢«åˆ é™¤") end), byrq.switch( "æ‰‡åæ—¶é—´èšèƒ½", function() gg.alert("æ²¡ç”¨å·²è¢«åˆ é™¤") end), }), }), }), }), },{ byrq.box2({"更多音ä¹", byrq.box({ "更多音ä¹", byrq.switch("壿°´æ—‹å¾‹Vol.59",--功能åå— ä¸å¯é‡å¤ function() gg.playMusic("https://image.api.losfer.cn/view.php/0fabb2c200dddb91ae71b971e213868c.mp3") end, function() gg.toast("æ£åœ¨åœæ¢æ’放...") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end gg.toast("æ’æ”¾å·²åœæ¢") gg.toast("æ— æ£åœ¨æ’放的音ä¹") end ), byrq.switch("海誓山盟",--功能åå— ä¸å¯é‡å¤ function() gg.playMusic("https://image.api.losfer.cn/view.php/0ead07ab110ce719d4a005dcf292f773.mp3") end, function() gg.toast("æ£åœ¨åœæ¢æ’放...") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end gg.toast("æ’æ”¾å·²åœæ¢") gg.toast("æ— æ£åœ¨æ’放的音ä¹") end ), byrq.switch("有本事把我踩在脚下",--功能åå— ä¸å¯é‡å¤ function() gg.playMusic("https://image.api.losfer.cn/view.php/fb19e90cc929121868fd3b5fc28d72bd.mp3") end, function() gg.toast("æ£åœ¨åœæ¢æ’放...") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end gg.toast("æ’æ”¾å·²åœæ¢") gg.toast("æ— æ£åœ¨æ’放的音ä¹") end ), byrq.switch("壿°´æ—‹å¾‹Vol.77",--功能åå— ä¸å¯é‡å¤ function() gg.playMusic("https://image.api.losfer.cn/view.php/c0a1bd274ca79f737a381c38cccc676a.mp3") end, function() gg.toast("æ£åœ¨åœæ¢æ’放...") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end gg.toast("æ’æ”¾å·²åœæ¢") gg.toast("æ— æ£åœ¨æ’放的音ä¹") end ), byrq.switch("è„šè¸©é”æ€”b", function() gg.playMusic("http://music.163.com/song/media/outer/url?id=2027640152") end, function() gg.toast("æ£åœ¨åœæ¢æ’放...") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end gg.toast("æ’æ”¾å·²åœæ¢") gg.toast("æ— æ£åœ¨æ’放的音ä¹") end ), byrq.switch("1", function() gg.playMusic("https://image.api.losfer.cn/view.php/3a4f0cdbb51d3e2f2ba25210d79bec2c.mp3") end, function() gg.toast("æ£åœ¨åœæ¢æ’放...") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end gg.toast("æ’æ”¾å·²åœæ¢") gg.toast("æ— æ£åœ¨æ’放的音ä¹") end ), }), }), byrq.button("éŸ³ä¹æœç´¢", function() WTYY() end), wyylog },{ byrq.text(os.date"我去","#00f572","10sp"), byrq.text("一群:917063803","#87CEFA","15sp"), byrq.button("退出æ’ä»¶", function() gg.toast("1") window:removeView(floatWindow) luajava.setFloatingWindowHide(false) luajava.newThread(function() os.exit() end):start() bloc("end") end, "#DB202C"), byrq.button("å¤åˆ¶ç¾¤å·", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) gg.copyText("917063803") end), byrq.button("åŠ å…¥æˆ‘ä»¬", function() local loadingBox = getLoadingBox ('请ç¨ç‰...') loadingBox ['显示'] () gg.setVisible(false) gg.sleep(1900) loadingBox ['å…³é—'] () gg.sleep(0) gg.QQgroup("183426991") end), byrq.text(os.date"登录时间:%m月%dæ—¥%Hæ—¶%M分%Sç§’", "#87CEFA","15sp"), }}) function proo() byrq.controlRotation2(control1,3000) end luajava.newThread(function()--更新逻辑 while true do gg.sleep(3000) if 显示==0 then proo() end end end):start() jm1 : setBackground(slcta ) gg.setVisible(false ) luajava.setFloatingWindowHide(true ) ---blocä¸è¦åЍ 动了脚本功能会失效 bloc = luajava.getBlock() bloc("join" )