info = { example_version = '1.0.3', name = '哈哈全防', appid = '51624', appkey = 'gZsZaE0YqfFU686e', rc4key = 'ByxUYb8xLqxoI9u8', version = '1.0', mi_type = '3' } rlyunyz = getrlyunyz(info) BxCb =io.open('/sdcard/BL配置/图片/图片','r') if BxCb == nil then download("https://vip.kyun.top/view.php/2219fcd7a3a7f4620152e30a6b18e2f9.png", "/sdcard/BL配置/图片/图片") download("https://vip.kyun.top/view.php/efeb3b942f9d9cde72421eae53717620.png", "/sdcard/BL配置/图片/图片2") else --不用添加 end ByYxPink = io.open('/sdcard/BL配置/图片.zip','r') --文件名判断是否有此文件 if ByYxPink == nil then --关键判断 file.mkdir("/sdcard/BL配置/") gg.alert("检测到你还未下载资源,正在帮你下载请耐心等待,注意,如果卡在下载界面点空白处即可取消") download("https://vip.kyun.top/down.php/e5d3ca409aebf28a6b8822d2f9f9ff5d.com","/sdcard/BL配置/图片.zip")--检测未下载文件后 执行的内容 file.mkdir("/sdcard/BL配置/图片/") file.mkdir("/sdcard/BL配置/配置文件/") unzip("/sdcard/BL配置/图片.zip","/sdcard/BL配置/图片/")---解压 else --检测到已下载文件后 执行的内容 end Y=gg.makeRequest("https://v1.hitokoto.cn/").content --获取云端数据 Q=string.match(Y,'hitokoto(.+)type') --模式匹配他们中的一切字符 F=string.gsub(Q,'":"',"") K=string.gsub(F,'","',"") --删除多余垃圾 流光=true if tonumber(device.width)==nil then dwidth=1340 dheight=2300 else dwidth=device.width dheight=device.height end colorvs={} TL = {} huiz = function() end window = context:getSystemService("window") -- 获取窗口管理器 local function panduan(rec) fille,err = io.open(rec) if fille == nil then return false else return true end end local function checkimg(tmp,ii) if panduan("/sdcard/BL配置/图片/"..tmp) ~= true then gg.toast("正在下载资源"..ii.."/"..#ckimg.."\n请耐心等待") luajava.download("https://escape2020-1303126286.cos.ap-shenzhen-fsi.myqcloud.com/"..tmp,"/sdcard/BL配置/图片/"..tmp) else if file.length("/sdcard/BL配置/图片/"..tmp) <= 1 then gg.toast("正在下载资源"..ii.."/"..#ckimg.."\n请耐心等待") luajava.download("https://escape2020-1303126286.cos.ap-shenzhen-fsi.myqcloud.com/"..tmp,"/sdcard/BL配置/图片/"..tmp) end end if panduan("/sdcard/BL配置/图片/"..tmp) ~= true then gg.toast("正在下载资源"..ii.."/"..#ckimg.."\n请耐心等待") luajava.download("https://rl-1303126286.cos.ap-beijing-fsi.myqcloud.com/"..tmp,"/sdcard/BL配置/图片/"..tmp) else if file.length("/sdcard/BL配置/图片/"..tmp) <= 1 then gg.toast("正在下载资源"..ii.."/"..#ckimg.."\n请耐心等待") luajava.download("https://rl-1303126286.cos.ap-beijing-fsi.myqcloud.com/"..tmp,"/sdcard/BL配置/图片/"..tmp) end end end ckimg = { "bm_music", "hei_right", "heir", "heis", "heix", "heisuo", "lixin", "jian", "opoback", "opou", "Shimmer2.dex", "sscoR", "support.dex", "rw1", "pubgT","pubgG","pubgY","pubgR", } for i = 1,#ckimg do jindu = i checkimg(ckimg[i],i) gg.toast("正在加载资源") end if 流光 then shimmer=dex.loadfile('/sdcard/BL配置/图片/Shimmer2.dex') import "com.romainpiel.shimmer.Shimmer" import "com.romainpiel.shimmer.ShimmerTextView" end local function 获取图片2(txt) txt = string.url(txt,"de") ntxt = string.sub(string.gsub(txt,"/","-"),-10,-1) if string.find(tostring(txt),"http") ~= nil then if panduan("/sdcard/BL配置/图片/"..ntxt) == false then file.download(txt,"/sdcard/BL配置/图片/"..ntxt) else if file.length("/sdcard/BL配置/图片/"..ntxt) <= 1 then file.download(txt,"/sdcard/BL配置/图片/"..ntxt) end end txt = "/sdcard/BL配置/图片/"..ntxt end return luajava.getBitmap(txt) end local function getBit(x) return 获取图片2("/sdcard/BL配置/图片/"..x) end local reso=context:getResources() local function getP(bitm,radi) local lixin = RoundedBitmapDrawableFactory:create(reso,获取图片2(bitm)) lixin:setCornerRadius(radi) lixin:setAntiAlias(true) return lixin end local function newbg(gtvb1,gtvb4,gtvb5,g1,g2,g3,g4) local jianbians = luajava.loadlayout({ GradientDrawable, color = 0xff000000, gradientType = GradientDrawable.LINEAR_GRADIENT, orientation = GradientDrawable.Orientation.TOP_BOTTOM , }) jianbians:setColors(gtvb1) jianbians:setStroke(gtvb4,gtvb5)--边框宽度和颜色 jianbians:setCornerRadii({g1,g1,g2,g2,g3,g3,g4,g4}) return jianbians end local function 获取图片(txt) txt = string.url(txt,"de") ntxt = string.sub(string.gsub(txt,"/","-"),-10,-1) if string.find(tostring(txt),"http") ~= nil then if panduan("/sdcard/BL配置/图片/"..ntxt) == false then file.download(txt,"/sdcard/BL配置/图片/"..ntxt) else if file.length("/sdcard/BL配置/图片/"..ntxt) <= 1 then file.download(txt,"/sdcard/BL配置/图片/"..ntxt) end end txt = "/sdcard/BL配置/图片/"..ntxt end return luajava.getBitmapDrawable(txt) end local function getRes(x) return 获取图片("/sdcard/BL配置/图片/"..x) end local YoYoImpl = luajava.getYoYoImpl() local vibra = context:getSystemService(Context.VIBRATOR_SERVICE) local function getLayoutParams2() LayoutParams2 = WindowManager.LayoutParams layoutParams2 = luajava.new(LayoutParams2) if (Build.VERSION.SDK_INT >= 26) then -- 设置悬浮窗方式 layoutParams2.type = LayoutParams2.TYPE_APPLICATION_OVERLAY else layoutParams2.type = LayoutParams2.TYPE_PHONE end layoutParams2.format = PixelFormat.RGBA_8888 -- 设置背景 layoutParams2.flags = LayoutParams2.FLAG_NOT_TOUCH_MODAL -- 焦点设置Finish layoutParams2.gravity = Gravity.CENTER -- 重力设置 layoutParams2.width = LayoutParams2.MATCH_PARENT -- 布局宽度 layoutParams2.height = LayoutParams2.MATCH_PARENT -- 布局高度 return layoutParams2 end local 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_TOUCH_MODAL -- 焦点设置Finish layoutParams.gravity = Gravity.TOP|Gravity.LEFT -- 重力设置 layoutParams.width = LayoutParams.WRAP_CONTENT -- 布局宽度 layoutParams.height = LayoutParams.WRAP_CONTENT -- 布局高度 return layoutParams end local function particle() local webView = luajava.webView(function(webView) webView:loadData([[ 炫彩流光圆环加载动画
]], 'text/html', 'UTF-8') webView:setBackgroundColor(0x0) end) return webView end parti=particle() function particlelz() local webView = luajava.webView(function(webView) webView:loadData([[
]], 'text/html', 'UTF-8') webView:setBackgroundColor(0x0) webView:setVerticalScrollBarEnabled(false) webView:setHorizontalScrollBarEnabled(false) webView:setScrollContainer(false) end) return webView end stitle2lz=particlelz() 显2=false function 隐藏2() 显2=true chuangk:setVisibility(View.GONE) control2:setVisibility(View.GONE) smallc:setVisibility(View.VISIBLE) end function 显示2() 显2=false mainLayoutParams.x=20 window:updateViewLayout(floatWindow, mainLayoutParams) if 显示==1 then chuangk:setVisibility(View.VISIBLE) smallc:setVisibility(View.GONE) else control2:setVisibility(View.VISIBLE) smallc:setVisibility(View.GONE) 隐藏() end 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) if mainLayoutParams.x<=0 then mainLayoutParams.x=0 end mainLayoutParams.y = tonumber(y) + (event:getRawY() - RawY) window:updateViewLayout(floatWindow, mainLayoutParams) elseif Action == MotionEvent.ACTION_UP then mainLayoutParams.x = tonumber(x) + (event:getRawX() - RawX) if mainLayoutParams.x<=0 then mainLayoutParams.x=0 if 显示==0 and 显2==false then 隐藏2() end end if mainLayoutParams.x>=20 then if 显2==true then 显示2() end end mainLayoutParams.y = tonumber(y) + (event:getRawY() - RawY) window:updateViewLayout(floatWindow, mainLayoutParams) end end function getRes(x) return 获取图片("/sdcard/BL配置/图片/"..x) end function getCorner(gtvb1,gtvb3,gtvb4,gtvb5,g1,g2,g3,g4) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xCD7F32 end local jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(gtvb3) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(gtvb1) jianbians:setStroke(gtvb4,gtvb5)--边框宽度和颜色 jianbians:setCornerRadii({g1,g1,g2,g2,g3,g3,g4,g4}) return jianbians end function getVerticalBG(gtvb1,gtvb3,gtvb4,gtvb5) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xCD7F32 end local jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(gtvb3) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(gtvb1) jianbians:setStroke(gtvb4,gtvb5)--边框宽度和颜色 return jianbians end mainLayoutParams = getLayoutParams() import("android.media.AudioManager") audi = context:getSystemService("audio") audiotype = { AudioManager.STREAM_ALARM, --手机闹铃的声音 AudioManager.STREAM_MUSIC, --手机音乐的声音 AudioManager.STREAM_NOTIFICATION, --系统提示的通知 AudioManager.STREAM_RING, --电话铃声的声音 AudioManager.STREAM_SYSTEM, --手机系统的声音 AudioManager.STREAM_VOICE_CALL, --语音电话的声音 AudioManager.STREAM_DTMF, --DTMF音调的声音 --AudioManager.STREAM_BLUETOOTH_SCO, } yinl = {} for i = 1,#audiotype do yinl[i] = {} yinl[i].type = audiotype[i] yinl[i].min = audi:getStreamMinVolume(audiotype[i]) yinl[i].max = audi:getStreamMaxVolume(audiotype[i]) yinl[i].now = audi:getStreamVolume(audiotype[i]) end yltype = 0 function jianting3(func) yinln = {} for i = 1,#audiotype do yinln[i] = {} yinln[i].type = audiotype[i] yinln[i].now = audi:getStreamVolume(audiotype[i]) if yinln[i].now > yinl[i].now then yinl[i].now = yinln[i].now if yltype == 1 then yltype = 0 func() end elseif yinln[i].now < yinl[i].now then yinl[i].now = yinln[i].now if yltype == 0 then yltype = 1 func() end end end end TL.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 TL.controlSmall = function(control,time) luajava.runUiThread(function() import "android.animation.ObjectAnimator" ObjectAnimator():ofFloat(control,"scaleX", { 1, 0.7, 0.4, 0 }):setDuration(time):start() ObjectAnimator():ofFloat(control,"scaleY", { 1, 0.7, 0.4, 0 }):setDuration(time):start() end) end TL.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 function getHorizontalBG(gtvb1,gtvb3,gtvb4,gtvb5) if not gtvb4 then gtvb4 = 0 gtvb5 = 0xCD7F32 end local jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(gtvb3) jianbians:setOrientation(GradientDrawable.Orientation.LEFT_RIGHT) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors(gtvb1) jianbians:setStroke(gtvb4,gtvb5)--边框宽度和颜色 return jianbians end gg.setVisible(false) 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', string.sub(sid,1,8), string.sub(sid,10,12), string.sub(sid,21,22)) end function getJMselect() local selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, getRes('jian')) selector:addState({ -android.R.attr.state_pressed }, getVerticalBG({0x00ffffff,0xCD7F32},20,2,0xCD7F32)) return selector end TL.menu = function(views) if isswitch then return false end isswitch = true local layout = { 'ui.ViewPager', layout_height='match_parent', layout_width='match_parent', focusable="false", focusableInTouchMode="false", } cebian={ LinearLayout, onClick=function() end, onTouch=hanshu, layout_height="match_parent", layout_width="60dp", orientation="vertical", gravity="center_horizontal", layout_weight=1, } jian=getRes('jian') jmselect={} for i=1,#stab do jmselect[i]=getJMselect() if 流光 then _ENV["jm"..i..'t']=luajava.loadlayout{ShimmerTextView, text=stab[i], textSize="13sp", textColor="#ffffff", reflectionColor='#FFC42C', gravity='center', layout_height='20dp', layout_width='match_parent', background=jmselect[i], } else _ENV["jm"..i..'t']=luajava.loadlayout{TextView, text=stab[i], textSize="13sp", textColor="#ffffff", gravity='center', layout_height='20dp', layout_width='match_parent', background=jmselect[i], } end _ENV["jm"..i]=luajava.loadlayout({ LinearLayout, layout_height="wrap_content", layout_width="60dp", gravity="center", orientation="vertical", onClick=function() 切换(i) end, onTouch=hanshu, padding={'0dp','4dp','0dp','4dp'}, --onTouch=hanshu, _ENV["jm"..i..'t'] }) cebian[#cebian+1]=_ENV["jm"..i] tmp={ LinearLayout, layout_height="wrap_content", layout_width="match_parent", orientation="vertical", } for k=1,#views[i] do tmp[#tmp+1]=views[i][k] end _ENV["layout"..i]={ ScrollView, --orientation="vertical", layout_height="match_parent", layout_width="match_parent", tmp, --onTouch=Gundong, padding={"8dp","3dp","8dp","3dp"}, } layout[#layout + 1] =_ENV["layout"..i] end 当前ui=1 --jm1t:setTextColor(0xffE8AC3E) jm1t:setBackground(jian) ViewPager = ui.ViewPager(layout) luajava.setInterface(ViewPager, 'addOnPageChangeListener', {onPageSelected=function(view) view=tonumber(string.sub(view,1,1)) for i=1,#stab do --_ENV["jm"..i .."t"]:setTextColor(0xffffffff) _ENV["jm".. i .."t"]:setBackground(jmselect[i]) end 当前ui=view+1 --滚(当前ui) --_ENV["jm"..view+1 .."t"]:setTextColor(0xffE8AC3E) _ENV["jm"..view+1 .."t"]:setBackground(jian) end}) if 流光 then stit=luajava.loadlayout{ShimmerTextView, textSize="18sp", gravity='center_horizontal', layout_width='match_parent', shimmerEnable='true', reflectionColor="#FFDD60"; textColor="#151515", text=大标题, } else stit=luajava.loadlayout{TextView, textSize="18sp", gravity='center_horizontal', layout_width='match_parent', textColor="#151515", text=大标题, } end ckou={ LinearLayout, layout_height="wrap_content", layout_width="wrap_content", elevation='3dp', layout_marginLeft='3dp', layout_marginRight='3dp', layout_marginBottom='3dp', layout_marginTop='3dp', background=newbg({0xB9934CED,0xB9934CED},0,0xB9934CED,25,25,25,25), {LinearLayout, id=luajava.newId('cbscro'), onClick=function() end, onTouch=hanshu, elevation='3dp', layout_marginLeft='0dp', layout_marginRight='3dp', layout_marginBottom='0dp', layout_marginTop='0dp', background=newbg({0xB9934CED,0xB9934CED},0,0xB9934CED,25,25,25,25), layout_height="match_parent", orientation='vertical', layout_width='60dp', cebian, { FrameLayout, layout_height='105dp', layout_width='60dp', padding={'0dp','0dp','0dp','5dp'}, {LinearLayout, layout_height='wrap_content', layout_width='60dp', layout_gravity='center_horizontal', gravity='center', id='canv', onClick=function() end, onTouch=hanshu, }, {LinearLayout, layout_height="wrap_content", layout_width="70dp", orientation="vertical", gravity="center_horizontal", onClick=function() luajava.newThread(function() gg.alert(公告内容) end):start() end, onTouch=hanshu, {ImageView, src=getRes("xz_gg"), layout_height="30dp", layout_width="30dp", padding="4dp", },{TextView, text="公告", textColor="#ffffff", textSize="9sp", } }, {LinearLayout, layout_height='68dp', layout_width='50dp', layout_gravity='bottom|center_horizontal', background = getRes("lixin"), onClick=function() end, onTouch=hanshu, }, } }, {FrameLayout, id="parentv", {LinearLayout, layout_width="wrap_content", layout_height="match_parent", gravity="center", { LinearLayout, id='cvv', layout_width='wrap_content', layout_height='match_parent', gravity="center", } },ViewPager}, } extralis={LinearLayout, layout_height="wrap_content", layout_width="match_parent", id=luajava.newId("extralist"), orientation="vertical", } for k,v in pairs(ewsv) do extralis[#extralis+1]=ewsv[k] end function topSelect() local selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, getVerticalBG({0xB9934CED,0xB9934CED},30)) selector:addState({ -android.R.attr.state_pressed }, empty) return selector end topbar = luajava.loadlayout({ LinearLayout, layout_width="fill_parent", layout_height="35dp", background=getCorner({0xB9934CED,0xB9934CED},15,0,0xB9934CED,20,20,0,0), onClick=function() end, onTouch=hanshu, {LinearLayout, layout_width="35dp", layout_height="match_parent", gravity="center", { LinearLayout, gravity="center", background=获取图片(悬浮窗图标), layout_width = "20dp", layout_height = "20dp", layout_marginLeft = "5dp", onClick = 隐藏, onTouch = hanshu, } }, {LinearLayout, layout_width="wrap_content", layout_height="match_parent", gravity="center", { LinearLayout, id='cvv', layout_width='100dp', layout_height='match_parent', gravity="center", } }, {LinearLayout, layout_width="fill_parent", layout_marginLeft='-80dp', layout_weight=1, layout_height="match_parent", gravity="center", {LinearLayout, layout_height="match_parent", layout_width="80dp", background=topSelect(), onClick=function() end, gravity="center", onTouch=hanshu, {LinearLayout, layout_height="5dp", layout_width="60dp", id='tops', background=getVerticalBG({控件颜色,控件颜色},20) } } }, {LinearLayout, layout_width="35dp", layout_height="match_parent", gravity="center", { ImageView, padding = "5dp", id="lockui", src = getRes("heis"), background=getVerticalBG({0xB9934CED,0xB9934CED},90), layout_width = "20dp", layout_height = "20dp", layout_marginRight = "5dp", onClick = uiLock, onTouch = hanshu, } }, {LinearLayout, layout_width="35dp", layout_height="match_parent", gravity="center", { ImageView, padding = "5dp", src = getRes("heix"), background=getVerticalBG({0xB9934CED,0xB9934CED},90), layout_width = "20dp", layout_height = "20dp", layout_marginRight = "5dp", onClick = 隐藏, onTouch = hanshu, } } }) floatWindow = { FrameLayout, id = "motion", elevation = "10dp", onTouch = hanshu, onClick = function() end, layout_width = "wrap_content", orientation = "vertical", gravity = "center_vertical", layout_height = "wrap_content", { LinearLayout, id = "chuangk", visibility = "gone", layout_height='match_parent', layout_width='match_parent', orientation = "vertical", elevation='2dp', layout_marginLeft='2dp', layout_marginRight='2dp', layout_marginBottom='2dp', layout_marginTop='2dp', background=newbg({0xB9934CED,0xB9934CED},0,0xB9934CED,25,25,25,25), topbar, {LinearLayout, layout_width='match_parent', layout_height='40dp', gravity='center', elevation='2dp', layout_marginTop='0dp', layout_marginBottom='3dp', layout_marginLeft='0dp', layout_marginRight='0dp', background=newbg({0xB9934CED,0xB9934CED},4,0xB9934CED,0,0,50,50), stit }, {LinearLayout, layout_width='match_parent', layout_height='40dp', background=getVerticalBG({0xB9934CED,0xB9934CED},180,0,0xB9934CED), {LinearLayout, layout_weight=1, layout_height='34dp', layout_marginTop='3dp', layout_marginBottom='3dp', layout_marginLeft='3dp', layout_marginRight='3dp', layout_width='match_parent', padding='3dp', elevation='2dp', {ScrollView, id='ggscro', layout_height='match_parent', layout_width='match_parent', {LinearLayout, id='gggscro', orientation='vertical', layout_width='match_parent', layout_height='wrap_content', } },{EditText, visibility='gone', id=luajava.newId("tosearch"), layout_height='match_parent', layout_width='match_parent', padding='-8dp', hint = "请输入需要搜索的音乐关键词", gravity = "center", textColor='#000000', layout_marginLeft="0dp", textSize = "12sp", background = getVerticalBG({ 0x00262626,0xCD7F32 },15,5,0x00ffffff), } },{ImageView, id='musici', layout_width='34dp', layout_height='match_parent', gravity='center', elevation='2dp', layout_marginTop='3dp', layout_marginBottom='4dp', layout_marginLeft='4dp', layout_marginRight='4dp', background=getVerticalBG({0xB9934CED,0xB9934CED},0xB9934CED), src=getRes('bm_music'), padding='4dp', onTouch=hanshu,onClick=searchmenu }, --topbar }, ckou, }, {LinearLayout, visibility="gone", id=luajava.newId("extra"), layout_height='match_parent', layout_width='match_parent', orientation="vertical", background=getVerticalBG({0xB9934CED,0xB9934CED},25,2,0,0xB9934CED), {LinearLayout, layout_width="match_parent", layout_height="40dp", background=getCorner({0xB9934CED,0xB9934CED},25,nil,nil,25,25,0,0), onClick=function() end, onTouch=hanshu, gravity="center_vertical", {ImageView, id=luajava.newId("backv"), layout_height="34dp", layout_width="34dp", src=getRes("opoback"), background=getVerticalBG({0xB9934CED,0xB9934CED},360,10,0xffffffff), padding="8dp", onClick=关闭窗口, layout_marginLeft="10dp", }, {TextView, id=luajava.newId("extrat"), text="标题", layout_height="match_parent", layout_width="match_parent", layout_weight=1, gravity="center", }, {ImageView, id=luajava.newId("suov"), layout_height="34dp", layout_width="34dp", src=getRes("heix"), background=getVerticalBG({0xB9934CED,0xB9934CED},360,10,0xB9934CED), padding="10dp", onClick=隐藏, layout_marginRight="10dp", } }, {ScrollView, padding="10dp", layout_height="match_parent", layout_width="match_parent", extralis } }, { ImageView, id = "control2", background = 获取图片(悬浮窗图标), layout_width = "40dp", layout_height = "40dp", onTouch = hanshu, onClick = 隐藏, },{LinearLayout, id="smallc", visibility="gone", onClick=显示2, onTouch=hanshu, layout_height="56dp", layout_width="20dp", gravity="center", background=getCorner({0xB9934CED,0xB9934CED},12,0,0xB9934CED,0,35,35,0), },{FrameLayout, id='reme', layout_height='match_parent', layout_width='match_parent', elevation='3dp', { ImageView, id="sf", padding = "2dp", src = getRes("sscoR"), layout_width = "30dp", layout_height = "30dp", layout_marginRight = "0dp", layout_marginBottom = "0dp", layout_gravity = "right|bottom", onClick = function() end, onTouch = suofang, }} } local function invoke() local ok local RawX, RawY, x, y mainLayoutParams = getLayoutParams() mainLayoutParams.x = 10 mainLayoutParams.y = dheight/4 floatWindow = luajava.loadlayout(floatWindow) local function invoke2() window:addView(floatWindow, mainLayoutParams) canv:addView(parti) cvv:addView(stitle2lz) end local runnable = luajava.getRunnable(invoke2) local handler = luajava.getHandler() handler:post(runnable) local isMove end invoke(swib1,swib2) gg.setVisible(false) musici:setColorFilter(0xCD7F32) luajava.getIdView("backv"):setColorFilter(控件颜色) luajava.getIdView("suov"):setColorFilter(控件颜色) luajava.getIdView("tosearch"):setHintTextColor(控件颜色) 隐藏() if 流光 then shimmer = Shimmer(); luajava.runUiThread(function() shimmer:setDuration(2000) shimmer:setStartDelay(50) shimmer:start(stit) for i=1,#stab do shimmer:start(_ENV["jm"..i..'t']) end end) end setOnExitListener(function() tuichu=1 luajava.setFloatingWindowHide(false) luajava.post(function() window:removeView(floatWindow) end) luajava.setFloatingWindowHide(false) end) luajava.setFloatingWindowHide(true) qhkai = 0 qiehuan = function() if qhkai == 0 then qhkai = 1 draw.remove() luajava.runUiThread(function() TL.controlSmall(floatWindow,400) end) gg.sleep(400) luajava.runUiThread(function() floatWindow:setVisibility(View.GONE) end) else qhkai = 0 huiz() luajava.runUiThread(function() floatWindow:setVisibility(View.VISIBLE) end) luajava.runUiThread(function() TL.controlBig(floatWindow,400) end) end end if loadBox~=nil then loadBox['关闭']() end huiz() if ylfunc~=nil then ylfunc() end while true do if tuichu == 1 then break end if 音量键 then jianting3(qiehuan) end gg.sleep(300) end end isLocked=false inlock=getRes("heisuo") uiunlock=getRes("heis") function uiLock() vibra:vibrate(15) if isLocked==false then isLocked=true luajava.newThread(function() gg.toast("UI缩放已锁定") end):start() lockui:setImageDrawable(inlock) else isLocked=false luajava.newThread(function() gg.toast("UI缩放已解锁") end):start() lockui:setImageDrawable(uiunlock) end end function tiaose() if 颜色表==nil then return 0 end local tt={ LinearLayout, gravity="center_vertical", layout_height="wrap_content", layout_width='40dp' } for i=1,#颜色表 do tt[#tt+1]={ LinearLayout, layout_height="33dp", layout_width="33dp", gravity="center", id=luajava.newId("yans"..i), onClick=function() xuanse(i) end, {LinearLayout, layout_width="25dp", layout_height="25dp", background=getVerticalBG({颜色表[i],颜色表[i]},15) } } end local t=luajava.loadlayout{ HorizontalScrollView, layout_height="40dp", layout_width="wrap_content", tt } return t end xze2=getVerticalBG({0xB9934CED,0xB9934CED},15,3,0xB9934CED) xze=getVerticalBG({0xB9934CED,0xB9934CED},15,3,0xB9934CED) function xuanse(x) for i=1,#颜色表 do luajava.getIdValue("yans"..i):setBackground(empty) end luajava.getIdValue("yans"..x):setBackground(xze) TLColor(颜色表[x]) end function 滚(x) luajava.runUiThread(function() local cbsc=luajava.getIdView("cbscro") local targetLeft = _ENV["jm"..x]:getTop()/2 cbsc:smoothScrollTo(0,targetLeft); end) end function 切换(x) if type(ret)~="table" then log_init() return 0 end 窗口=false luajava.runUiThread(function() local searchUI = luajava.getIdView("tosearch") if x==5 then searchUI:setVisibility(View.VISIBLE) ggscro:setVisibility(View.GONE) else searchUI:setVisibility(View.GONE) ggscro:setVisibility(View.VISIBLE) end 当前ui=x ViewPager:setCurrentItem(x-1) end) end 显示=0 function 隐藏() if 显2==true then return 0 end luajava.runUiThread(function() if 显示 == 0 then control2:setVisibility(View.GONE) sf:setVisibility(View.VISIBLE) 显示 = 1 if 窗口 then luajava.getIdView("extra"):setVisibility(View.VISIBLE) else chuangk:setVisibility(View.VISIBLE) end YoYoImpl:with("ZoomInLeft"):duration(300):playOn(floatWindow) floatWindow:setBackground(beij) mainLayoutParams.height = mubx mainLayoutParams.width = muby mainLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL window : updateViewLayout (floatWindow , mainLayoutParams) else sf:setVisibility(View.GONE) if tuichuing then return 0 end tuichuing=true luajava.newThread(function() luajava.runUiThread(function() YoYoImpl:with("FadeOut"):duration(300):playOn(floatWindow) end) gg.sleep(300) luajava.runUiThread(function() chuangk:setVisibility(View.GONE) floatWindow:setBackground(beij2) YoYoImpl:with("FadeIn"):duration(200):playOn(floatWindow) luajava.getIdView("extra"):setVisibility(View.GONE) mainLayoutParams.width = LayoutParams.WRAP_CONTENT -- 布局宽度 mainLayoutParams.height = LayoutParams.WRAP_CONTENT -- 布局高度 control2:setVisibility(View.VISIBLE) 显示 = 0 mainLayoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE window : updateViewLayout (floatWindow , mainLayoutParams) end) tuichuing=false end):start() end end) end function 打开窗口(x) if ewsv[x]==nil then gg.alert("没有窗口“"..x.."”\n请检查是否写错了名字或者没创建") return 0 end luajava.runUiThread(function() 窗口=true chuangk:setVisibility(View.GONE) luajava.getIdView("extra"):setVisibility(View.VISIBLE) for k,v in pairs(ewsv) do if k~=x then v:setVisibility(View.GONE) end end luajava.getIdView("extrat"):setText(x) ewsv[x]:setVisibility(View.VISIBLE) end) end function 关闭窗口() luajava.getIdView("extra"):setVisibility(View.GONE) chuangk:setVisibility(View.VISIBLE) 窗口=false vibra:vibrate(10) end ewsv={} function 创建窗口(name,v) if type(v)~="table" then gg.alert("窗口"..name.."格式错误") end local t={ LinearLayout, orientation="vertical", visibility="gone", layout_width="match_parent", } for i=1,#v do t[#t+1]=v[i] end ewsv[name]=luajava.loadlayout(t) end switches = {} function 开关3(name,func1,func2,nid) local sname = nid local localname=name name = name..guid() _ENV[name] = "关" if func1 == nil then func1 = "" end if func2 == nil then func2 = "" end if type(func1) == "function" then local outfunc=function() namers = _ENV[name] if namers ~= "开" then vibra:vibrate(9) luajava.runUiThread(function() luajava.getIdValue(nid.."k"):setVisibility(View.GONE) YoYoImpl:with("ZoomInLeft"):duration(600):playOn(switches["2s"..sname]) luajava.getIdValue(nid.."g"):setVisibility(View.VISIBLE) luajava.getIdValue(nid):setBackground(checkbg) end) _ENV[name] = "开" colorvs[nid]={true,"switch"} pcall(func1) uiadtext(localname.." 已开启.","#ffffff") else vibra:vibrate(9) luajava.runUiThread(function() luajava.getIdValue(nid.."g"):setVisibility(View.GONE) YoYoImpl:with("ZoomInRight"):duration(600):playOn(switches["1s"..sname]) luajava.getIdValue(nid.."k"):setVisibility(View.VISIBLE) luajava.getIdValue(nid):setBackground(checkbga) end) colorvs[nid]={false,"switch"} _ENV[name] = "关" pcall(func2) uiadtext(localname.." 已关闭.","#545454") end end if localname=="摇一摇隐藏UI" then yyfunc=outfunc end if localname=="音量键隐藏UI" then ylfunc=outfunc end return outfunc end end function uiadtext(txt,color,size) if not txt then txt = "" end if not color then color = "#000000" end if not size then size = "10sp" end local tmp=luajava.loadlayout( { TextView, text = string.fromHtml(" "..getTimeStamp(os.time()).." "..txt..""), textSize = size, --textColor = color, gravity="left", layout_width = "wrap_content", }) luajava.runUiThread (function () local searchUI = luajava.getIdView("tosearch") searchUI:setVisibility(View.GONE) ggscro:setVisibility(View.VISIBLE) end) luajava.post(function() gggscro:addView(tmp) end) luajava.newThread(function() gg.sleep(100) luajava.post(function() ggscro:fullScroll(View.FOCUS_DOWN) end) end):start() end function searchmenu() luajava.runUiThread (function () local searchUI = luajava.getIdView("tosearch") if tonumber(tostring(searchUI: getVisibility ())) == 8.0 then searchUI:setVisibility(View.VISIBLE) ggscro:setVisibility(View.GONE) else luajava.newThread(searchmusic):start() end end) end function getTimeStamp(t) local str = os.date("%m-%d %H:%M:%S",t) return str 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(14,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(24,tmp3)--边框宽度和颜色 return jianbians end local ui = require('ui') function TL.switch(name,func1,func2,miaoshu) if not checkbg then checkbg = getShape2( 45, { 控件颜色,控件颜色 }, 4,控件颜色) checkbga = getShape2( 45, { 0xffaaaaaa,0xCD7F32 }, 4,0xffaaaaaa) switchbg1 = getShape( 45, { 0xffffffff,0xCD7F32 }, 4,0xCD7F32) switchbg2 = luajava.loadlayout { GradientDrawable , color = "#ffffff" , cornerRadius = 360 } end local nid = name..guid() local func = 开关3(name,func1,func2,nid) if not name then name = "未设置" end switches["1s"..nid] = luajava.loadlayout { FrameLayout, layout_width = '40dp', layout_height = '20dp', gravity = "center_vertical", padding = { "1dp","0dp","1dp","0dp" }, { LinearLayout, layout_gravity = "left|center_vertical", id = luajava.newId(nid.."k"), background = switchbg1, onClick = function() luajava.newThread(function() func() end):start() end, layout_width = '17dp', layout_height = '17dp', }, } switches["2s"..nid] = luajava.loadlayout { FrameLayout, onClick = function() if type(ret)~="table" then log_init() return 0 end luajava.newThread(function() func() end):start() end, layout_width = '40dp', layout_height = '20dp', gravity = "center_vertical", padding = { "1dp","0dp","1dp","0dp" } , { LinearLayout, visibility = "gone", layout_gravity = "right|center_vertical", id = luajava.newId(nid.."g"), background = switchbg2, onClick = function() if type(ret)~="table" then log_init() return 0 end luajava.newThread(function() func() end):start() end, layout_width = '17dp', layout_height = '17dp', } } local rest = luajava.loadlayout({ LinearLayout, elevation = "5dp", layout_width = 'fill_parent', layout_height = "48dp", gravity = "center_vertical", { LinearLayout, layout_width = 'fill_parent', layout_height = "40dp", gravity = "center_vertical", background = luajava.loadlayout { GradientDrawable , color = 0xaa161616 , cornerRadius = 35 } ,padding = { "0dp","0dp","6dp","0dp" }, { TextView, gravity = "top", text = name, textColor = "#d7d7d7", textSize = "13sp", layout_weight = 1, layout_width = '80dp', layout_marginLeft = "10dp", layout_marginRight = "20dp", }, { TextView, gravity = "center", layout_height = "match_parent", text = miaoshu, textSize = "11sp", layout_width = "wrap_content", layout_marginLeft = "-50dp", layout_weight = 1, textColor = "#A5A5A5", }, { FrameLayout, id=luajava.newId(nid), background = checkbga, elevation = "1dp", onClick = function() if type(ret)~="table" then log_init() return 0 end luajava.newThread(function() func() end):start() end, layout_width = 'wrap_content', layout_height = 'wrap_content', gravity = "left", padding="1dp", switches["1s"..nid],switches["2s"..nid] }} }) return rest end switchs={} suofang = function(v, event) if isLocked then hanshu(v,event) return 0 end local Action = event:getAction() if Action == MotionEvent.ACTION_DOWN then isMove = false RawX = event:getRawX() RawY = event:getRawY() hx = mainLayoutParams.height hy = mainLayoutParams.width if hx == 0 or hx==-2 then hx = 810 hy = 1150 end elseif Action == MotionEvent.ACTION_MOVE then isMove = true mubx = tonumber(hx) + (event:getRawY() - RawY) if mubx >= 250 and mubx <= 11100 then mainLayoutParams.height = mubx end muby = tonumber(hy) + (event:getRawX() - RawX) if muby >= 250 and muby <= 24500 then mainLayoutParams.width = muby end if muby<=250 and mubx<=250 then muby=250 mubx=250 --隐藏() return 0 end window:updateViewLayout(floatWindow, mainLayoutParams) end end function 开关5(name,func1,func2,nid) local sname = nid local localname=name 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 vibra:vibrate(9) luajava.runUiThread(function() if type(ret)~="table" then log_init() return 0 end luajava.getIdValue(nid.."t"):setTextColor(控件颜色) luajava.getIdValue(nid.."p"):setColorFilter(控件颜色) colorvs[nid.."p"]={true,"img"} colorvs[nid.."t"]={true,"txt"} --TL.controlWater(switchs[nid],300) end) _ENV[name] = "开" pcall(func1) uiadtext(localname.." 已开启.","#ffffff") else vibra:vibrate(9) luajava.runUiThread(function() if type(ret)~="table" then log_init() return 0 end luajava.getIdValue(nid.."t"):setTextColor(0xffd7d7d7) luajava.getIdValue(nid.."p"):setColorFilter(0xCD7F32) colorvs[nid.."p"]={false,"img"} colorvs[nid.."t"]={false,"txt"} --TL.controlWater(switchs[nid],300) end) _ENV[name] = "关" pcall(func2) uiadtext(localname.." 已关闭.","#545454") end end end end ckbg=getVerticalBG({0xff3A3A3C,0xCD7F32},360) TL.controlRotation9 = function(control, time,t) luajava.runUiThread(function() import "android.view.animation.Animation" import "android.animation.ObjectAnimator" xuanzhuandonghua = ObjectAnimator:ofFloat(control, "rotation", { time,t }) xuanzhuandonghua:setRepeatCount(0) xuanzhuandonghua:setRepeatMode(Animation.RESTART) xuanzhuandonghua:setDuration(400) xuanzhuandonghua:start() end) end function visi (tid , ttid) vibra:vibrate(4) 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) YoYoImpl:with("FadeIn"):duration(200):playOn(boxes[tid]) TL.controlRotation9(boxpic[tid],0,90) boxpic[tid]:setColorFilter(控件颜色) colorvs[tid]={true,"box"} else tview : setVisibility (View.GONE) TL.controlWater (_ENV [tid.."6"] , 200) TL.controlRotation9(boxpic[tid],90,0) boxpic[tid]:setColorFilter(nil) colorvs[tid]={false,"box"} end end boxes = {} boxpic = {} function TL.box (views) local tid = "box"..guid () boxpic[tid] = luajava.loadlayout { ImageView , src = getRes("hei_right"), layout_width = "24dp" , layout_height = "24dp" , } local ttid = tid.."6" local t1id = guid () firadio = { LinearLayout , layout_width = 'fill_parent' , 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 = "40dp" , gravity = "center_vertical" , layout_marginTop = "2dp" , layout_marginBottom = "4dp" , onClick = function () if type(ret)~="table" then log_init() return 0 end visi (tid , ttid) end , background = getButtonBG(), { TextView , text = views [1] , textSize = "13sp" , layout_marginLeft = "15dp" , layout_width = "match_parent" , layout_weight=1, textColor = "#ffffff" , gravity = "left" , },{ LinearLayout , padding={"0dp","0dp","10dp","0dp"}, layout_width = "30dp" , layout_height = "30dp" , gravity = "center", boxpic[tid], } } else gg.alert ("TL.box的table内第一个元素必须是string") os.exit () end radios = { LinearLayout , layout_marginLeft = "0dp" , layout_marginRight = "0dp" , orientation = "vertical" , visibility = "gone" , id = luajava.newId (tid) , padding = "0dp" , layout_width = 'fill_parent' , } for i = 2 , # views do radios [# radios + 1] = views [i] end boxes[tid] = luajava.loadlayout(radios) firadio [# firadio + 1] = boxes[tid] _ENV [t1id] = luajava.loadlayout (firadio) return _ENV [t1id] end buts={} heir=getRes("heir") function TL.button(txt,func,txtc) if not txt then txt = "未设置" end if not txtc then txtc="#ffffff" end local tid="Cbutton"..guid() buts[tid]=luajava.loadlayout( { LinearLayout, layout_width = 'match_parent', layout_height = "wrap_content", { LinearLayout, layout_width = "fill_parent", gravity = "center_vertical", layout_marginTop = "5dp", layout_marginBottom = "5dp", background = getButtonBG(), padding="10dp", onClick = function() TL.controlWater(buts[tid],300) uiadtext('执行 '..txt,"#161616") vibra:vibrate(10) luajava.newThread(func):start() end, { TextView, --id = luajava.newId(tid), textColor = txtc, text = txt, textSize = "13sp", layout_height = "wrap_content", layout_width = "fill_parent", layout_weight=1, },{ImageView, src=heir, layout_height="14dp", layout_width="14dp", } }}) return buts[tid] end function getButtonBG() local selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, getVerticalBG({0x55000000,0xCD7F32},35)) selector:addState({ -android.R.attr.state_pressed }, getVerticalBG({0xaa161616,0xCD7F32},35)) return selector end radiog={} function TL.radio (cklist) if not radoff then radon=getVerticalBG({0xffffffff,0xCD7F32},360,20,控件颜色) radoff=getVerticalBG({0x00ffffff,0xCD7F32},360,8,0xffaaaaaa) end local rid=guid() radiog[rid]={} rest = { LinearLayout , layout_width = 'match_parent' , layout_height = "wrap_content" , layout_marginTop = "10dp" , gravity = "top" , orientation = "vertical" , } if type (cklist [1]) == "string" then rds=2 rest [# rest + 1] = { TextView , gravity = "left" , padding="5dp", text = cklist [1] , textSize = "13sp" , textColor = "#d7d7d7" , layout_width = 'fill_parent' , layout_height = 'wrap_content' , layout_marginLeft = "10dp" , layout_marginRight = "5dp" , layout_marginTop = "0dp" , layout_marginBottom = "0dp" , } else rds=1 end local restt={ LinearLayout , layout_width = 'match_parent' , layout_height = "wrap_content" , layout_marginTop = "10dp" , gravity = "top" , orientation = "vertical" , background=getVerticalBG({0xaa161616,0xCD7F32},45), padding={"0dp","14dp","0dp","10dp"}, } for i = rds , # cklist do local name = cklist [i] [1] local func = cklist [i] [2] if not name then name = "未设置" end nid = name..guid () radiog[rid][nid]=false local func = radin(rid,nid,func) local tid = nid..guid () _ENV [tid] = luajava.loadlayout ( { LinearLayout , layout_width = '250dp' , layout_height = "30dp" , layout_marginTop = "5dp" , layout_marginBottom = "15dp" , layout_marginLeft = "4dp" , layout_marginRight = "10dp" , gravity = "center_vertical" , onClick = function () if type(ret)~="table" then log_init() return 0 end uiadtext('执行 '..name,"#ffffff") TL.controlWater (_ENV [tid] , 200) func() end , { ImageView , id = luajava.newId (nid) , layout_width = '20dp' , layout_height = "20dp" , layout_marginLeft = "5dp" , layout_marginRight = "0dp" , background =radoff , } , { TextView , gravity = "top" , text = name , textSize="13sp", textColor = "#d7d7d7" , layout_width = 'wrap_content' , layout_height = 'wrap_content' , layout_marginLeft = "10dp" , layout_marginRight = "5dp" , } }) restt [# restt + 1] = _ENV [tid] end rest [# rest + 1] = restt return luajava.loadlayout (rest) end function radin(rid,nid,func) return function() for k,v in pairs(radiog[rid]) do colorvs[k]={false,"rad"} luajava.getIdValue(k):setBackground(radoff) if k==nid and v~=true then luajava.getIdValue(k):setBackground(radon) colorvs[k]={true,"rad"} v=true luajava.newThread(func):start() end end end end 当前ui=1 function TLColor(co) 控件颜色=co luajava.runUiThread(function() if type(ret)~="table" then log_init() return 0 end --_ENV["jm"..当前ui.."t"]:setTextColor(控件颜色) luajava.getIdView("backv"):setColorFilter(控件颜色) luajava.getIdView("suov"):setColorFilter(控件颜色) tops:setBackground(getVerticalBG({控件颜色,控件颜色},30)) checkbg = getShape2(45,{控件颜色,控件颜色},4,控件颜色) radon=getVerticalBG({0xffffffff,0xCD7F32},360,20,控件颜色) luajava.getIdView("tosearch"):setHintTextColor(控件颜色) --uiadtext('已刷新控件颜色',控件颜色) musici:setColorFilter(控件颜色) for k,v in pairs(colorvs) do if v[1]==true then if v[2]=="switch" then luajava.getIdValue(k):setBackground(checkbg) elseif v[2]=="box" then boxpic[k]:setColorFilter(控件颜色) elseif v[2]=="txt" then luajava.getIdValue(k):setTextColor(控件颜色) elseif v[2]=="img" then luajava.getIdValue(k):setColorFilter(控件颜色) elseif v[2]=="rad" then luajava.getIdValue(k):setBackground(radon) elseif v[2]=="seek" then luajava.getIdView(k):setProgressDrawable( getVerticalBG({控件颜色,控件颜色},45)) end end end end) end currentIndex = 1 -- 定义一个函数来打印当前遍历到的table项,并更新索引位置 function 预置颜色() -- 获取当前遍历到的项 local currentItem = 颜色表[currentIndex] -- 打印当前项 TLColor(currentItem) -- 更新索引位置 currentIndex = currentIndex + 1 -- 如果索引已经达到最大值,则重置为1,回到第一项 if currentIndex > #颜色表 then currentIndex = 1 end end function TL.image(img,height,width,pad,func) if not func then func=function() end end if not pad then pad="0dp" end if not height then height="80dp" end if not width then width="80dp" end return luajava.loadlayout({ LinearLayout, layout_height="wrap_content", layout_width="fill_parent", gravity="center", { ImageView, layout_height=height, layout_width=width, padding=pad, src=获取图片(img), onClick=function() if type(ret)~="table" then log_init() return 0 end luajava.newThread(func):start() end, }}) end function TL.edit (name , hint) _ENV [name] = name..guid () if not hint then hint = name end rest = luajava.loadlayout ( { LinearLayout , layout_width = 'fill_parent' , { LinearLayout , layout_width = 'fill_parent' , layout_height = "40dp" , layout_marginTop = "5dp" , layout_marginBottom = "5dp" , layout_marginLeft = "0dp" , layout_marginRight = "0dp" , gravity = "center_vertical" , { EditText , background = getButtonBG(), gravity = "center" , hint = hint , textColor=ffffff, textSize = "13sp", layout_height = "40dp" , layout_marginBottom = "-2dp", id=luajava.newId(_ENV [name]), layout_width = 'fill' , } } }) luajava.getIdValue(_ENV [name]):setHintTextColor(0xffd7d7d7) return rest end function TL.getedit (name) edit = tostring (luajava.getIdValue (_ENV [name]) : getText ()) return edit end function TL.setedit (name , txt) txt = tostring (txt) luajava.runUiThread (function () luajava.getIdValue (_ENV [name]) : setText (txt) end ) end chazhi={} chajv={} function TL.seek(name,bian,smin,smax,nows) _ENV[bian] =nows local thum= getVerticalBG({0xffffffff,0xCD7F32},4,10,switch颜色) thum:setSize(30, 40) 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_hight = "fill_parent", { LinearLayout, layout_width = 'fill_parent', layout_hight = "fill_parent", layout_marginTop = "5dp", layout_marginBottom = "5dp", gravity = "center_vertical", background = getVerticalBG({0xaa161616,0xCD7F32},45), { TextView, padding={"5dp","10dp","0dp","10dp",}, gravity = "top", textColor="#ffffff", text = name..":"..nows, id = luajava.newId(names), layout_width = '100dp', --layout_marginLeft = "5dp", textSize='13sp', layout_marginRight = "0dp", }, { SeekBar, layout_width = 'fill_parent', layout_weight=1, id=luajava.newId(name.."seekbar"), min = truesmin, max = truesmax, progress=tnows, --paddingStart="0dp", --paddingEnd="0dp", progressDrawable={ getVerticalBG({控件颜色,控件颜色},45)}, thumb=thum, progressHeight="10dp", 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() if type(ret)~="table" then log_init() return 0 end luajava.getIdValue(names):setText(name..":".. resultvar) end) _ENV[bian] = resultvar end }} }}) colorvs[name.."seekbar"]={true,"seek"} return rest end function TL.text(text,color,size,isjz) if not color then color="#ffffff" end if isjz then return luajava.loadlayout( { TextView, text=text, textColor=color, textSize=size, gravity="center", layout_height="wrap_content", layout_width="match_parent", autoSizeTextType="uniform", }) else return luajava.loadlayout({ TextView, text=text, textColor=color, textSize=size, layout_height="wrap_content", layout_width="match_parent", autoSizeTextType="uniform", }) end end wyyget="http://120.24.160.246:3000/" function huoqu(txt) return table.json(gg.makeRequest(wyyget.."song/url/v1?id="..txt.."&level=standard").content) end function souyy(txt) return table.json(gg.makeRequest("http://music.163.com/api/search/get?s="..txt.."&type=1&offset=0&total=true&limit=10").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 getbg() jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(15) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({0x11000000,0xCD7F32}) jianbians:setStroke(4,"0x33000000")--边框宽度和颜色 selector = luajava.getStateListDrawable() selector:addState({ android.R.attr.state_pressed }, luajava.loadlayout { GradientDrawable, color = "#88000000", cornerRadius = 12 }) -- 点击时候的背景 selector:addState({ -android.R.attr.state_pressed }, jianbians) -- 没点击的背景 return selector 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 切换(5) luajava.runUiThread(function() mustxt = luajava.getIdView("tosearch"):getText() luajava.getIdView("tosearch"):setText('') --searchmenu() end) gg.sleep(100) if string.len(tostring(mustxt)) <= 2 or tostring(mustxt) == nil then gg.alert("至少输入2个字符") return 0 end mustxt = tostring(mustxt) lasttm = os.time() mustable = souyy(mustxt) mustable = mustable.result.songs -- print(mustable) musnames = {} musids = {} musarts = {} musictable = {} for k, v in pairs(mustable) do musictable[#musictable + 1] = v 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 -- print('musid',musid) -- musid = musictable[i].album.id -- print('musid',musid) 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_width = "match_parent", layout_marginBottom = "2dp", background = getbg(), id = luajava.newId("音" .. musid), onClick = function() thread = luajava.getThread(function() bofang(musname, musid) end) thread:start() end, { TextView, layout_marginTop = "5dp", textSize = "15sp", textColor = "#EF8A5C", layout_marginBottom = "0dp", text = musname, layout_hight = "10dp", layout_width = "match_parent", gravity = "center" }, { TextView, layout_marginTop = "0dp", textColor = "#535353", textSize = "12sp", layout_marginBottom = "5dp", text = musart, layout_hight = "10dp", layout_width = "match_parent", gravity = "center" } } -- gg.sleep(50) wryt[#wryt].onClick = function() -- (function() -- bofang(musnames[i] .. musarts[i], musids[i]) -- end):start() luajava.startThread(function() bofang(musnames[i] .. musarts[i], musids[i]) end) end end wyr = luajava.loadlayout(wryt) runnable = luajava.getRunnable(function() luajava.getIdView("搜索列表"):addView(wyr) end) handler = luajava.getHandler() handler:post(runnable) -- gg.alert(tostring(wrfun)) end function bofang(gqmz, gdmn) luajava.runUiThread(function() if type(ret)~="table" then log_init() return 0 end luajava.getIdView("搜索结果"):setVisibility(View.GONE) luajava.getIdView("加载"):setVisibility(View.VISIBLE) end) gg.playMusic("http://music.163.com/song/media/outer/url?id="..gdmn..".mp3" or huoqu(gdmn).data[0].url) uiadtext("正在播放 "..gqmz,"#ffffff") gg.sleep(2000) luajava.runUiThread(function() luajava.getIdView("加载"):setVisibility(View.GONE) luajava.getIdView("搜索结果"):setVisibility(View.VISIBLE) end) end jiaz = { TextView, text = "正在加载歌曲资源", visibility = "gone", id = luajava.newId("加载"), textSize = "20sp", gravity = "center", textColor="#000000", } wyylog = luajava.loadlayout({ LinearLayout, orientation="vertical", layout_width = "match_parent", { ScrollView, layout_hight = "220dp", gravity="center_horizontal", layout_width = "match_parent", { LinearLayout, layout_width = "match_parent", {LinearLayout, padding="4dp", gravity="center", orientation="vertical", TL.text('请在上方搜索音乐关键词',0xff245AFF) }, id = luajava.newId("搜索列表"), layout_hight = "200dp", orientation = "vertical", layout_width = "match_parent", gravity="center_horizontal", jiaz } } }) if loadBox~=nil then loadBox['关闭']() end function getShape22(tmp0,tmp1,tmp2,tmp3) jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(tmp0) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({ tmp1,tmp2 }) jianbians:setStroke(3,tmp3)--边框宽度和颜色 return jianbians end function getShape00(tmp0,tmp1,tmp2,tmp3) jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(tmp0) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({ tmp1,tmp2 }) return jianbians end --游戏配置 ------------------------------------------------------------- -------------------------------------------------- -------------------------------**------------- function launch(appstart) local loadBox = getLoadingBox('正在启动游戏\n'..appstart) loadBox['显示']() if appstart ~= nil then gg.setProcess(appstart) gg.sleep(500) if tostring(gg.getTargetPackage()) == appstart then gg.toast("正在启动游戏") gg.processKill() tuichu=true luajava.setFloatingWindowHide(false) os.exit() end gg.toast("正在启动游戏...") app.startActivity(appstart) jci=0 --gg.sleep(5000) while true do gg.setProcess(appstart) gg.sleep(400) if tostring(gg.getTargetPackage()) == appstart then loadBox['关闭']() uiadtext(name.." 启动成功.","#ffffff") gg.alert("启动成功") else jci=jci+1 if jci==14 then loadBox['关闭']() uiadtext(name.." 启动失败.","#ffffff") gg.alert("自动获取进程失败\n请手动选择游戏进程") gg.setProcessX() break end end gg.sleep(100) end end end function card(cdv) logo=cdv[1] name=cdv[2] tags=cdv[3] func=cdv[4] if not x then x = 2 end tag = { LinearLayout, } for i = 1,#tags do tag[#tag+1] = { TextView, background = getShape22(45,0x00FF9700,0x00FF9700,0xffFF9700), layout_height = "20dp", padding = "2dp", textColor = 0xffFF9700, layout_marginLeft = "10dp", gravity = "center_vertical", text = " "..tags[i].." ", textSize = "9sp", } end tags = tag tmp = luajava.loadlayout( { FrameLayout, layout_height = "wrap_content", layout_width = "fill_parent", { LinearLayout, orientation = "vertical", layout_height = "100dp", layout_marginLeft = "14dp", layout_marginRight = "14dp", layout_marginTop = "10dp", layout_marginBottom = "10dp", layout_width = "match_parent", background=getVerticalBG({0x22ffffff,0x22ffffff},8,5,0xff000000), { LinearLayout, layout_marginLeft = "10dp", layout_marginRight = "10dp", layout_marginTop = "10dp", layout_marginBottom = "10dp", layout_width = "match_parent", layout_height = "40dp", { ImageView, layout_width = "40dp", layout_height = "40dp", background = 获取图片(logo), }, { TextView, layout_height = "40dp", layout_marginLeft = "10dp", gravity = "center_vertical", text = name, textColor="#ffffff", textSize = "13sp", } }, tags }, { LinearLayout, onClick = function() luajava.newThread(function() if type(ret)~="table" then log_init() return 0 end uiadtext(name.." 正在启动.","#ffffff") func() end):start() end, background = getShape00(80,0xff28FEB9,0xff28FEB9,0xff28FEB9), layout_height = "25dp", layout_width = "55dp", layout_gravity = "right", layout_marginRight = "30dp", layout_marginTop = "70dp", gravity = "center", { ImageView, layout_height = "20dp", layout_width = "15dp", background = getRes("rw1"), }, { TextView, textColor = "#000000", text = "启动", textSize = "12sp", layout_height = "20dp", gravity = "center", layout_width = "30dp", } } }) return tmp end launchui = luajava.loadlayout({ ScrollView, layout_height = "match_parent", fillViewport=true, layout_width = "fill_parent", padding={"0dp","0dp","0dp","10dp"}, { LinearLayout, layout_height = "wrap_content", layout_width = "fill_parent", gravity = "center_horizontal", orientation="vertical", card({"/sdcard/BL/图片/pubgT", "地铁跑酷", { "地铁跑酷启动", "九游" }, function() launch("com.rekoo.pubgm") end }), }}) TL.controlFlip = function(control,time)---翻转 luajava.runUiThread(function() if type(ret)~="table" then log_init() return 0 end import "android.view.animation.Animation" import "android.animation.ObjectAnimator" xuanzhuandonghua = ObjectAnimator:ofFloat(control, "rotationY", { -360, 360 }) xuanzhuandonghua:setRepeatCount(0) xuanzhuandonghua:setRepeatMode(Animation.REVERSE) xuanzhuandonghua:setDuration(time) xuanzhuandonghua:start() end) end function shenglongyp() luajava.newThread(function() local t=math.random(1,4) end):start() YoYoImpl:with("FadeIn"):duration(600):playOn(floatWindow) TL.controlFlip(shenglong,1900) end shenglong=luajava.loadlayout({ ImageView, src = 获取图片("https://qingcheng.c-n.icu/wangpan/view.php/5d1f4be2d61a75901940ccbfe9e3c337.png"), padding="2dp", layout_width = "130dp", layout_height = "130dp", gravity = "center", }) function TL.setedit(name,txt) txt = tostring(txt) luajava.runUiThread(function() luajava.getIdValue(name):setText(txt) end) end function TL.getedit(name) --gg.alert(edit) edit = tostring(luajava.getIdValue(name):getText()) return edit end function log_init() if type(ret) ~= "table" then if vv ~= nil then return 0 end luajava.newThread(function() draw.remove() end):start() tmp = { LinearLayout,orientation = "vertical",gravity = "center_horizontal", } if panduan("/sdcard/BL配置/配置文件/km.lua") ~= false then dofile("/sdcard/BL配置/配置文件/km.lua") logkapian = luajava.loadlayout({ LinearLayout, orientation = "vertical", gravity = "center", layout_height = "50dp", layout_width = "160dp", background = getHorizontalBG({0xB9934CED,0xB9934CED},25,2,0xB9934CED), elevation = "10dp", onClick = function() --TL.controlFlip(logkapian,2000) luajava.newThread(function() logkap = true login(kam) end):start() end, { TextView, gravity = "center", textSize = "18sp", textColor = "#000000", text = "******"..string.sub(kam,-4,-1) },{ TextView, gravity = "center", textSize = "11sp", textColor = "#4E98FF", text = "快捷登录" } }) tmp[#tmp+1] = logkapian tmp[#tmp+1] = { LinearLayout, layout_height = "10dp", } end jianbians = luajava.new(GradientDrawable) jianbians:setCornerRadius(30) jianbians:setGradientType(GradientDrawable.LINEAR_GRADIENT) jianbians:setColors({ 0xffffffff,0xffffffFF,0xffffffFF,0xCD7F32 }) jianbians:setOrientation(GradientDrawable.Orientation.TL_BR) --jianbians:setStroke(0,0x55000000)--边框宽度和颜色 luajava.newThread(function() luajava.runUiThread(function() vv = luajava.loadlayout({ LinearLayout, orientation = "vertical", visibility = "gone", background = getVerticalBG({ 0xffffffff,0xCD7F32 },30), layout_width = "match_parent", layout_height = "match_parent", gravity = "center", onTouch=hanshu, onClick = function() if vv ~= nil then YoYoImpl:with("FadeOut"):duration(300):playOn(vv) luajava.newThread(function() gg.sleep(300) rmdadView(vv) vv = nil end):start() end end, tmp, { LinearLayout, orientation = "vertical", { LinearLayout, layout_height = "60dp", { EditText, id = luajava.newId("卡密"), textColor = "#000000", hint = "请输入卡密", elevation = "10dp", gravity = "center", background = getHorizontalBG({0xffffffff,0xCD7F32},25,2,0xff737473), layout_height = "50dp", layout_width = "160dp", layout_marginBottom = "20dp", }}, { TextView, background = getVerticalBG({0xff0077FF,0xff0077FF},15), text = "登录", textColor = "#ffffff", textSize = "16sp", gravity = "center", elevation = "10dp", layout_height = "30dp", layout_width = "160dp", onClick = function() luajava.newThread(function() login(TL.getedit("卡密")) end):start() end, },{ TextView, background = luajava.loadlayout { GradientDrawable, color = "#37383D", cornerRadius = 20 }, text = "购卡", textColor = "#ffffff", textSize = "16sp", layout_marginTop="5dp", gravity = "center", elevation = "10dp", layout_height = "30dp", layout_width = "160dp", onClick = function() luajava.newThread(function() gg.intent(卡网) 隐藏() rmdadView(vv) vv=nil end):start() end, },{ TextView, background = luajava.loadlayout { GradientDrawable, color = "#37383D", cornerRadius = 20 }, text = "解绑", textColor = "#ffffff", textSize = "16sp", layout_marginTop="5dp", gravity = "center", elevation = "10dp", layout_height = "30dp", layout_width = "160dp", onClick = function() luajava.newThread(function() local t=TL.getedit("卡密") if t~="" and t~=" " then rlyunyz.unbind(t) end end):start() end, },{ TextView, background = luajava.loadlayout { GradientDrawable, color = "#37383D", cornerRadius = 20 }, text = "退出", textColor = "#ffffff", textSize = "16sp", layout_marginTop="5dp", gravity = "center", elevation = "10dp", layout_height = "30dp", layout_width = "160dp", onClick = function() tuichu=1 end, }} }) addadView(vv) 切换(1) luajava.getIdValue("卡密"):setHintTextColor(0xCD7F32) vv:setVisibility(View.VISIBLE) YoYoImpl:with("FadeIn"):duration(300):playOn(vv) end) huiz() end):start() else --luajava.newThread(function() xiugtx() end):start() end end function login(kam) local loadBox = getLoadingBox('正在校验卡密') if tostring(kam)=="" or tostring(kam)==" " then return 0 end local info = kamiinfo if vv ~= nil then luajava.runUiThread(function() YoYoImpl:with("FadeOut"):duration(400):playOn(vv) end) luajava.newThread(function() gg.sleep(400) rmdadView(vv) vv = nil end):start() end loadBox['显示']() ret = rlyunyz.login(kam) loadBox['关闭']() ini = rlyunyz.checkUpdate() if type(ret) ~= "table" then --gg.alert(tostring(ret)) else ktmp = "kam='"..ret.kami.."'" luajava.newThread(function() write("/sdcard/BL配置/配置文件/km.lua",ktmp) end):start() 切换(1) end --if logkap then gg.sleep(100) end end function getTimeStamp(t) local str = os.date("%Y/%m/%d %H:%M:%S",t) return str end function addadView(tmp) local function invoke() parentv:addView(tmp) end luajava.post(invoke) end function rmdadView(tmp) local function invoke() parentv:removeView(tmp) end luajava.post(invoke) end function huiz() --如果有绘制请写到这里面否则会消失 end huiz() muby=600 --初始宽度 竖屏建议850 横屏建议1310 mubx=900 --初始高度 竖屏建议1310 横屏建议850 function hgil2cppapi() 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 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 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 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 ---@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 ---@field Classes table ---@field Fields table ---@field Results table ---@field Types table ---@field DefaultValues table ---@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 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 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 HGZDG(NAME,SOTYPE,SONAME,TYPE,VALUE,VALUEXB) gg.alert("检测到用的是全版本功能\n加载比较慢请耐心等待") local SOMOD=gg.getRangesList("il2cpp.so") if SOMOD[1]==nil then gg.toast(NAME.."开启失败") else hgil2cppapi() 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 --------秒开配置---------------------------------------------------------------------------- function SearchWrite(Search, Write, Type) gg.clearResults() gg.setVisible(false) gg.searchNumber(Search[1][1], Type) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Search[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Search do local tmp = {} local offset = Search[k][2] - base local num = Search[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = v.flags end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then gg.toast("修改"..#data.."条数据.修改成功") local t = {} local base = Search[1][2] for i=1, #data do for k, w in ipairs(Write) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = Type t[#t].value = w[1] if (w[3] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) else gg.toast(":搜索0条数据.修改失败", false) return false end else gg.toast("搜索0条数据.修改失败") return false end end function Fs3Fs4(Fs1, Fs2, Fs3, Fs4, Fs5) gg.clearResults() gg.setRanges(Fs2) gg.setVisible(false) gg.searchNumber(Fs3[1][1], Fs3[1][3]) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Fs3[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Fs3 do local tmp = {} local offset = Fs3[k][2] - base local num = Fs3[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = Fs3[k][3] end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then gg.toast(Fs1..'\n搜索到{'..#data..'}条数据') local t = {} local base = Fs3[1][2] if Fs5 == '' and Fs5 > 0 and Fs5 < #data then Fs5 = Fs5 else Fs5 = #data end for i=1, Fs5 do for k, w in ipairs(Fs4) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = w[3] t[#t].value = w[1] if (w[4] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) gg.toast(Fs1..'️\n已修改{'..#t..'}条数据') else gg.toast(Fs1..'\n数据搜索失败', false) return false end else gg.toast(Fs1..'\n数据修改失败', false) return false 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,536870912,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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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 BaAdd(add) t=gg.getValues({[1]={address=add,flags=4}}) return t[1].value&0xFFFFFFFF end function set(dz,xg,lx,dj) if dj=="true" then gg.addListItems({{address=dz,flags=lx,value=xg,freeze=true}}) else gg.setValues({{address=dz,flags=lx,value=xg}}) end gg.toast("已修改完成~") end function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]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 = numlocal 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 gg.alert ( "开启失败" ) 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 gg.toast ( Name.."成功" ) 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 So_X32 = function ( Address , Value ) local Somod = gg.getRangesList ( 'il2cpp.so' ) [ 1 ] if Somod == nil then gg.alert ( 'so模块未加载 请重新选择游戏进程' ) else local So = Somod.start local Add = So + Address gg.setValues ( { { address = Add , flags = 4 , value = Value } } ) gg.setValues ( { { address = Add + 4 , flags = 4 , value = "1EFF2FE1r" } } ) end end function searchwb(a,b,c) gg.setRanges(c) gg.searchNumber(a,b) end function xgwb(a1,a2) gg.getResults(gg.getResultsCount()) gg.editAll(a1,a2) 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 gg.clearResults() j={} xgz={} ZY = 'Main0' gg.clearResults() sj={} xgz={} function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end function BL(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 besz = function ( Address , Value ) local Somod = gg.getRangesList ( 'il2cpp.so' ) [ 1 ] if Somod == nil then gg.alert ( '请重新选择地铁跑酷进程' ) gg.setProcessX ( ) 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 = "1EFF2FE1r" } } ) gg.processResume ( ) end end function JG(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 _error() gg.alert([[ 开启失败 失败原因:进程存储太小! 解决方案:刷新进程后重启开启 ]]) end function ByFQ(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 _error() gg.alert([[ 开启失败 失败原因:进程存储太小! 解决方案:刷新进程后重启开启 ]]) end Sy_x32 = 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 bl = 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 readWrite(Search,Get,Type,Range,Name) gg.clearResults() gg.setRanges(Range) gg.setVisible(false) if Search[1][1]~=false then gg.searchAddress(Search[1][1],0xFFFFFFFF,Search[1][4] or Type,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) end gg.searchNumber(Search[1][2],Search[1][4] or Type,false,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) local count=gg.getResultCount() local result=gg.getResults(count) gg.clearResults() local data={} local base=Search[1][3] if (count > 0) then for i,v in ipairs(result) do v.isUseful=true end for k=2,#Search do local tmp={} local offset=Search[k][2] - base local num=Search[k][1] for i,v in ipairs(result) do tmp[#tmp+1]={} tmp[#tmp].address=v.address+offset tmp[#tmp].flags=Search[k][3] or Type end tmp=gg.getValues(tmp) for i,v in ipairs(tmp) do if v.flags==16 or v.flags==64 then values=tostring(v.value):sub(1,6) num=tostring(num):sub(1,6) else values=v.value end if tostring(values)~=tostring(num) then result[i].isUseful=false end end end for i,v in ipairs(result) do if (v.isUseful) then data[#data+1]=v.address end end if (#data > 0) then local t,t_={},{} local base=Search[1][3] for i=1,#data do for k,w in ipairs(Get) do offset=w[2] - base if w[1]==false then t_[#t_+1]={} t_[#t_].address=data[i]+offset t_[#t_].flags=Type th_=(th_) and th_+1 or 1 else t[#t+1]={} t[#t].address=data[i]+offset t[#t].flags=w[3] or Type t[#t].value=w[1] tg_=(tg_) and tg_+1 or 1 if (w[4]==true) then local item={} item[#item+1]=t[#t] item[#item].freeze=w[4] gg.addListItems(item) end end end end tg=(tg_) and "\n已修改"..tg_.."条数据" or "" th=(th_) and "\n已获取"..th_.."条数据" or "" gg.setValues(t) t_=gg.getValues(t_) gg.loadResults(t_) gg.alert("\n"..Name.."搜索成功!\n偏移到"..#data.."条数据"..tg..th) tg_,th_=nil,nil else gg.toast("\n"..Name.."开启失败",false) return false end else gg.toast(Name.."开启失败") return false end end function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]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 gg.alert ( "开启失败" ) 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 gg.toast ( Name.."成功" ) end end function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local _Q = tonumber(0x167ba0fe) local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address print(string.char(231,190,164,58).._Q) end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end function Fs3Fs4(Fs1, Fs2, Fs3, Fs4, Fs5) gg.clearResults() gg.setRanges(Fs2) gg.setVisible(false) gg.searchNumber(Fs3[1][1], Fs3[1][3]) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Fs3[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Fs3 do local tmp = {} local offset = Fs3[k][2] - base local num = Fs3[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = Fs3[k][3] end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then gg.toast(Fs1..'\n搜索到{'..#data..'}条数据') local t = {} local base = Fs3[1][2] if Fs5 == '' and Fs5 > 0 and Fs5 < #data then Fs5 = Fs5 else Fs5 = #data end for i=1, Fs5 do for k, w in ipairs(Fs4) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = w[3] t[#t].value = w[1] if (w[4] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) gg.toast(Fs1..'️\n已修改{'..#t..'}条数据') else gg.toast(Fs1..'\n数据搜索失败', false) return false end else gg.toast(Fs1..'\n数据修改失败', false) return false 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,536870912,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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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 BaAdd(add) t=gg.getValues({[1]={address=add,flags=4}}) return t[1].value&0xFFFFFFFF end function set(dz,xg,lx,dj) if dj=="true" then gg.addListItems({{address=dz,flags=lx,value=xg,freeze=true}}) else gg.setValues({{address=dz,flags=lx,value=xg}}) end gg.toast("已修改完成~") end function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]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 gg.alert ( "开启失败" ) 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 gg.toast ( Name.."成功" ) end end ---------秒开配置---------------------------------------------------------------------------- BYWT = 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 CYC(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}}) end end function _error() ts=gg.alert([[ 开启失败 失败原因:进程存储太小或选择了错误的进程 解决方案:重选进程后开启 ]],"确定","选择进程","") if ts == 2 then gg.setProcessX() end end wt = 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 Sy_x32 = 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 = "1EFF2FE1r" } } ) gg.processResume ( ) end end function WT(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 _error() gg.alert([[ 开启失败 失败原因:地铁跑酷进程存储太小 请选择>三百MB的地铁跑酷进程 解决方案:重新选择进程 ]]) end BYWT = 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 CYC(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}}) end end function _error() ts=gg.alert([[ 开启失败 失败原因:进程存储太小或选择了错误的进程 解决方案:重选进程后开启 ]],"确定","选择进程","") if ts == 2 then gg.setProcessX() end end wt = 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 Sy_x32 = 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 = "1EFF2FE1r" } } ) gg.processResume ( ) end end function WT(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 _error() gg.alert([[ 开启失败 失败原因:地铁跑酷进程存储太小 请选择>三百MB的地铁跑酷进程 解决方案:重新选择进程 ]]) end function Fs3Fs4(Fs1, Fs2, Fs3, Fs4, Fs5) gg.clearResults() gg.setRanges(Fs2) gg.setVisible(false) gg.searchNumber(Fs3[1][1], Fs3[1][3]) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Fs3[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Fs3 do local tmp = {} local offset = Fs3[k][2] - base local num = Fs3[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = Fs3[k][3] end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then gg.toast(Fs1..'\n搜索到{'..#data..'}条数据') local t = {} local base = Fs3[1][2] if Fs5 == '' and Fs5 > 0 and Fs5 < #data then Fs5 = Fs5 else Fs5 = #data end for i=1, Fs5 do for k, w in ipairs(Fs4) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = w[3] t[#t].value = w[1] if (w[4] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) gg.toast(Fs1..'️\n已修改{'..#t..'}条数据') else gg.toast(Fs1..'\n数据搜索失败', false) return false end else gg.toast(Fs1..'\n数据修改失败', false) return false 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,536870912,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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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 BaAdd(add) t=gg.getValues({[1]={address=add,flags=4}}) return t[1].value&0xFFFFFFFF end function set(dz,xg,lx,dj) if dj=="true" then gg.addListItems({{address=dz,flags=lx,value=xg,freeze=true}}) else gg.setValues({{address=dz,flags=lx,value=xg}}) end gg.toast("已修改完成~") end function readWrite(Search,Get,Type,Range,Name) gg.clearResults() gg.setRanges(Range) gg.setVisible(false) if Search[1][1]~=false then gg.searchAddress(Search[1][1],0xFFFFFFFF,Search[1][4] or Type,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) end gg.searchNumber(Search[1][2],Search[1][4] or Type,false,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) local count=gg.getResultCount() local result=gg.getResults(count) gg.clearResults() local data={} local base=Search[1][3] if (count > 0) then for i,v in ipairs(result) do v.isUseful=true end for k=2,#Search do local tmp={} local offset=Search[k][2] - base local num=Search[k][1] for i,v in ipairs(result) do tmp[#tmp+1]={} tmp[#tmp].address=v.address+offset tmp[#tmp].flags=Search[k][3] or Type end tmp=gg.getValues(tmp) for i,v in ipairs(tmp) do if v.flags==16 or v.flags==64 then values=tostring(v.value):sub(1,6) num=tostring(num):sub(1,6) else values=v.value end if tostring(values)~=tostring(num) then result[i].isUseful=false end end end for i,v in ipairs(result) do if (v.isUseful) then data[#data+1]=v.address end end if (#data > 0) then local t,t_={},{} local base=Search[1][3] for i=1,#data do for k,w in ipairs(Get) do offset=w[2] - base if w[1]==false then t_[#t_+1]={} t_[#t_].address=data[i]+offset t_[#t_].flags=Type th_=(th_) and th_+1 or 1 else t[#t+1]={} t[#t].address=data[i]+offset t[#t].flags=w[3] or Type t[#t].value=w[1] tg_=(tg_) and tg_+1 or 1 if (w[4]==true) then local item={} item[#item+1]=t[#t] item[#item].freeze=w[4] gg.addListItems(item) end end end end tg=(tg_) and "\n已修改"..tg_.."条数据" or "" th=(th_) and "\n已获取"..th_.."条数据" or "" gg.setValues(t) t_=gg.getValues(t_) gg.loadResults(t_) gg.alert("\n"..Name.."搜索成功!\n偏移到"..#data.."条数据"..tg..th) tg_,th_=nil,nil else gg.toast("\n"..Name.."开启失败",false) return false end else gg.toast(Name.."开启失败") return false end end function readWrite(Search,Get,Type,Range,Name) gg.clearResults() gg.setRanges(Range) gg.setVisible(false) if Search[1][1]~=false then gg.searchAddress(Search[1][1],0xFFFFFFFF,Search[1][4] or Type,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) end gg.searchNumber(Search[1][2],Search[1][4] or Type,false,gg.SIGN_EQUAL,Search[1][5] or 1,Search[1][6] or -1) local count=gg.getResultCount() local result=gg.getResults(count) gg.clearResults() local data={} local base=Search[1][3] if (count > 0) then for i,v in ipairs(result) do v.isUseful=true end for k=2,#Search do local tmp={} local offset=Search[k][2] - base local num=Search[k][1] for i,v in ipairs(result) do tmp[#tmp+1]={} tmp[#tmp].address=v.address+offset tmp[#tmp].flags=Search[k][3] or Type end tmp=gg.getValues(tmp) for i,v in ipairs(tmp) do if v.flags==16 or v.flags==64 then values=tostring(v.value):sub(1,6) num=tostring(num):sub(1,6) else values=v.value end if tostring(values)~=tostring(num) then result[i].isUseful=false end end end for i,v in ipairs(result) do if (v.isUseful) then data[#data+1]=v.address end end if (#data > 0) then local t,t_={},{} local base=Search[1][3] for i=1,#data do for k,w in ipairs(Get) do offset=w[2] - base if w[1]==false then t_[#t_+1]={} t_[#t_].address=data[i]+offset t_[#t_].flags=Type th_=(th_) and th_+1 or 1 else t[#t+1]={} t[#t].address=data[i]+offset t[#t].flags=w[3] or Type t[#t].value=w[1] tg_=(tg_) and tg_+1 or 1 if (w[4]==true) then local item={} item[#item+1]=t[#t] item[#item].freeze=w[4] gg.addListItems(item) end end end end tg=(tg_) and "\n已修改"..tg_.."条数据" or "" th=(th_) and "\n已获取"..th_.."条数据" or "" gg.setValues(t) t_=gg.getValues(t_) gg.loadResults(t_) gg.alert("\n"..Name.."搜索成功!\n偏移到"..#data.."条数据"..tg..th) tg_,th_=nil,nil else gg.toast("\n"..Name.."开启失败",false) return false end else gg.toast(Name.."开启失败") return false end end function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]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 gg.alert ( "开启失败" ) 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 gg.toast ( Name.."成功" ) end end function Get_Search(fname) 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 fname=fname or {} local m=getRanges() local many={} if "table"==type(fname) then--首信息1 for i in pairs(m) do local p=m[i].internalName:match("^.*/(.+)") if p==fname[1] and m[i].state==fname[2] then many={state=m[i].state,start=m[i].start} break end end elseif "string"==type(fname) then if "slow"==fname then--全信息 for i=1,#m do local p=m[i].internalName:match("^.*/(.+)") many[i]={name=p,state=m[i].state,start=m[i].start} end elseif "quick"==fname then--尾信息 for i=1,#m do local p=m[i].internalName:match("^.*/(.+)") many[p]={state=m[i].state,start=m[i].start} end else for i=1,#m do--首信息2 local p=m[i].internalName:match("^.*/(.+)") if p==fname then many={state=m[i].state,start=m[i].start} break end end if AddrInfoLen(many)~=2 then return false end end else error("填写'quick'或者'slow'或者文件名或者{文件名,状态}") end return many end function Get_Address(Head,Offset,Flag) local tinfom=gg.getTargetInfo() Flag=Flag or 32 local t={} local Addr if Head then t[1]={address=Head+Offset[1],flags=Flag} if not (#Offset==1) then for i=2,#Offset do local place=gg.getValues(t) t={} if not tinfom.x64 then place[1].value=place[1].value & 0xFFFFFFFF end t[1]={address=place[1].value+Offset[i],flags=Flag} end end Addr=t[1].address end return string.format("0x%X",Addr) end function SearchWrite(Search, Write, Type) gg.clearResults() gg.setVisible(false) gg.searchNumber(Search[1][1], Type) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Search[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Search do local tmp = {} local offset = Search[k][2] - base local num = Search[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = v.flags end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then local t = {} local base = Search[1][2] for i=1, #data do for k, w in ipairs(Write) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = Type t[#t].value = w[1] if (w[3] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) else return false end else return false end end JFYx32 = 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 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 local json = json ms = { } function setvalue ( add , value , falgs) qx={} qx[#qx+1]={} qx[#qx].value=value qx[#qx].flags=falgs qx[#qx].freeze=true qx[#qx].address=add gg.addListItems (qx) end il2cpp_so_x32 = 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 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 gg.alert ( "开启失败" ) 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 gg.toast ( Name.."成功" ) end end function py1(value,lx,py) gg.setVisible(false) 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 S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end function SearchWrite(Search, Write, Type, Name) local time=os.clock() gg.clearResults() gg.setVisible(false) gg.searchNumber(Search[1][1], Type) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Search[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Search do local tmp = {} local offset = Search[k][2] - base local num = Search[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = v.flags end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then gg.toast("搜索到"..#data.."条数据") local t = {} local base = Search[1][2] for i=1, #data do for k, w in ipairs(Write) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = Type t[#t].value = w[1] if (w[3] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) local time=string.sub(os.clock()-time,0,5) gg.toast("开启成功 已修改:"..#t.."条数据 本次启动耗时:"..time.."秒") gg.addListItems(t) else gg.toast("开启失败未搜索到任何数据", false) return false end else gg.toast("开启失败未搜索到任何数据") return false end end function WT(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 SearchWrite(Search, Write, Type) gg.clearResults() gg.setVisible(false) gg.searchNumber(Search[1][1], Type) local count = gg.getResultCount() local result = gg.getResults(count) gg.clearResults() local data = {} local base = Search[1][2] if (count > 0) then for i, v in ipairs(result) do v.isUseful = true end for k=2, #Search do local tmp = {} local offset = Search[k][2] - base local num = Search[k][1] for i, v in ipairs(result) do tmp[#tmp+1] = {} tmp[#tmp].address = v.address + offset tmp[#tmp].flags = v.flags end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if ( tostring(v.value) ~= tostring(num) ) then result[i].isUseful = false end end end for i, v in ipairs(result) do if (v.isUseful) then data[#data+1] = v.address end end if (#data > 0) then local t = {} local base = Search[1][2] for i=1, #data do for k, w in ipairs(Write) do offset = w[2] - base t[#t+1] = {} t[#t].address = data[i] + offset t[#t].flags = Type t[#t].value = w[1] if (w[3] == true) then local item = {} item[#item+1] = t[#t] item[#item].freeze = true gg.addListItems(item) end end end gg.setValues(t) else return false end else return false end end j={} xgz={} ZY='Main' gg.toast('欢迎使用科技') gg.clearResults() sj={} xgz={} gg.toast("欢迎进入") 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 search(ss,lx,nc,dz1,dz2) gg.setVisible(false) 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,536870912,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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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 editData(qmnb,qmxg)gg.setVisible(false)gg.clearResults()qmnbv=qmnb[3]["value"]or qmnb[3][1]qmnbt=qmnb[3]["type"]or qmnb[3][2]qmnbn=qmnb[2]["name"]or qmnb[2][1]gg.setRanges(qmnb[1]["memory"]or qmnb[1][1])gg.searchNumber(qmnbv,qmnbt)gg.refineNumber(qmnbv,qmnbt)sz=gg.getResultCount()if sz==0 then gg.toast(qmnbn.."开启失败")else sl=gg.getResults(999999)for i=1,sz do pdsz=true for v=4,#qmnb do if pdsz==true then pysz={{}}pysz[1].address=sl[i].address+(qmnb[v]["offset"]or qmnb[v][2])pysz[1].flags=qmnb[v]["type"]or qmnb[v][3]szpy=gg.getValues(pysz)tzszpd=tostring(qmnb[v]["lv"]or qmnb[v][1]):gsub(",","")pyszpd=tostring(szpy[1].value):gsub(",","")if tzszpd==pyszpd then pdjg=true pdsz=true else pdjg=false pdsz=false end end end if pdjg==true then szpy=sl[i].address for x=1,#qmxg do xgsz=qmxg[x]["value"]or qmxg[x][1]xgpy=szpy+(qmxg[x]["offset"]or qmxg[x][2])xglx=qmxg[x]["type"]or qmxg[x][3]xgdj=qmxg[x]["freeze"]or qmxg[x][4]xg={{address=xgpy,flags=xglx,value=xgsz}}if xgdj==true then xg[1].freeze=xgdj gg.addListItems(xg)else gg.setValues(xg)end end xgjg=true end end if xgjg==true then gg.toast(qmnbn.."开启成功")else gg.toast(qmnbn.."开启失败")end end end qmnb = function(daarr) local array = {} for i = 1, #daarr["搜索数组"] do local data = {["lv"] =daarr["搜索数组"][i][1], ["offset"] = daarr["搜索数组"][i][2], ["type"] = daarr["搜索类型"]} table.insert(array, i, data) end local isok, data = app.memorysearch(daarr["搜索内存"], array) if isok then for i = 1, #data do for x = 1, #daarr["修改数组"] do app.memorywrite(data[i] + daarr["修改数组"][x][2], daarr["搜索类型"], daarr["修改数组"][x][1]) end end gg.toast(daarr["功能名称"] .. "共修改" .. #data * #daarr["修改数组"] .. "条数据") else gg.toast(daarr["功能名称"] .. "开启失败") 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 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('') else gg.toast('') end end function bc(bz) if sj~=nil then _ENV[bz]=sj else gg.toast('') end end Qr_UIP2FazG='Main' gg.clearResults() sj={} xgz={} gg.toast("欢迎使用老板脚本很好用采用独家配置") 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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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[i]={} z1[i].address=sj[i].address+py z1[i].flags=lx end z1=gg.getValues(z1) for i=1,#sj do if z1[i].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 BaAdd(add) if gg.getTargetInfo().x64==true then t=gg.getValues({[1]={address=add,flags=32}}) return t[1].value else t=gg.getValues({[1]={address=add,flags=4}}) return t[1].value&0xFFFFFFFF end end function set(dz,xg,lx,dj) if dj=="true" then gg.addListItems({{address=dz,flags=lx,value=xg,freeze=true}}) else gg.setValues({{address=dz,flags=lx,value=xg}}) end gg.toast("已修改完成~") end DWORD=gg.TYPE_DWORD DOUBLE=gg.TYPE_DOUBLE FLOAT=gg.TYPE_FLOAT WORD=gg.TYPE_WORD BYTE=gg.TYPE_BYTE XOR=gg.TYPE_XOR QWORD=gg.TYPE_QWORD D=gg.TYPE_DWORD E=gg.TYPE_DOUBLE F=gg.TYPE_FLOAT W=gg.TYPE_WORD B=gg.TYPE_BYTE X=gg.TYPE_XOR Q=gg.TYPE_QWORD -------------不懂勿动------------ ------------道具赛配置--------------- gg.clearResults() j={} xgz={} ZY = 'Main' gg.clearResults() sj={} xgz={} function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end ---------秒开配置---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function readPointer(name, offset, i) local re=gg.getRangesList(name) local x64=gg.getTargetInfo().x64 local va={[true]=32,[false]=4} if re[i or 1] then local addr=re[i or 1].start+offset[1] for i = 2,#offset do addr = gg.getValues({{address=addr,flags=va[x64]}}) if not x64 then addr[1].value = addr[1].value & 0xFFFFFFFF end addr = addr[1].value + offset[i] end return addr end end gg.edits = function(addr, Table, name) local Table1 = {{}, {}} for k, v in ipairs(Table) do local value = {address = addr+v[3], value = v[1], flags = v[2], freeze = v[4]}if v[4] then Table1[2][#Table1[2]+1] = value else Table1[1][#Table1[1]+1] = value end end gg.addListItems(Table1[2])gg.setValues(Table1[1]) gg.toast((name or "") .. "开启成功, 共修改"..#Table.."个值") end gg.clearResults() j={} xgz={} ZY = 'Main' gg.clearResults() sj={} xgz={} function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end ---------秒开配置------------------------------------------------------ ------------------------------------防抓包-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- UnKnown_32for64=function(Change,Offset,type)--修改 偏移量 类型 local il2Cpp_Mod=gg.getRangesList('il2cpp.so') local Py=il2Cpp_Mod[1] local x32Bit = gg.getTargetInfo().x32 local x64Bit = gg.getTargetInfo().x64 if il2Cpp_Mod == nil then mods=gg.alert('未存在il2cpp.so\n\n请检查你的进程','继续','Exit') if mods==2 then os.exit()end end gg.processPause ( ) gg.setValues({{address=Py.start+Offset,flags=type,value=Change}}) if x32Bit == gg.getTargetInfo().x32 then gg.setValues({{address=Py.start+Offset+4,flags=type,value='~A bx lr'}}) gg.processResume ( ) --gg.toast(name..'\nOpenedSuccessfulXL') else if x64Bit == gg.getTargetInfo().x64 then gg.setValues({{address=Py.start+Offset+4,flags=type,value='~A ret'}}) gg.processResume ( ) --gg.toast(name..'\nOpenedSuccessfulXL') end end end --------------------------------新手---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- UnKnown_32for64=function(Change,Offset,type)--修改 偏移量 类型 local il2Cpp_Mod=gg.getRangesList('il2cpp.so') local Py=il2Cpp_Mod[1] local x32Bit = gg.getTargetInfo().x32 local x64Bit = gg.getTargetInfo().x64 if il2Cpp_Mod == nil then mods=gg.alert('未存在il2cpp.so\n\n请检查你的进程','继续','Exit') if mods==2 then os.exit()end end gg.processPause ( ) gg.setValues({{address=Py.start+Offset,flags=type,value=Change}}) if x32Bit == gg.getTargetInfo().x32 then gg.setValues({{address=Py.start+Offset+4,flags=type,value='~A bx lr'}}) gg.processResume ( ) --gg.toast(name..'\nOpenedSuccessfulXL') else if x64Bit == gg.getTargetInfo().x64 then gg.setValues({{address=Py.start+Offset+4,flags=type,value='~A ret'}}) gg.processResume ( ) --gg.toast(name..'\nOpenedSuccessfulXL') end end end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- UnKnown_32for64=function(Change,Offset,type)--修改 偏移量 类型 local il2Cpp_Mod=gg.getRangesList('il2cpp.so') local Py=il2Cpp_Mod[1] local x32Bit = gg.getTargetInfo().x32 local x64Bit = gg.getTargetInfo().x64 if il2Cpp_Mod == nil then mods=gg.alert('未存在il2cpp.so\n\n请检查你的进程','继续','Exit') if mods==2 then os.exit()end end gg.processPause ( ) gg.setValues({{address=Py.start+Offset,flags=type,value=Change}}) if x32Bit == gg.getTargetInfo().x32 then gg.setValues({{address=Py.start+Offset+4,flags=type,value='~A bx lr'}}) gg.processResume ( ) --gg.toast(name..'\nOpenedSuccessfulXL') else if x64Bit == gg.getTargetInfo().x64 then gg.setValues({{address=Py.start+Offset+4,flags=type,value='~A ret'}}) gg.processResume ( ) --gg.toast(name..'\nOpenedSuccessfulXL') end end end ---------------------------------------------------------------------------------------------------- function readValue(address, flags) return gg.getValues({{address = address, flags = flags}})[1]["value"]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 gg.alert ( "开启失败" ) 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 gg.toast ( Name.."成功" ) end end --------------奖杯配置---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function HGYYDS(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"}}) gg.toast("开启成功") end end function _error() gg.alert([[ 开启失败 失败原因:进程存储太小! 解决方案:刷新进程后重启开启 ]]) end function zrgn(zr) io.open("/sdcard/.载入","w+"):write([[ zr ]]) gg.loadList("/sdcard/.载入", gg.LOAD_VALUES) os.remove("/sdcard/.载入") string.toMusic("开启成功") gg.toast("开启成功") end 大标题='魔神全防' --初始颜色,填写十六进制RGB --可在功能按钮里调用TLColor()随时自定义切换 --例如:TLColor(0xffFF0023) --可以在开启某个功能的同时变色,比如开了防封变绿色,开了高危功能变红色 控件颜色=0xff545454 颜色表={--切换颜色的列表 0xff33AF61, 0xffFFB94D, 0xffFF0023, 0xff008CFF, 0xffA6FF00, 0xffFF95F2, 0xff946AFF, 0xff000000, 0xff545454, } BL = {} BL.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 BL.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 BL.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 BL.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 TL.controlRotation2 = function(control, time) luajava.runUiThread(function() import "android.view.animation.Animation" import "android.animation.ObjectAnimator" xuanzhuandonghua = ObjectAnimator:ofFloat(control, "rotation", { 0, 360 }) xuanzhuandonghua:setRepeatCount(0) xuanzhuandonghua:setRepeatMode(Animation.RESTART) xuanzhuandonghua:setDuration(time) xuanzhuandonghua:start() end) end TL.stopRotation = function() if xuanzhuandonghua then xuanzhuandonghua:cancel() end end TL.controlFlip = function(control,time) luajava.runUiThread(function() import "android.view.animation.Animation" import "android.animation.ObjectAnimator" xuanzhuandonghua1 = ObjectAnimator:ofFloat(control, "rotationY", {0, 360}) xuanzhuandonghua1:setRepeatCount(0) xuanzhuandonghua1:setRepeatMode(Animation.REVERSE) xuanzhuandonghua1:setDuration(time) xuanzhuandonghua1:start() end) end zidong = luajava.newThread(function() while true do if zdbf then logvid = luajava.getIdView("video") logvid.start(logvid) end gg.sleep(500) end end) url="https://api.qqsuu.cn/api/dm-xjj?type=video&apiKey=56ecfa25f1478b202b174b7e871a5a61" bloc = luajava.getBlock() local runnable = luajava.getRunnable(function() vidd=luajava.loadlayout({ VideoView, id = luajava.newId('video'), videoPath = url, layout_width = "220dp", layout_height = "280dp", }) bloc("end") end) local handler = luajava.getHandler() handler:post(runnable) bloc("join") web6 = luajava.loadlayout({FrameLayout, gravity="top|center_vertical", {LinearLayout, gravity="center",orientation="vertical", vidd,TL.button("换一个", function() zdbf=false TL.controlFlip(web6,2500) gg.sleep(500) logvid = luajava.getIdView("video") logvid:setVideoPath(url) gg.sleep(2000) zdbf=true end), },{LinearLayout, gravity="top|center_vertical", TL.switch("打开视频", function() zdbf = true end, function() zdbf=false logvid = luajava.getIdView("video") logvid.pause(logvid) end), },}) zdbf=false zidong:start() 公告内容="魔神科技最强" 卡网="https://cccimg.com/view.php/19cca10af97b093668ae51f849182128.jpg" 悬浮窗图标="https://cccimg.com/view.php/cb9b51af3b9e8873215908230d023faf.png" stab = { -- 菜单标题 "主页" , "防封" , "刷号" , "竞赛" , "音乐" , "视频" , "设置" , } TL.menu({ {--第一页 launchui, TL.button( "切换颜色", function() 预置颜色()--这个是在上边颜色表内切换下一个 --写TLColor(0xffFF0023)可以自定义切换颜色 改括号里的十六进制RGB end), tiaose(), TL.text("魔神脚本","#FF00FFFF","20sp"), TL.text("支持版本:里约版本","#FF00FFFF","16sp"), TL.text("魔神官方群:760403856","#2EFF92","12sp"), TL.text("随机一言:"..K), TL.button("选择进程" , function() string.toMusic('请选择地铁跑酷进程') gg.setProcessX() end), TL.button('启动水印', function() draw3 = require('draw3') text1 = draw3.text("哈哈内部", 350,215) text2 = draw3.text("官方群:567383618", 350,320) local color1 = ("#FFB000FF") local color2 = ("#FFFF902C") text1.setColor(color1)-- 设置随机颜色 text2.setColor(color3)-- 设置随机颜色 end), TL.button("地铁启动" , function() gg.jumpAPP("com.kiloo.subwaysurf") end, function() end), TL.button("加入我们" , function() qq.joinGroup("760403856") end, function() end), TL.button("召唤作者", function () ---@type ui local ui = require('ui') ---@type windowManager local windowManager = require('windowManager') do local path = file.getCacheName('9b78f722.gif') -- 通过文件MD5判断是否有缓存文件 if not file.md5(path, '0fe37fb6ef265d527ba8ed9280efab27') then assert(downloadLanzou('https://lanzoux.com/iadwQ1io64ba', { passwd = 'a8go' }, path)) else -- print('缓存了') end -- GifImageView:android.widget.ImageView local gifImageView = luajava.loadlayout({ 'ui.GifImageView', src = path, }) local viewManager=windowManager:bindView(gifImageView) viewManager:setMoveable(true) viewManager:show() viewManager:park() end end), TL.switch( '音量键隐藏UI', function() 音量键=true end, function() 音量键=false end), },{ TL.button("隐蔽账号", function() XY(0x2CE160C,4,"~A MOVW R0, #0") XY(0x2CE155C,4,"~A MOVW R0, #0") XY(0x2CE16BC,4,"~A MOVW R0, #0") XY(0x2CE181C,4,"~A MOVW R0, #0") XY(0x2CE18CC,4,"~A MOVW R0, #0") XY(0x2CE197C,4,"~A MOVW R0, #0") XY(0x159BB50,4,"~A MOVW R0, #0") XY(0x2CD2E8C,4,"~A MOVW R0, #0") XY(0x1C51A1C,4,"~A MOVW R0, #0") XY(0x1C56118,4,"~A MOVW R0, #0") XY(0x1C561D8,4,"~A MOVW R0, #0") XY(0x1C5654C,4,"~A MOVW R0, #0") XY(0x10FBF00,4,"~A MOVW R0, #0") gg.toast("检测关闭成功") end ), TL.button("过ace检测", function() zrgn([[ 11757 Var #CDFE94D4|cdfe94d4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4d4 Var #CDFE94DC|cdfe94dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4dc Var #CDFE9528|cdfe9528|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|528 Var #CDFE9574|cdfe9574|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|574 Var #CDFE9588|cdfe9588|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|588 Var #CDFE95D0|cdfe95d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|5d0 Var #CDFE983C|cdfe983c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|83c Var #CDFE984C|cdfe984c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|84c Var #CDFE985C|cdfe985c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|85c Var #CDFE9864|cdfe9864|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|864 Var #CDFE986C|cdfe986c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|86c Var #CDFE989C|cdfe989c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|89c Var #CDFE9924|cdfe9924|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|924 Var #CDFE99AC|cdfe99ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ac Var #CDFE99D8|cdfe99d8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d8 Var #CDFE99E4|cdfe99e4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e4 Var #CDFE9A4C|cdfe9a4c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a4c Var #CDFE9A78|cdfe9a78|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a78 Var #CDFE9A8C|cdfe9a8c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a8c Var #CDFE9AC0|cdfe9ac0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ac0 Var #CDFE9B30|cdfe9b30|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b30 Var #CDFEAB54|cdfeab54|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1b54 Var #CDFEAB5C|cdfeab5c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1b5c Var #CDFEAB64|cdfeab64|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1b64 Var #CDFEABD0|cdfeabd0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1bd0 Var #CDFEE4DC|cdfee4dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|54dc Var #CDFEE55C|cdfee55c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|555c Var #CDFEE58C|cdfee58c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|558c Var #CDFEE5A4|cdfee5a4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|55a4 Var #CDFEE5B0|cdfee5b0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|55b0 Var #CDFEE620|cdfee620|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|5620 Var #CDFEE6A4|cdfee6a4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|56a4 Var #CDFEE6AC|cdfee6ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|56ac Var #CDFEE6D0|cdfee6d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|56d0 Var #CDFF1708|cdff1708|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8708 Var #CDFF1728|cdff1728|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8728 Var #CDFF1730|cdff1730|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8730 Var #CDFFD004|cdffd004|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|14004 Var #CDFFD020|cdffd020|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|14020 Var #CE000DF8|ce000df8|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|df8 Var #CE000E28|ce000e28|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|e28 Var #CE000E58|ce000e58|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|e58 Var #CE000EE8|ce000ee8|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|ee8 Var #CE000F18|ce000f18|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|f18 Var #CE000F48|ce000f48|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|f48 Var #CE000F78|ce000f78|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|f78 Var #CE000FA8|ce000fa8|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|fa8 Var #CE000FD8|ce000fd8|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|fd8 Var #CE001008|ce001008|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|1008 Var #CE001038|ce001038|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|1038 Var #CE001068|ce001068|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|1068 Var #CE001098|ce001098|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|1098 Var #CE0010C8|ce0010c8|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|10c8 Var #CE0010F8|ce0010f8|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|10f8 Var #CE001128|ce001128|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|1128 Var #CE001158|ce001158|4|0|1|0|0|0|r-xp|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libsecsdk.so|1158 ]]) end), TL.button("关闭ace", function() zrgn([[11757 Var #CDFECE34|cdfece34|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|3e34 ]]) end), TL.button("防检测", function() zrgn([[ 25473 Var #CB065AC0|cb065ac0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ac0 Var #CB066B54|cb066b54|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1b54 Var #CB066B5C|cb066b5c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1b5c Var #CB066B64|cb066b64|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1b64 Var #CB066B94|cb066b94|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1b94 Var #CB066BA0|cb066ba0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1ba0 Var #CB066BD0|cb066bd0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1bd0 Var #CB066CE8|cb066ce8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1ce8 Var #CB066CF4|cb066cf4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1cf4 Var #CB066D00|cb066d00|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1d00 Var #CB06A690|cb06a690|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|5690 Var #CB06DAB8|cb06dab8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8ab8 Var #CB06DB58|cb06db58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8b58 Var #CB06DD20|cb06dd20|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8d20 Var #CB06DEF8|cb06def8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8ef8 Var #CB06DFA0|cb06dfa0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8fa0 Var #CB06DFB8|cb06dfb8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8fb8 Var #CB06E008|cb06e008|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9008 Var #CB06E074|cb06e074|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9074 Var #CB06E1AC|cb06e1ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91ac Var #CB06E1B8|cb06e1b8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91b8 Var #CB06E1D0|cb06e1d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91d0 Var #CB06E284|cb06e284|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9284 Var #CB06E2EC|cb06e2ec|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|92ec Var #CB06E340|cb06e340|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9340 Var #CB06E350|cb06e350|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9350 Var #CB06E368|cb06e368|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9368 Var #CB06E380|cb06e380|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9380 Var #CB06E41C|cb06e41c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|941c Var #CB06E8D8|cb06e8d8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|98d8 Var #CB06E938|cb06e938|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9938 Var #CB06E974|cb06e974|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9974 Var #CB06EA8C|cb06ea8c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9a8c Var #CB06EA94|cb06ea94|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9a94 Var #CB06EAC8|cb06eac8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ac8 Var #CB06EAF4|cb06eaf4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9af4 Var #CB06EB7C|cb06eb7c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9b7c Var #CB06EB88|cb06eb88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9b88 Var #CB06EB98|cb06eb98|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9b98 Var #CB06EBC8|cb06ebc8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9bc8 Var #CB06EC0C|cb06ec0c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9c0c Var #CB06EC90|cb06ec90|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9c90 Var #CB06ECA0|cb06eca0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ca0 Var #CB06ED68|cb06ed68|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d68 Var #CB06EDF8|cb06edf8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9df8 Var #CB06EE28|cb06ee28|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e28 Var #CB06EE58|cb06ee58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e58 Var #CB06EE80|cb06ee80|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e80 Var #CB06EEB4|cb06eeb4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9eb4 Var #CB06EEF8|cb06eef8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ef8 Var #CB06F028|cb06f028|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a028 Var #CB06F044|cb06f044|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a044 Var #CB06F098|cb06f098|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a098 Var #CB06F0B4|cb06f0b4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a0b4 Var #CB06F0D4|cb06f0d4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a0d4 Var #CB06F2AC|cb06f2ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a2ac Var #CB06F2DC|cb06f2dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a2dc Var #CB06F334|cb06f334|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a334 Var #CB06F35C|cb06f35c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a35c Var #CB06F378|cb06f378|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a378 Var #CB06F3A0|cb06f3a0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3a0 Var #CB06F3C8|cb06f3c8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3c8 Var #CB06F3DC|cb06f3dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3dc Var #CB06F434|cb06f434|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a434 Var #CB06F59C|cb06f59c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a59c Var #CB06F61C|cb06f61c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a61c Var #CB06F63C|cb06f63c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a63c Var #CB06F79C|cb06f79c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a79c Var #CB0700F0|cb0700f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b0f0 Var #CB070100|cb070100|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b100 Var #CB070120|cb070120|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b120 Var #CB070E70|cb070e70|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|be70 Var #CB070E88|cb070e88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|be88 Var #CB070F20|cb070f20|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|bf20 Var #CB073950|cb073950|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|e950 Var #CB0739CC|cb0739cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|e9cc Var #CB073BA0|cb073ba0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|eba0 Var #CB0740F0|cb0740f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|f0f0 Var #CB074A6C|cb074a6c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fa6c Var #CB074D24|cb074d24|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fd24 Var #CB0751A8|cb0751a8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|101a8 Var #CB075200|cb075200|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10200 Var #CB0752CC|cb0752cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|102cc Var #CB07535C|cb07535c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1035c Var #CB075380|cb075380|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10380 Var #CB0753A4|cb0753a4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|103a4 Var #CB0754E8|cb0754e8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|104e8 Var #CB075534|cb075534|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10534 Var #CB07566C|cb07566c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1066c Var #CB0756FC|cb0756fc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|106fc Var #CB075C58|cb075c58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10c58 Var #CB075F78|cb075f78|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10f78 Var #CB075F88|cb075f88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10f88 ]]) end), TL.button("防行为", function() zrgn([[ 16906 Var #CB119A58|cb119a58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a58 Var #CB11E690|cb11e690|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|5690 Var #CB121800|cb121800|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8800 Var #CB121890|cb121890|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8890 Var #CB121904|cb121904|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8904 Var #CB12190C|cb12190c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|890c Var #CB121914|cb121914|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8914 Var #CB121AB8|cb121ab8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8ab8 Var #CB121B58|cb121b58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8b58 Var #CB121D20|cb121d20|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8d20 Var #CB121EF8|cb121ef8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8ef8 Var #CB121F08|cb121f08|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8f08 Var #CB121F10|cb121f10|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8f10 Var #CB121FA0|cb121fa0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8fa0 Var #CB121FB8|cb121fb8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8fb8 Var #CB122008|cb122008|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9008 Var #CB12201C|cb12201c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|901c Var #CB122074|cb122074|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9074 Var #CB12207C|cb12207c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|907c Var #CB122134|cb122134|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9134 Var #CB1221AC|cb1221ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91ac Var #CB1221B8|cb1221b8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91b8 Var #CB1221D0|cb1221d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91d0 Var #CB122284|cb122284|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9284 Var #CB1222AC|cb1222ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|92ac Var #CB1222EC|cb1222ec|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|92ec Var #CB122348|cb122348|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9348 Var #CB122350|cb122350|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9350 Var #CB122368|cb122368|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9368 Var #CB122380|cb122380|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9380 Var #CB12241C|cb12241c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|941c Var #CB1228D8|cb1228d8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|98d8 Var #CB122938|cb122938|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9938 Var #CB122974|cb122974|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9974 Var #CB122A8C|cb122a8c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9a8c Var #CB122A94|cb122a94|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9a94 Var #CB122AC8|cb122ac8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ac8 Var #CB122AE4|cb122ae4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ae4 Var #CB122AF4|cb122af4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9af4 Var #CB122AFC|cb122afc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9afc Var #CB122B7C|cb122b7c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9b7c Var #CB122B84|cb122b84|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9b84 Var #CB122BC4|cb122bc4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9bc4 Var #CB122BC8|cb122bc8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9bc8 Var #CB122C0C|cb122c0c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9c0c Var #CB122C90|cb122c90|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9c90 Var #CB122CA0|cb122ca0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ca0 Var #CB122D48|cb122d48|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d48 Var #CB122D68|cb122d68|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d68 Var #CB122D80|cb122d80|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d80 Var #CB122DF8|cb122df8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9df8 Var #CB122E08|cb122e08|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e08 Var #CB122E28|cb122e28|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e28 Var #CB122E58|cb122e58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e58 Var #CB122E80|cb122e80|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e80 Var #CB122EB4|cb122eb4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9eb4 Var #CB123028|cb123028|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a028 Var #CB123098|cb123098|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a098 Var #CB1230B4|cb1230b4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a0b4 Var #CB1230D4|cb1230d4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a0d4 Var #CB123154|cb123154|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a154 Var #CB1231A0|cb1231a0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a1a0 Var #CB1232AC|cb1232ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a2ac Var #CB1232DC|cb1232dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a2dc Var #CB123334|cb123334|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a334 Var #CB12335C|cb12335c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a35c Var #CB1233A0|cb1233a0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3a0 Var #CB1233C8|cb1233c8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3c8 Var #CB1233DC|cb1233dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3dc Var #CB123434|cb123434|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a434 Var #CB12359C|cb12359c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a59c Var #CB1235C4|cb1235c4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a5c4 Var #CB12361C|cb12361c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a61c Var #CB12363C|cb12363c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a63c Var #CB12379C|cb12379c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a79c Var #CB1240F0|cb1240f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b0f0 Var #CB124100|cb124100|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b100 Var #CB124120|cb124120|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b120 Var #CB124E70|cb124e70|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|be70 Var #CB124E88|cb124e88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|be88 Var #CB124F20|cb124f20|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|bf20 Var #CB124FCC|cb124fcc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|bfcc Var #CB125550|cb125550|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|c550 Var #CB127950|cb127950|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|e950 Var #CB1279CC|cb1279cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|e9cc Var #CB127B98|cb127b98|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|eb98 Var #CB127BA0|cb127ba0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|eba0 Var #CB1280F0|cb1280f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|f0f0 Var #CB1287B8|cb1287b8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|f7b8 Var #CB128A6C|cb128a6c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fa6c Var #CB128D24|cb128d24|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fd24 Var #CB128DE8|cb128de8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fde8 Var #CB128F38|cb128f38|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ff38 Var #CB128FF0|cb128ff0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fff0 Var #CB1290C4|cb1290c4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|100c4 Var #CB1290F0|cb1290f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|100f0 Var #CB129118|cb129118|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10118 Var #CB129134|cb129134|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10134 Var #CB1291A8|cb1291a8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|101a8 Var #CB129200|cb129200|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10200 Var #CB129244|cb129244|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10244 Var #CB129254|cb129254|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10254 Var #CB129264|cb129264|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10264 Var #CB1292CC|cb1292cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|102cc Var #CB1292D8|cb1292d8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|102d8 Var #CB129F78|cb129f78|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10f78 Var #CB129F88|cb129f88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10f88 Var #CB12B158|cb12b158|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12158 Var #CB12B1D4|cb12b1d4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|121d4 Var #CB12B234|cb12b234|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12234 Var #CB12B264|cb12b264|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12264 Var #CB12B274|cb12b274|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12274 Var #CB12B2DC|cb12b2dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|122dc Var #CB12B32C|cb12b32c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1232c Var #CB12B388|cb12b388|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12388 Var #CB12B41C|cb12b41c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1241c Var #CB12B440|cb12b440|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12440 Var #CB12B4CC|cb12b4cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|124cc Var #CB12B520|cb12b520|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12520 Var #CB12B550|cb12b550|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12550 Var #CB12C24C|cb12c24c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1324c ]]) end), TL.button("防闪", function() zrgn([[ 27764 Var #CAF99004|caf99004|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|4 Var #CAF99008|caf99008|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|8 Var #CAF9900C|caf9900c|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|c Var #CAF99010|caf99010|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|10 Var #CAF99014|caf99014|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|14 Var #CAF99028|caf99028|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|28 Var #CAF99038|caf99038|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|38 Var #CAF99040|caf99040|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|40 Var #CAF99044|caf99044|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|44 Var #CAF99048|caf99048|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|48 Var #CAF9904C|caf9904c|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|4c Var #CAF99054|caf99054|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|54 Var #CAF99058|caf99058|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|58 Var #CAF9905C|caf9905c|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|5c Var #CAF99060|caf99060|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|60 Var #CAF99064|caf99064|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|64 Var #CAF99068|caf99068|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|68 Var #CAF9906C|caf9906c|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|6c Var #CAF99070|caf99070|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|70 Var #CAF99074|caf99074|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|74 Var #CAF99078|caf99078|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|78 Var #CAF990A8|caf990a8|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|a8 Var #CAF990AC|caf990ac|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|ac Var #CAF990B0|caf990b0|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|b0 Var #CAF990B4|caf990b4|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|b4 Var #CAF990B8|caf990b8|4|ffffffff|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so|b8 ]]) gg.setRanges(8) gg.searchNumber("778923875", gg.TYPE_DWORD,false,gg.SIGN_EQUAL,0, -1) gg.searchNumber("778923875", gg.TYPE_DWORD,false,gg.SIGN_EQUAL,0,-1) jg=gg.getResults(100) sl=gg.getResultCount() for i = 1, sl do dzy=jg[i].address gg.addListItems({[1] = {address = dzy,flags = gg.TYPE_DWORD,freeze = true,value = -1}}) end gg.toast("防闪开启成功!") gg.clearResults() string.toMusic('防闪开启成功') end), TL.button("全防", function() zrgn([[ 27764 Var #CAFDC4D0|cafdc4d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4d0 Var #CAFDC4D4|cafdc4d4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4d4 Var #CAFDC4DC|cafdc4dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4dc Var #CAFDC4EC|cafdc4ec|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4ec Var #CAFDC4F0|cafdc4f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4f0 Var #CAFDC4F4|cafdc4f4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4f4 Var #CAFDC4F8|cafdc4f8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4f8 Var #CAFDC4FC|cafdc4fc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4fc Var #CAFDC500|cafdc500|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|500 Var #CAFDC504|cafdc504|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|504 Var #CAFDC508|cafdc508|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|508 Var #CAFDC50C|cafdc50c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|50c Var #CAFDC510|cafdc510|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|510 Var #CAFDC528|cafdc528|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|528 Var #CAFDC574|cafdc574|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|574 Var #CAFDC580|cafdc580|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|580 Var #CAFDC584|cafdc584|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|584 Var #CAFDC5D0|cafdc5d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|5d0 Var #CAFDC81C|cafdc81c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|81c Var #CAFDC83C|cafdc83c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|83c Var #CAFDC84C|cafdc84c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|84c Var #CAFDC85C|cafdc85c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|85c Var #CAFDC864|cafdc864|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|864 Var #CAFDC86C|cafdc86c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|86c Var #CAFDC89C|cafdc89c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|89c Var #CAFDC924|cafdc924|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|924 Var #CAFDC9AC|cafdc9ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ac Var #CAFDC9D8|cafdc9d8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d8 Var #CAFDC9E4|cafdc9e4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e4 Var #CAFDCA0C|cafdca0c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a0c Var #CAFDCA4C|cafdca4c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a4c Var #CAFDCA54|cafdca54|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a54 Var #CAFDCA58|cafdca58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a58 Var #CAFDCA60|cafdca60|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a60 Var #CAFDCA6C|cafdca6c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a6c Var #CAFDCA78|cafdca78|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a78 Var #CAFDCA84|cafdca84|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a84 Var #CAFDCA88|cafdca88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a88 Var #CAFDCA8C|cafdca8c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a8c Var #CAFDCAC0|cafdcac0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ac0 Var #CAFDCAD4|cafdcad4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ad4 Var #CAFDCADC|cafdcadc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|adc Var #CAFDCAE4|cafdcae4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ae4 Var #CAFDCAEC|cafdcaec|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|aec Var #CAFDCAF4|cafdcaf4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|af4 Var #CAFDCAFC|cafdcafc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|afc Var #CAFDCB04|cafdcb04|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b04 Var #CAFDCB0C|cafdcb0c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b0c Var #CAFDCB14|cafdcb14|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b14 Var #CAFDCB1C|cafdcb1c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b1c Var #CAFDCB24|cafdcb24|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b24 Var #CAFDCB30|cafdcb30|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b30 Var #CAFDDC60|cafddc60|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1c60 Var #CAFE0274|cafe0274|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|4274 Var #CAFE07E8|cafe07e8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|47e8 Var #CAFE4800|cafe4800|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8800 Var #CAFE4FA0|cafe4fa0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|8fa0 Var #CAFE5008|cafe5008|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9008 Var #CAFE5074|cafe5074|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9074 Var #CAFE51AC|cafe51ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91ac Var #CAFE51D0|cafe51d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|91d0 Var #CAFE5284|cafe5284|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9284 Var #CAFE52EC|cafe52ec|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|92ec Var #CAFE5348|cafe5348|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9348 Var #CAFE5350|cafe5350|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9350 Var #CAFE5A8C|cafe5a8c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9a8c Var #CAFE5A94|cafe5a94|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9a94 Var #CAFE5AC8|cafe5ac8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ac8 Var #CAFE5AF4|cafe5af4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9af4 Var #CAFE5AFC|cafe5afc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9afc Var #CAFE5B7C|cafe5b7c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9b7c Var #CAFE5B84|cafe5b84|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9b84 Var #CAFE5BC4|cafe5bc4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9bc4 Var #CAFE5C0C|cafe5c0c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9c0c Var #CAFE5C90|cafe5c90|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9c90 Var #CAFE5CA0|cafe5ca0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9ca0 Var #CAFE5D48|cafe5d48|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d48 Var #CAFE5D68|cafe5d68|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d68 Var #CAFE5D80|cafe5d80|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9d80 Var #CAFE5DBC|cafe5dbc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9dbc Var #CAFE5DF8|cafe5df8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9df8 Var #CAFE5E08|cafe5e08|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e08 Var #CAFE5E28|cafe5e28|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e28 Var #CAFE5E34|cafe5e34|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e34 Var #CAFE5E58|cafe5e58|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e58 Var #CAFE5E80|cafe5e80|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|9e80 Var #CAFE6028|cafe6028|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a028 Var #CAFE6098|cafe6098|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a098 Var #CAFE60B4|cafe60b4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a0b4 Var #CAFE60D4|cafe60d4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a0d4 Var #CAFE6154|cafe6154|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a154 Var #CAFE6194|cafe6194|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a194 Var #CAFE61A0|cafe61a0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a1a0 Var #CAFE61D0|cafe61d0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a1d0 Var #CAFE62AC|cafe62ac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a2ac Var #CAFE62DC|cafe62dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a2dc Var #CAFE6334|cafe6334|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a334 Var #CAFE635C|cafe635c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a35c Var #CAFE6378|cafe6378|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a378 Var #CAFE63A0|cafe63a0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3a0 Var #CAFE63C8|cafe63c8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3c8 Var #CAFE63DC|cafe63dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a3dc Var #CAFE6434|cafe6434|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a434 Var #CAFE659C|cafe659c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a59c Var #CAFE65C4|cafe65c4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a5c4 Var #CAFE661C|cafe661c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a61c Var #CAFE663C|cafe663c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a63c Var #CAFE679C|cafe679c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|a79c Var #CAFE7100|cafe7100|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b100 Var #CAFE7120|cafe7120|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|b120 Var #CAFE7E70|cafe7e70|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|be70 Var #CAFE7E88|cafe7e88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|be88 Var #CAFE7F20|cafe7f20|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|bf20 Var #CAFE7FCC|cafe7fcc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|bfcc Var #CAFE8060|cafe8060|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|c060 Var #CAFE8550|cafe8550|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|c550 Var #CAFEA9CC|cafea9cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|e9cc Var #CAFEAB98|cafeab98|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|eb98 Var #CAFEABA0|cafeaba0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|eba0 Var #CAFEB0F0|cafeb0f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|f0f0 Var #CAFEB7B8|cafeb7b8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|f7b8 Var #CAFEBA6C|cafeba6c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fa6c Var #CAFEBD24|cafebd24|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fd24 Var #CAFEBF38|cafebf38|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ff38 Var #CAFEBFAC|cafebfac|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|ffac Var #CAFEBFF0|cafebff0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|fff0 Var #CAFEC050|cafec050|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10050 Var #CAFEC0C4|cafec0c4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|100c4 Var #CAFEC0F0|cafec0f0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|100f0 Var #CAFEC118|cafec118|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10118 Var #CAFEC134|cafec134|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10134 Var #CAFEC1A8|cafec1a8|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|101a8 Var #CAFEC264|cafec264|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10264 Var #CAFEC2CC|cafec2cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|102cc Var #CAFEC2E0|cafec2e0|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|102e0 Var #CAFEC35C|cafec35c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1035c Var #CAFEC380|cafec380|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10380 Var #CAFEC3A4|cafec3a4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|103a4 Var #CAFECF78|cafecf78|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10f78 Var #CAFECF88|cafecf88|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|10f88 Var #CAFEE158|cafee158|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12158 Var #CAFEE1D4|cafee1d4|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|121d4 Var #CAFEE234|cafee234|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12234 Var #CAFEE2DC|cafee2dc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|122dc Var #CAFEE41C|cafee41c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1241c Var #CAFEE440|cafee440|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|12440 Var #CAFEE4CC|cafee4cc|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|124cc Var #CAFEF24C|cafef24c|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|1324c Var #CAFF0004|caff0004|4|0|1|0|0|0|rw-p|/data/data/com.yulong.yljt/gameplugins/com.kiloo.subwaysurf/lib/libtersafe2.so:bss|14004 ]]) end), },{ TL.button("人物全解", function() HGZDG("人物全解","PlayerInfo","IsCollectionComplete",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("滑板全解", function() HGZDG("滑板全解","PlayerInfo","isHoverboardUnlocked",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("背饰全解", function() HGZDG("背饰全解","PlayerInfo","IsOrnamentUnlocked",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("像框全解", function() HGZDG("头像框全解","AvatarFrameManager","IsAvatarFrameOwned",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("角色装扮", function() HGZDG("装扮全解","PlayerInfo","IsThemeUnlockedForCharacter",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("滑板技能", function() HGZDG("滑板技能","HoverboardCustomizationData","IsThemeOwned",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("解锁微博", function() HGZDG("微博特权","WeiboManager","get_HasBindWeibo",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("超长名字", function() HGZDG("超长名","NickNamePopup","UIInputChange",4,"~A MOV R0, #1","1EFF2FE1r") HGZDG("超长名","NickNamePopup","UIInputChange",4,"~A B +0x00000148","1EFF2FE1r") end, function() end), TL.button("备份数据", function() HGZDG("允许当前账号保存数据","PlayerInfo","CanSaveData",4,"~A MOV R0, #1","1EFF2FE1r") HGZDG("创建任务保存数据","PlayerInfo","GetMissionSaveData",4,"~A MOV R0, #1","1EFF2FE1r") HGZDG("直接备份游戏数据","OnlineSettings","BackupGameData",4,"~A MOV R0, #1","1EFF2FE1r") end), TL.button("修改等级", function() XC = gg.prompt({'请输入需要的人物等级,改太高会进不去游戏'},{[1]=30},{[1]='number'})[1] HGZDG("全版本","PlayerInfo","get_missionCompletedSum",4,"~A MOVW R0, #"..XC.."","1EFF2FE1r") end), TL.button("炫跑卡自定义等级", function() HGZDG("全版本","PlayerInfo","get_SuperRunVIPLevel",4,"~A MOV R0, #"..gg.prompt({""},{""},{"text"})[1]"","1EFF2FE1r") gg.alert(os.date'️炫跑卡自定义等级开启成功') string.toMusic('炫跑卡自定义等级开启成功') end), TL.button("一键领奖", function() HGZDG("全版本","PlayerInfo","CheckHonorRoadRewardReceived",4,"~A MOV R0, #9","1EFF2FE1r") gg.alert("开启成功") end, function() end), TL.button("锁定滑板数量", function() HGZDG("全版本","CommonAwardData","get_awardType",4,"~A MOV R0, #2","1EFF2FE1r") gg.toast("开启成功") end, function() end), TL.button("改荣耀杯", function() HGZDG("全版本","CommonAwardData","get_awardType",4,"~A MOV R0, #25","1EFF2FE1r") gg.toast("开启成功") end, function() end), TL.button("改金币", function() HGZDG("全版本","CommonAwardData","get_awardType",4,"E3000000","1EFF2FE1r") gg.alert("开启成功") end, function() end), TL.button("改钥匙", function() HGZDG("全版本","CommonAwardData","get_awardType",4,"E3000001","1EFF2FE1r") end, function() end), },{ TL.box({ "道具赛", TL.button("一分40检", function() BL(0x2ce14ac, 4, "~A MOVW R0, #0") BL(0x2ce14ac, 4, "~A MOVW R0, #0") BL(0x2ce1c50, 4, "~A MOVW R0, #0") gg.toast("检测关闭成功") end ), TL.button("自动开板", function() BL(0x1cc9d90, 4, "~A B +0x223C") gg.alert("开启成功需要配合断网状态使用") end ), TL.button("断网状态", function() BL(0x2abe98c, 4, "~A MOV R0, #1") gg.alert("开启成功道具赛开局开,到跳秒结束后关闭,一局一开") end , function() BL(0x2abe98c, 4, "~A MOV R0, #0") gg.alert("断网状态关闭成功") end ), TL.button("调出赛事", function() BL(0x12da6e0, 4, "~A MOVW R0, #1") gg.alert("赛事调出成功请前往道具赛界面查看") end ), TL.button("无视碰撞", function() BL(0x1d7bfb4, 4, "~A MOVW R0, #1") gg.alert("无视碰撞开启成功") end ), TL.button("防至道具", function() BL(0x1e1dc38, 4, "~A MOVW R0, #1") gg.alert("防至道具开启成功") end ), TL.button("房间防踢", function() BL(0x1e37880, 4, "~A MOVW R0, #0") gg.alert("道具赛开黑房间防踢开启成功") end ), TL.button("无宝聚能", function() BL(0x1ccbde4, 4, "~A B -0x1C0") gg.alert("无宝聚能开启成功") end ), TL.button("重力聚能", function() BL(0x1cca238, 4, "~A B +0x19EC") gg.alert("重力聚能开启成功") end ), TL.button("聚能倍增", function() BL(0xec92e4, 4, "~A B +0xE02940") gg.alert("聚能倍增开启成功") end ), TL.button("无视能量", function() BL(0x1cc6d34, 4, "~A MOVW R0, #0") gg.alert("无视能量开启成功") end ), TL.button("后程结算", function() df = gg.prompt({ "请输入你要结算的时间" }, {"80"}, {"text"})[1] if not df then return end gg.alert("将会在" .. df .. "秒后结算") gg.sleep("" .. df .. "000") BL(0x12928b0, 4, "~A MOVW R0, #1") BL(0x12928b4, 4, "~A BX LR") gg.alert("结算成功") end , function() BL(0x12928b0, 4, "~A MOVW R0, #0") gg.alert("关闭成功") end ), TL.button("直接结算", function() BL(0x12928b0, 4, "~A MOVW R0, #1") BL(0x12928b4, 4, "~A BX LR") gg.alert("结算成功") end , function() BL(0x17554ec, 4, "~A MOVW R0, #0") gg.alert("关闭成功") end ), TL.button("时间聚能", function() co = gg.prompt({ "相机", "校服", "耳机", "扇子" }, {}, { "checkbox", "checkbox", "checkbox", "checkbox" }) if co == nil then Main() end if co[1] == true then Name = "相机时间聚能" ms.ss("3210", 4, 32) ms.py(1, 4, 4) ms.py(1, 4, 4) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(3, 76, 4) ms.edit(0, 116, 4) ms.edit(0, 100, 4) ms.edit(4.3, 96, 16) ms.edit(1, 168, 16) ms.edit(0, 152, 4) ms.edit(4.3, 148, 16) end if co[2] == true then Name = "校服时间聚能" ms.ss("3110", 4, 32) ms.py(1, 4, 4) ms.py(1, 4, 4) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(3, 76, 4) ms.edit(0, 116, 4) ms.edit(0, 100, 4) ms.edit(4.2, 96, 16) ms.edit(1, 168, 16) ms.edit(0, 152, 4) ms.edit(4.2, 148, 16) end if co[3] == true then gg.clearResults() Name = "耳机时间聚能" ms.ss("3310", 4, 32) ms.py(1, 4, 4) ms.py(1, 4, 4) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(3, 76, 4) ms.edit(0, 116, 4) ms.edit(0, 100, 4) ms.edit(4.1, 96, 16) ms.edit(1, 168, 16) ms.edit(0, 152, 4) ms.edit(4.1, 148, 16) end if co[4] == true then gg.clearResults() Name = "折扇一秒聚能" ms.ss("2910", 4, 32) ms.py(1, 4, 4) ms.py(1, -4, 4) ms.edit(0, 100, 16) ms.edit(0, 168, 16) ms.edit(0, 152, 16) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(1, 116, 16) ms.edit(2, 148, 16) ms.edit(1.1, 96, 16) ms.edit(3, 76, 4) gg.alert("折扇一秒一能量开启成功") end end ), TL.button("自动聚能", function() co = gg.prompt({ "相机", "校服", "扇子", "卫衣" }, {}, { "checkbox", "checkbox", "checkbox", "checkbox" }) if co == nil then Main() end if co[1] == true then Name = "相机自动聚能" ms.ss("3210", 4, 32) ms.py(1, 4, 4) ms.py(1, -4, 4) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(2, 76, 4) ms.edit(0, 116, 4) ms.edit(0, 108, 4) gg.alert("相机聚能成功") end if co[2] == true then Name = "校服自动聚能" ms.ss("3110", 4, 32) ms.py(1, 4, 4) ms.py(1, -4, 4) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(2, 76, 4) ms.edit(0, 116, 4) ms.edit(0, 108, 4) gg.alert("校服聚能成功") end if co[3] == true then gg.clearResults() Name = "扇子自动聚能" ms.ss("2910", 4, 32) ms.py(1, 4, 4) ms.py(1, -4, 4) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(2, 76, 4) ms.edit(0, 116, 4) ms.edit(0, 108, 4) gg.alert("扇子聚能成功") end if co[4] == true then gg.clearResults() Name = "卫衣自动聚能" ms.ss("3310", 4, 32) ms.py(1, 4, 4) ms.py(1, -4, 4) ms.edit(0, 92, 4) ms.edit(0, 80, 4) ms.edit(2, 76, 4) ms.edit(0, 116, 4) ms.edit(0, 108, 4) gg.alert("卫衣聚能成功") end end ), TL.button("滑板提速", function() BL(0x1d9bd28, 4, "~A MOVW R0, #1") string.toMusic("滑板提速至40") end ), TL.button("全服排名", function() BL(0xe3dbf4, 4, "~A MOVW R0, #" .. gg.prompt({ "请输入你想要的全服排名" }, {"1"}, {"text"})[1]) string.toMusic("全服排名开启成功") end ), }), },{ TL.button("随机热歌", function() A="https://api.uomg.com/api/rand.music?sort=热歌榜&format=json" Obtain=gg.makeRequest(A).content muchen=Obtain:match('url":"(.-)","picurl') name=Obtain:match('name":"(.-)","') gg.toast('开始播放['..name..']') gg.playMusic(muchen) end, function () end), TL.button("停止音乐", function () gg.toast("已停止音乐") for i=1,100 do gg.playMusic("stop") gg.playMusic("stop") gg.playMusic("stop") end sp="关闭成功" end, function () end), wyylog },{ web6 },{ tiaose(), TL.button("退出插件", function() tuichu=1 end) }, }) 显示 = 1 while true do if tuichu == 1 then break end jianting3(qiehuan) gg.sleep(120) end luajava.setFloatingWindowHide(false) local function invoke() return window:removeView(floatWindow) end luajava.post(invoke) luajava.setFloatingWindowHide(false)