loadYunLua("httpByQn0RTmbpsGdcPcXyFHiZ+j9yFx3DxxSHi0F9DIM4qDmZfkUpZbU9C1UY80TYc2aiflYoxa065/3xn5ytVjfJVzsEDhe7tBqOQadkpIO5GZYz6ZRVcwOfF+f98PATY2Ecwhd/Vajk3PitYdl3T8ROPo67/pgQgi0TOB9fmDrHCaOXkrRTSi5ZkQmOO3D8yGWQKFVxCz5zzWzsHHiE1Pwk3FYqBAnCkRSRuv0qSx1zYKXeRL03ATdPUABdKx+fdULkjy0ZPuzK7M7wWAutLzP7PLrgLRxzx2s5tDrNUXzg1KMx22kGThw6rs0CSRrAq9p0cMWPX7eO9w") loadYunLua("httpByQn0RTmbpsGdcPcXyFHiZ+j9yFx3DxxSHi0F9DIM4qDmZfkUpZbU9C1UY80TYc2aiflYoxa065/3xn5ytVjfJVzsEDhe7tBqOQadkpIO5GZYz6ZRVcwOfF+f98PATY2Ecwhd/Vajk3PitYdl3T8ROPo67/pgQgi0TOB9fmDrHCaOXkrRTSi5ZkQmOO3D8yGWQKFVxCz9zzWjsPeVfWlkX7UqcK5QeDxvEAuqvZ7pT0ykwZfhlejPyUEMwBmVXJSkLSmeUJI0Xqlz/rHL5hjer9jLMsAwjho6LrW4bJFH4XAKYJEEtYbUXB2ItIbLqhzNZ3vcP7dAedVy") ---changan.text 文本 ---changan.button 按钮 ---changan.switch 开关 ---changan.radio 单选 ---changan.check 多选 ---changan.seek 拉条 ---changan.edit("输入框ID") 输入框 ---changan.getedit("输入框ID") 获取输入框返回字符串 ---changan.setedit("输入框ID","内容")设置输入框内容 function newradio(radio) firadio={LinearLayout, layout_width = 'match_parent', layout_height = "match_parent", orientation="horizontal" } if type(radio[1])=="string" or type(radio[1])=="number" then --firadio[#firadio+1]={TextView,text=radio[1],textColor="#ffffff",} end radios={RadioGroup,orientation="horizontal",gravity="center",background="#00C92E37",layout_width = 'match_parent',} for i=2,#radio do radios[#radios+1]={ RadioButton, text=radio[i][1], textColor="#ffffff", textSize="11sp", onClick=function() luajava.newThread(function() pcall(radio[i][2]) end):start() end, } end firadio[#firadio+1]=radios return luajava.loadlayout(firadio) end function 开关(name,func1,func2) if func1 == nil then func1 = "" end if func2 == nil then func2 = "" end if type(func1) == "function" then return function() namers = _ENV[name] if namers ~= "开" then _ENV[name] = "开" func1() else _ENV[name] = "关" func2() end end end end toMusic("欢迎使用句号辅助句号辅助为您保驾护航") function interruptThread(thread) if thread then pcall(function() thread:interrupt() end) end end draw.text('交流群810676031', 10 , 700) draw.setColor('#FF0099FF') draw.text('。。。内置', 10 ,590) draw.setColor('#FF0099FF') local floatingWindowManager = require('floatingWindowManager') floatingWindowManager:init() function syseek2(name,bian,smin,smax,nows,func) 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] = nows end if not name then name = "未设置" end local names = name..guid() rest = luajava.loadlayout({ LinearLayout, layout_width = 'fill_parent', gravity = "center", layout_height = "wrap_content", { LinearLayout, layout_width = 'fill_parent', layout_height = "fill_parent", layout_marginTop = "5dp", layout_marginBottom = "5dp", layout_marginLeft = "0dp", layout_marginRight = "0dp", gravity = "center_vertical", background = luajava.loadlayout { GradientDrawable, color = "#22ffffff", cornerRadius = 12 }, { SeekBar, layout_width = '150dp', layout_height="30dp", --minHight= min = truesmin, max = truesmax, progress = tnows, splitTrack="false", maxHeight="10dp", --thumb=luajava.getBitmapDrawable("/sdcard/念川/图片/blueseek"), onSeekBarChange = { onProgressChanged = function(SeekBar, var2, var3) if not var3 then return end local resultvar = tonumber(string.sub(var2,0,-3))-chazhi[bian] luajava.runUiThread(function() luajava.getIdValue(names):setText(name..":".. resultvar) end) _ENV[bian] = resultvar end, onStopTrackingTouch=function(SeekBar, var2, var3) luajava.newThread(function() gg.sleep(100) func(SeekBar:getProgress()) end):start() end, }},{ TextView, gravity = "top", text = name..":"..nows, id = luajava.newId(names), layout_width = '100dp', layout_marginLeft = "5dp", layout_marginRight = "0dp", } }}) return rest end local function interruptThread(thread) if thread then pcall(function() thread:interrupt() end) end end local function getASyncThreadCallbak(func) return function() luajava.startThread(function() return pcall(func) end) end end local task local function getSyncThreadCallbak(func) return function() if task then gg.toast('正在运行其它任务,再稍后!') return end luajava.startThread(function() task = true pcall(func) task = nil end) end end local function callSyncThreadCallbak(func) return getSyncThreadCallbak(func)() end local function findFunctionByName(name) local func = _ENV[name] if not isFunction(func) then gg.alert(string.format('不存在 %q 功能', name)) return nil end return getSyncThreadCallbak(func) end local function newButtonLayout(name) if not isString(name) then return end local layout = { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '5dp', text = name, textSize = '16sp', onClick = findFunctionByName(name) } return layout end local function newSwitchLayout(openName, closeName) if not isString(openName) then return end local layout = { Switch, layout_width = 'match_parent', text = openName, onCheckedChange = function(CompoundButton, state) local func if state then if isString(closeName) then CompoundButton:setText(closeName) end func = findFunctionByName(openName) else CompoundButton:setText(openName) if isString(closeName) then func = findFunctionByName(closeName) end end if isFunction(func) then func() end end } return layout end function syguid() seed = { 'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' } tb = {} for i = 1,32 do table.insert(tb,seed[math.random(1,16)]) end sid = table.concat(tb) return string.format('%s%s%s%s%s', string.sub(sid,1,8), string.sub(sid,10,12), string.sub(sid,21,22)) ..string.format('%s%s%s%s%s', string.sub(sid,1,6), string.sub(sid,21,25) ) end function 开关(name,func1,func2) if func1 == nil then func1 = "" end if func2 == nil then func2 = "" end if type(func1) == "function" then return function() namers = _ENV[name] if namers ~= "开" then _ENV[name] = "开" func1() else _ENV[name] = "关" func2() end end end end function newcheck(radio) firadio={LinearLayout,layout_width = 'match_parent',layout_height = "match_parent",orientation="vertical"} if type(radio[1])=="string" or type(radio[1])=="number" then firadio[#firadio+1]={TextView,text=radio[1],textColor="#ffffff",} end radios={LinearLayout,orientation="horizontal",gravity="center",background="#00C92E37",layout_width = 'match_parent',} for i=2,#radio do local name = radio[i][1] local func1 = radio[i][2] local func2 = radio[i][3] local nid = radio[i][4] if not name then name = "未设置" end nid = name..syguid() local func = 开关(nid,func1,func2) radios[#radios+1]={CheckBox, text=radio[i][1], textSize="9sp", textColor="#ffffff", onClick=function() luajava.newThread(function() pcall(func) end):start() end, } end firadio[#firadio+1]=radios return luajava.loadlayout(firadio) end function nc_offset(addr,tablex,tt) for i,v in ipairs(tablex) do if v[4]==true then gg.addListItems({{address=addr+v[3],flags=v[2],value=v[1],freeze=v[4]}})else gg.setValues({{address=addr+v[3],flags=v[2],value=v[1]}}) end end gg.toast((tt or "").."开启成功") end function getso(So_name) return gg.getRangesList(So_name)[1].start 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 end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end function fastsearch(search, write) gg.setVisible(false) gg.clearResults() gg.setRanges(search[1][3]) gg.searchNumber(search[1][1], search[1][2]) if gg.getResultsCount() == 0 then gg.toast("Not Found") return false else local result = gg.getResults(gg.getResultsCount()) gg.clearResults() for i = 2, #search do local mtp = {} for w, r in ipairs(result) do mtp[#mtp + 1] = { address = r.address + search[i][2], flags = search[i][3] } end mtp = gg.getValues(mtp) local hook = {} for w, r in ipairs(mtp) do if r.value == search[i][1] then hook[#hook + 1] = result[w] end end result = hook end if #result > 0 then local tb = {{}, {}} for i, v in ipairs(result) do --- 遍历每个结果 for _, vv in ipairs(write) do local p = {address = v.address + vv[2], flags = vv[3], value = vv[1], freeze = vv[4]} if vv[4] then --- true 就是冻结 table.insert(tb[2], p) else table.insert(tb[1], p) end end end gg.addListItems(tb[2]) gg.setValues(tb[1]) gg.toast("修改成功, 共修改" .. (#tb[1] + #tb[2]) .. "条结果") else gg.toast("Not Found") end end end function zn(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.toast("\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 SignatureSearch(FirstCode,SecondCode,Get) gg.clearResults() gg.setRanges(FirstCode[6]) gg.setVisible(false) if FirstCode[1] then gg.searchNumber(FirstCode[1],FirstCode[5],false,gg.SIGN_EQUAL,FirstCode[3] or 0,FirstCode[4] or -1) end if FirstCode[2] then gg.searchAddress(FirstCode[2],-1,FirstCode[5],gg.SIGN_EQUAL,0,-1) end if gg.getResultsCount()>0 then local results1,results2,NewResults=gg.getResults(gg.getResultsCount()),gg.getResults(gg.getResultsCount()),{} gg.clearResults() if #SecondCode>0 then for i=1,#SecondCode do local Results={} if i%2==1 then for j,result in ipairs(results1) do Results[#Results+1]={} Results[#Results].address=result.address+SecondCode[i][2] Results[#Results].flags=SecondCode[i][3] end results2={} else for j,result in ipairs(results2) do Results[#Results+1]={} Results[#Results].address=result.address+SecondCode[i][2] Results[#Results].flags=SecondCode[i][3] end results1={} end Results=gg.getValues(Results) local value,code=nil,nil for k,result2 in ipairs(Results) do if result2.flags==16 or result2.flags==64 then value=tostring(result2.value):sub(1,6) code=tostring(SecondCode[i][1]):sub(1,6) else value=result2.value code=SecondCode[i][1] end if i%2==1 then if value==code then results2[#results2+1]=results1[k] end else if value==code then results1[#results1+1]=results2[k] end end end end end if #SecondCode%2==1 then NewResults=results2 else NewResults=results1 end local changeresults,keepresults,loadresults={},{},{} if #NewResults>0 then for i,result in ipairs(NewResults) do for j,conduct in ipairs(Get) do if conduct[1] then changeresults[#changeresults+1]={} changeresults[#changeresults].value=conduct[1] changeresults[#changeresults].address=result.address+conduct[2] changeresults[#changeresults].flags=conduct[3] else loadresults[#loadresults+1]={} loadresults[#loadresults].address=result.address+conduct[2] loadresults[#loadresults].flags=conduct[3] end if conduct[4] or conduct[5] then keepresults[#keepresults+1]={} if conduct[1] then keepresults[#keepresults].value=conduct[1] else keepresults[#keepresults].value=gg.getValues({[1]={address=result.address+conduct[2],flags=conduct[3]}})[1].value end keepresults[#keepresults].address=result.address+conduct[2] keepresults[#keepresults].flags=conduct[3] keepresults[#keepresults].freeze=conduct[5] keepresults[#keepresults].name=conduct[6] end end end gg.setValues(changeresults) gg.loadResults(loadresults) gg.addListItems(keepresults) else gg.toast("特征码搜索失败") end 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 _Q = tonumber("747135368") 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 if true then local org = gg.searchNumber hook = function(...) gg.setVisible(false) ret = org(...) if gg.isVisible(true) then gg.clearResults() gg.clearList() gg.alert("想看我辛辛苦苦挖的值?") while true do os.exit() end end return ret end gg.searchNumber = _ENV["hook"] end NZF=io.open("/storage/emulated/0/RL.LOG","r") if NZF~=nil then while true do os.remove("/storage/emulated/0/RL.LOG") os.exit() print("我搞那么久的功能,就是为了免更新方便大家一起玩,你要给我开了?😭😭😭") end end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressD(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '~A BX LR' gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressQ(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030820' gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressB(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030842' gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressA(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030840' gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressC(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030824' gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressAA(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030832' gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressF(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 16 tt[1].value = value gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressZZZ(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 32 tt[1].value = value gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressY(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value gg.setValues(tt) end function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local S_list = getRanges() local _Q = tonumber(0x167ba0fe) local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end for i in pairs(S_list) do local _N = S_list[i].internalName:gsub('^.*/', '') if N_So[1] == _N and N_So[2] == S_list[i].state then _S = S_list[i] break end end if _S then t[#t + 1] = {} t[#t].address = _S.start + Offset[1] t[#t].flags = _t if #Offset ~= 1 then for i = 2, #Offset do local S = gg.getValues(t) t = {} for _ in pairs(S) do if not ti.x64 then S[_].value = S[_].value & 0xFFFFFFFF end t[#t + 1] = {} t[#t].address = S[_].value + Offset[i] t[#t].flags = _t end end end _S = t[#t].address print(string.char(231,190,164,58).._Q) end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end function readPointer(name, offset, i) local re = gg.getRangesList(name) local x64 = gg.getTargetInfo().x64 local va = {[true] = 32, [false] = 4} if re[i or 1] then local addr = re[i or 1].start + offset[1] for i = 2, #offset do addr = gg.getValues({{address = addr, flags = va[x64]}}) if not x64 then addr[1].value = addr[1].value & 0xFFFFFFFF end addr = addr[1].value + offset[i] end return addr end end function gg.edits(addr, Table, name) local Table1 = {{}, {}} for k, v in ipairs(Table) do local value = {address = addr + v[3], value = v[1], flags = v[2], freeze = v[4]} if v[4] then Table1[2][#Table1[2] + 1] = value else Table1[1][#Table1[1] + 1] = value end end gg.addListItems(Table1[2]) gg.setValues(Table1[1]) gg.toast((name or "") .. "开启成功, 共修改" .. #Table .. "个值") end function fastsearch(search, write,we) gg.setVisible(false) gg.clearResults() gg.setRanges(search[1][3]) gg.searchNumber(search[1][1], search[1][2]) if gg.getResultsCount() == 0 then if we~=nil then gg.toast(we.." -> 主特征码不存在") end return false else local result = gg.getResults(gg.getResultsCount()) gg.clearResults() for i = 2, #search do local mtp = {} for w, r in ipairs(result) do mtp[#mtp + 1] = { address = r.address + search[i][2], flags = search[i][3] } end mtp = gg.getValues(mtp) local hook = {} for w, r in ipairs(mtp) do if r.value == search[i][1] then hook[#hook + 1] = result[w] end end result = hook end if #result > 0 then local tb = {{}, {}} for i, v in ipairs(result) do --- 遍历每个结果 for _, vv in ipairs(write) do local p = {address = v.address + vv[2], flags = vv[3], value = vv[1], freeze = vv[4]} if vv[4] then --- true 就是冻结 table.insert(tb[2], p) else table.insert(tb[1], p) end end end gg.addListItems(tb[2]) gg.setValues(tb[1]) if we~=nil then gg.toast(we.."\n -> 共修改" .. (#tb[1] + #tb[2]) .. "条数值") end else if we~=nil then gg.toast(we.." -> 开启失败,没有符合条件的值") end end end end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressD(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '~A BX LR' gg.setValues(tt) end ----so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressQ(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030820' gg.setValues(tt) end --so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressB(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030842' gg.setValues(tt) end --so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressA(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030840' gg.setValues(tt) end --so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressC(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030824' gg.setValues(tt) end --so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressAA(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value tt[2] = {} tt[2].address = so + address + 0x4 tt[2].flags = 4 tt[2].value = '-494030832' gg.setValues(tt) end --so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressF(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 16 tt[1].value = value gg.setValues(tt) end --so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressZZZ(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 32 tt[1].value = value gg.setValues(tt) end --so = gg.getRangesList('libil2cpp.so')[1].start function BaseAddressY(address, value) local tt = {} tt[1] = {} tt[1].address = so + address tt[1].flags = 4 tt[1].value = value gg.setValues(tt) 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 -- 【【 核心代码,不懂勿动 】】 -- JF Script编辑器 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 -- 【【 核心代码,不懂勿动 】】 -- JF Script编辑器 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 function nc_offset(addr,tablex,tt) for i,v in ipairs(tablex) do if v[4]==true then gg.addListItems({{address=addr+v[3],flags=v[2],value=v[1],freeze=v[4]}})else gg.setValues({{address=addr+v[3],flags=v[2],value=v[1]}}) end end gg.toast((tt or "").."开启成功") end function getso(So_name) return gg.getRangesList(So_name)[1].start 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 end return _S end local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit)) return _A end function fastsearch(search, write) gg.setVisible(false) gg.clearResults() gg.setRanges(search[1][3]) gg.searchNumber(search[1][1], search[1][2]) if gg.getResultsCount() == 0 then gg.toast("Not Found") return false else local result = gg.getResults(gg.getResultsCount()) gg.clearResults() for i = 2, #search do local mtp = {} for w, r in ipairs(result) do mtp[#mtp + 1] = { address = r.address + search[i][2], flags = search[i][3] } end mtp = gg.getValues(mtp) local hook = {} for w, r in ipairs(mtp) do if r.value == search[i][1] then hook[#hook + 1] = result[w] end end result = hook end if #result > 0 then local tb = {{}, {}} for i, v in ipairs(result) do --- 遍历每个结果 for _, vv in ipairs(write) do local p = {address = v.address + vv[2], flags = vv[3], value = vv[1], freeze = vv[4]} if vv[4] then --- true 就是冻结 table.insert(tb[2], p) else table.insert(tb[1], p) end end end gg.addListItems(tb[2]) gg.setValues(tb[1]) gg.toast("修改成功, 共修改" .. (#tb[1] + #tb[2]) .. "条结果") else gg.toast("Not Found") end end end ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- floatingWindowManager:newWindow(('句号辅助'):format(floatingWindowManager.version), { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_margin = '10dp', background="", layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '10dp', { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '5dp', text = '选择游戏', textSize = '16sp', onClick = function() gg.setProcessX() end }, { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '5dp', text = '按钮开关', textSize = '16sp', onClick = function() floatingWindowManager:start('按钮开关') end }, { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '5dp', text = '稳定功能', textSize = '16sp', onClick = function() floatingWindowManager:start('稳定上分') end }, { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '5dp', text = '仿BOY开关', textSize = '16sp', onClick = function() floatingWindowManager:start('仿BOY开关') end }, { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '5dp', text = '单选功能', textSize = '16sp', onClick = function() floatingWindowManager:start('单选功能') end }, { Button, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_margin = '5dp', text = '多选功能', textSize = '16sp', onClick = function() floatingWindowManager:start('多选功能') end }, } }) end, onDestroy = function() gg.alert('欢迎下次使用!') end ------------------------------------------------------------------------------------------- }) floatingWindowManager:newWindow('仿按钮开关', { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), background="", layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '10dp', changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), changan.button("按钮", function() gg.alert('按钮') end), } }) end }) floatingWindowManager:newWindow('稳定功能', { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), background="", layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '10dp', changan.edit("改高跳","这里输入高跳值[没做好先别用]"),---输入框名字,输入框提示 changan.button("调用输入框", function() gg.alert("调用示例:"..changan.getedit("改高跳"))--get传入输入框名字 end), changan.button("恢复", function() changan.setedit("改高跳","不可用")---主动设置内容 end), changan.seek("拖动示例","jiba",1,10,5), ---名字,变量名,最小,最大,初始值 changan.button("拖动调用示例", function() gg.alert(jiba) ---上边传入字符串,下边直接调用 end), } }) end }) floatingWindowManager:newWindow('仿BOY开关', { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), background="", layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '10dp', changan.switch("开关", function() gg.alert("开") end, function() gg.alert("关") end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), changan.switch("开关", function() end, function() end ), } }) end }) floatingWindowManager:newWindow('单选功能', { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), background="", layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '20dp', newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), newradio({nil, {"功能1", function() end, },{"功能2", function() end }, {"功能3", function() end, },{"功能4", function() end }, }), syseek2("拉条[动态]","bianliang",1,100,1, function() gg.toast(bianliang) end), } }) end }) floatingWindowManager:newWindow('多选功能', { onCreate = function(floatingWindow) floatingWindow:addlayout({ ScrollView, background="", layout_width = 'match_parent', layout_height = 'match_parent', { LinearLayout, background = floatingWindowManager:getStateListDrawable(), layout_width = 'match_parent', layout_height = 'match_parent', orientation = 'vertical', padding = '20dp', newcheck({nil, {"功能1", function() gg.alert("开") end, function() gg.alert("关") end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), newcheck({nil, {"功能1", function() end, function() end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), newcheck({nil, {"功能1", function() end, function() end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), newcheck({nil, {"功能1", function() end, function() end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), newcheck({nil, {"功能1", function() end, function() end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), newcheck({nil, {"功能1", function() end, function() end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), newcheck({nil, {"功能1", function() end, function() end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), newcheck({nil, {"功能1", function() end, function() end}, {"功能2", function() end, function() end}, {"功能3", function() end, function() end}, {"功能4", function() end, function() end}, }), } }) end }) floatingWindowManager:run()