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 PS() end function setvalue(address,flags,value) PS('修改地址数值(地址,数值类型,要修改的值)') local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end local Ranges=gg.getRangesList('/') local function Read(module,type) for k,v in pairs(Ranges) do if v['internalName']:match('[^/]*$')==module and v['type']==type then return v['start'] end end end local Table={} local function Modify(address,value,flags) Table[#Table+1]={address=address,value=value,flags=flags} end local function readD(a) return gg.getValues({{address=a,flags=4}})[1].value end function addListltems(address,flags,value,freeze) t={} t[1]={} t[1].address=address t[1].flags=flags t[1].value=value t[1].freeze=freeze gg.addListItems(t) end function xfnb(add,lx) return gg.getValues({{address=add,flags=lx}})[1].value end local function RUI(address) return gg.getValues({{address=address,flags=gg.TYPE_QWORD}})[1].value 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 Format(tab, format, value, type, Function) if format=="查看" then tab[1]["flags"]=type return gg.getValues(tab) elseif format=="修改" then tab[1]["flags"]=type tab[1]["value"]=value return gg.setValues(tab) elseif format=="冻结" then tab[1]["flags"]=type tab[1]["freeze"]=true tab[1]["value"]=value tab[1]["name"]=Function or "功能" return gg.addListItems(tab) elseif format=="加载" then tab[1]["flags"]=type return gg.loadResults(tab) end end function Unfreeze() local t=gg.getListItems() for k,v in pairs(t) do t[k]["freeze"]=false end return gg.addListItems(t) end function xqmnb(Search,Modification) gg.clearResults() gg.setRanges(Search[1].memory) gg.searchNumber(Search[3].value,Search[3].type,false,536870912,0,-1) if gg.getResultCount()==0 then gg.toast(Search[2].name..'开启失败') return end local Result=gg.getResults(gg.getResultCount()) local sum for index=4,#Search do sum=0 for i=1,#Result do if gg.getValues({{address=Result[i].address+Search[index].offset,flags=Search[index].type}})[1].value~=Search[index].lv then Result[i].Usable=true sum=sum+1 end end if sum==#Result then gg.toast(Search[2].name..'开启失败') return end end local Data,Freeze,Freezes={},{},0 sum=0 for index,value in ipairs(Modification)do for index=1,#Result do if not Result[index].Usable then local Value={address=Result[index].address+value.offset,flags=value.type,value=value.value,freeze=true} if value.freeze then Freeze[#Freeze+1]=Value Freezes=Freezes+1 else Data[#Data+1]=Value end sum=sum+1 end end end gg.setValues(Data) gg.addListItems(Freeze) if Freezes==0 then gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据') else gg.toast(Search[2].name..'开启成功,共修改'..sum..'条数据,冻结'..Freezes..'条数据') end gg.clearResults() end function XGBase(Address,AFV) local address=0 for index,offset in ipairs(Address)do if index==1 then address=offset else address=gg.getValues({{address=address+offset,flags=4}})[1].value end end local Value,Freeze={},{} for index,value in ipairs(AFV)do local VALUE={address=address+value[3],flags=value[2],value=value[1],freeze=true} if value[4]then Freeze[#Freeze+1]=VALUE else Value[#Value+1]=VALUE end end gg.setValues(Value) gg.addListItems(Freeze) end function LSQ_Chain(so, offset, format, value, type, Function) getRanges=getRanges or (function() local ranges={} local t=gg.getRangesList('^/data/*.so*$') for i,v in pairs(t) do if v["type"]:sub(2,2)=='w' then ranges[#ranges+1]=v end end return ranges end) local rest,ranges,sostart,valtype={},getRanges(),nil,gg.TYPE_DWORD if gg.getTargetInfo()["x64"] then valtype=gg.TYPE_QWORD end for i in pairs(ranges) do local _name=ranges[i]["internalName"]:gsub('^.*/','') if so[1]==_name and so[2]==ranges[i]["state"] then sostart=ranges[i]["start"] break end end if sostart then if offset[1] then for i=1,#offset do rest={{flags=valtype,address=sostart+offset[i]}} rest=gg.getValues(rest) if i==#offset then break end if valtype==gg.TYPE_DWORD then sostart=rest[1].value & 0xFFFFFFFF else sostart=rest[1].value end end end if #rest==1 then end return Format(rest,format,value,type,Function) end gg.toast("功能:"..Function.."开启失败") print("功能开启失败原因: 未找到基址头") return os.exit() end function split(szFullString, szSeparator) local nFindStartIndex=1 local nSplitIndex=1 local nSplitArray={} while true do local nFindLastIndex=string.find(szFullString,szSeparator,nFindStartIndex) if not nFindLastIndex then nSplitArray[nSplitIndex]=string.sub(szFullString,nFindStartIndex,string.len(szFullString)) break end nSplitArray[nSplitIndex]=string.sub(szFullString,nFindStartIndex,nFindLastIndex-1) nFindStartIndex=nFindLastIndex+string.len(szSeparator) nSplitIndex=nSplitIndex+1 end return nSplitArray end function xgxc(szpy,qmxg) for x=1,#(qmxg) do xgpy=szpy+qmxg[x]["offset"] xglx=qmxg[x]["type"] xgsz=qmxg[x]["value"] xgdj=qmxg[x]["freeze"] if xgdj==nil or xgdj=="" then gg.setValues({[1]={address=xgpy,flags=xglx,value=xgsz}}) else gg.addListItems({[1]={address=xgpy,flags=xglx,freeze=xgdj,value=xgsz}}) end xgsl=xgsl+1 xgjg=true end end function read(address,flags) local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags filzer=gg.getValues(tt)[1].value return filzer end function getbase(address) local tt={} tt[1]={} tt[1].address=address tt[1].flags=32 filzer=gg.getValues(tt)[1].value return filzer end function getRangeEnd(range) return range.endd or range["end"] or range.finish or range.stop or nil end function getRangeSize(range) local e = getRangeEnd(range) if e and range.start then return e - range.start end return 0 end function findLib(name) local exact = gg.getRangesList(name) if #exact > 0 then for _, v in ipairs(exact) do if v.start then return v.start, v end end end local all = gg.getRangesList() for _, v in ipairs(all) do if v.state and (v.state:find(name, 1, true) or v.state:match("[^/]+$") == name) then return v.start, v end end return nil end function copyMemoryDword(src, dst, len) local alignedSrc = (src + 3) & ~3 local alignedDst = (dst + 3) & ~3 local skipStart = alignedSrc - src local alignedLen = (len - skipStart) & ~3 if alignedLen <= 0 then return 0 end local batch = 1024 local dwords = alignedLen // 4 for offset = 0, dwords - 1, batch do local current = math.min(batch, dwords - offset) local values = {} for i = 0, current - 1 do values[i+1] = {address = alignedSrc + (offset + i) * 4, flags = gg.TYPE_DWORD} end values = gg.getValues(values) for i, v in ipairs(values) do v.address = alignedDst + (offset + i - 1) * 4 v.flags = gg.TYPE_DWORD end gg.setValues(values) end return alignedLen end function checkReadable(addr) local all = gg.getRangesList() for _, v in ipairs(all) do local e = getRangeEnd(v) if e and v.start and addr >= v.start and addr < e then if v.type and v.type:find("r") then return true end break end end return false end function checkWritable(addr) local all = gg.getRangesList() for _, v in ipairs(all) do local rangeEnd = getRangeEnd(v) if rangeEnd and v.start and addr >= v.start and addr < rangeEnd then if v.type and v.type:find("w") then return true end break end end return false end local configs = { { dstLib = "libAkDelayWG.so:bss", srcOffset = 0x12523408, srcEndOffset = 0x12524578, }, { dstLib = "libGPixUI.so:bss", srcOffset = 0x12840388, srcEndOffset = 0x12843134, }, } local ue4Base = findLib("libUE4.so") if not ue4Base then return end for i, cfg in ipairs(configs) do local dstBase = findLib(cfg.dstLib) if not dstBase then goto continue end local srcStart = ue4Base + cfg.srcOffset local srcEnd = ue4Base + cfg.srcEndOffset local copySize = srcEnd - srcStart local dstAddr = dstBase + 0x0 if not checkReadable(srcStart) then goto continue end if not checkWritable(dstAddr) then goto continue end local copied = copyMemoryDword(srcStart, dstAddr, copySize) ::continue:: end function setvalue(address,flags,value,freeze) if address == 0 then return end local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value tt[1].freeze=freeze if freeze==false then gg.setValues(tt) end gg.addListItems(tt) end function getvalue(address,flags,value,freeze) if address == 0 then return end local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags gg.addListItems(tt) end function autovalue(address,flags,_o,_v,freeze) if address == 0 then return end local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].freeze=freeze local _v_ = gg.getValues(tt)[1].value if math.abs(_v_-_o) < 1e-7 then tt[1].value=_v else tt[1].value=_o end if freeze==false then gg.setValues(tt) end gg.addListItems(tt) end function readD(address) return gg.getValues({{address = address, flags = 4}})[1].value end function S_Pointer(t_So, t_Offset, _bit) local function getRanges() local ranges = {} local t = gg.getRangesList('^/data/*.so*$') for i, v in pairs(t) do if v.type:sub(2, 2) == 'w' then table.insert(ranges, v) end end return ranges end local function Get_Address(N_So, Offset, ti_bit) local ti = gg.getTargetInfo() local _Q = tonumber(0x167ba0fe) local t = {} local _t local _S = nil if ti_bit then _t = 32 else _t = 4 end local _S = gg.getRangesList(N_So[1])[1] 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 else S[_].value = S[_].value & 0xFFFFFFFFFF 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 ttt = Get_Address(t_So, t_Offset, _bit) if ttt ~= nil then local _A = string.format('0x%X', ttt) return _A end return 0 end function RDI(address) return gg.getValues({{address = address, flags = 4}})[1].value & 0xFFFFFFFF end function RQI(address) return gg.getValues({{address = address, flags = gg.TYPE_QWORD}})[1].value end function PS() end function setvalue(address,flags,value) local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) end function setvalue(address,flags,value) local tt={} tt[1]={} tt[1].address=address tt[1].flags=flags tt[1].value=value gg.setValues(tt) gg.addListItems(tt) end Sb = S_Pointer({"libUE4.so:bss", "Cb"}, {0xAD0510,0x30,0x6838}, true) qxx = S_Pointer({"libUE4.so:bss", "Cb"}, {0xAD0510,0x30,0x34a0,0x0}, true) max = S_Pointer({"libUE4.so:bss", "Cb"}, {0xAD0510,0x30,0x34a0,0x660,0x0}, true) gc0=gg.getRangesList('libUE4.so')[1].start gc=gg.getRangesList('libGPixUI.so')[1].start xx=gg.getRangesList('libAkDelayWG.so')[1].start gc1=gc0+0x63587BC safe1=gc0+0x12523408 safe=gc+0x1000 xz=xx+0x31000 qxy=gc+0x24000 py=0x14CF8418 setvalue(gc0+py,4,0)--改时间 py=0x1000 setvalue(gc+py,4,506015744) py=0x1004 setvalue(gc+py,4,1476395080) py=0x1008 setvalue(gc+py,4,-702611200) py=0x100C setvalue(gc+py,32,gc1) py=0x1020 setvalue(gc+py,4,-698416192) py=0x24AD8 setvalue(gc+py,32,gc+0x1020) py=0x31BF0 setvalue(xx+py,32,gc+0x1000) gg.clearList() function Main() menu = gg.multiChoice({ "加速(开)", "加速(关)", "挥拳提速(翻倍)", "挥拳加速", "退出脚本", }, nil, os.date" 1.37.10 https://t.me/RQNB7 ") if menu == nil then else if menu[1] == true then A1() end if menu[2] == true then A2() end if menu[3] == true then A3() end if menu[4] == true then A4() end if menu[5] == true then kk() end end XGCK = -1 end function A1() LSQ_Chain({'libUE4.so:bss','Cb'},{0xAD0510,0x30,0x5D8,0x660,0x29C},"冻结","999999",16,"2") LSQ_Chain({'libUE4.so:bss','Cb'},{0xAD0510,0x30,0x5D8,0x660,0x270},"冻结","0",16,"3") LSQ_Chain({'libUE4.so:bss','Cb'},{0xAD0510,0x30,0x5D8,0x660,0x2F4},"冻结","0",16,"4") LSQ_Chain({'libUE4.so:bss','Cb'},{0xAD0510,0x30,0x5D8,0x660,0x280},"冻结","0",16,"5") LSQ_Chain({'libUE4.so:bss','Cb'},{0xAD0510,0x30,0x5D8,0x234,0x25E8},"冻结","9999",16,"6") gg.setValues({{address = qxx, flags = 32, value = qxy}})--冻结地皮 gg.setValues({{address = Sb, flags = 4, value = 65536}}) local b={"libUE4.so:bss","Cb"} local function p(o)return S_Pointer(b,o,true)end local function f(m,v) local c={0xAD0510,0x30,0x20,0xA0,m,0x6B8,0x1c8} if gg.getValues({{address=p(c),flags=16}})[1].value==v then local s={0xAD0510,0x30,0x20,0xA0,m,0x6B8,0x0} local a=tonumber(p(s))or tonumber(p(s):gsub("0x",""),16) gg.setValues({{address=p({0xAD0510,0x30,0x34a0,0x670}),flags=32,value=a}})--修改本人地皮 end end--以上为锁地皮 f(0x10,1000000256.0)f(0xA0,2000000512.0)f(0x118,1000000256.0)f(0x140,2000000512.0)--判断地皮是否加载 gg.setValues({{address = max, flags = 100, value = xz}})--加速开 end function A2() gg.setValues({{address = max, flags = 32, value = safe1}})--加速关 end function A3() local UE4={0xAD0510,0x30,0x34a0,0x660,0x280} local UE5={0xAD0510,0x30,0x34a0,0x660,0x28C} while true do gg.sleep(5) local a=RDI(S_Pointer({"libUE4.so"},{0x15744410,0x30,0x34a0,0x3438},true))==1 setvalue(S_Pointer({"libUE4.so"},{0x153A5004},true),4,a and 1 or 0,false) gg.setValues({ {address=S_Pointer({"libUE4.so:bss","Cb"},UE4,true),flags=16,value=a and-999 or 2}, {address=S_Pointer({"libUE4.so:bss","Cb"},UE5,true),flags=16,value=a and 500 or 2048} }) end end function A4() gg.setValues({{address = qxx, flags = 32, value = qxy}}) gg.setValues({{address = Sb, flags = 4, value = 65536}}) local b={"libUE4.so:bss","Cb"} local function p(o)return S_Pointer(b,o,true)end local function f(m,v) local c={0xAD0510,0x30,0x20,0xA0,m,0x6B8,0x1c8} if gg.getValues({{address=p(c),flags=16}})[1].value==v then local s={0xAD0510,0x30,0x20,0xA0,m,0x6B8,0x0} local a=tonumber(p(s))or tonumber(p(s):gsub("0x",""),16) gg.setValues({{address=p({0xAD0510,0x30,0x34a0,0x670}),flags=32,value=a}}) end end f(0x10,1000000256.0)f(0xA0,2000000512.0)f(0x118,1000000256.0)f(0x140,2000000512.0) while true do gg.sleep(5) local a=RDI(S_Pointer({"libUE4.so"},{0x15744410,0x30,0x34a0,0x3438},true))==1 if a then gg.setValues({{address = max, flags = 32, value = xz}}) else gg.setValues({{address = max, flags = 32, value = safe1}}) end end end function kk() os.exit()end while true do if gg.isVisible(true) then XGCK = 1 gg.setVisible(false)end gg.clearResults() if XGCK == 1 then Main()end end