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)