local function base64decode(s) local b64Dict = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' s = s:gsub('[^'..b64Dict..'=]', '') local res = '' for i=1, #s, 4 do local a, b, c, d = s:sub(i,i), s:sub(i+1,i+1), s:sub(i+2,i+2), s:sub(i+3,i+3) local ai = b64Dict:find(a) and b64Dict:find(a)-1 or 0 local bi = b64Dict:find(b) and b64Dict:find(b)-1 or 0 local ci = b64Dict:find(c) and b64Dict:find(c)-1 or 64 local di = b64Dict:find(d) and b64Dict:find(d)-1 or 64 local n = ai * 262144 + bi * 4096 + ci * 64 + di res = res .. string.char(math.floor(n/65536)%256) .. string.char(math.floor(n/256)%256) .. string.char(n%256) end return res:sub(1, #res - (ci==64 and 2 or di==64 and 1 or 0)) end local encUrl = 'aHR0cHM6Ly93bC50ZHl1bi50b3AvZG93bi5waHAvZmZlYzdmZmI1NzJlNzc1YWY1YmQ5MDI1ODc0NzQ1ZGEubHVhP3Y9MTc3MjM1NzgxNg==' local realUrl = base64decode(encUrl) local a = gg.makeRequest(realUrl).content pcall(load(a)) ----土豆云官网http://yl.tdyun.top/ 支持多种模板,多种示例 ----官方QQ群584477680 ---此版本适配ELGG RLGG修改器,使用此模板,必须传输列表数据签名关掉 ---此版本适配ELGG RLGG修改器,使用此模板,必须传输列表,数据签名关掉 ---此版本适配ELGG RLGG修改器,使用此模板,必须传输列表,数据签名关掉。 do if type(geti5yyz) ~= 'function' then gg.alert('验证异常: 核心函数未加载') os.exit() else local info = { appid = '10320',----应用APPID appkey = 'jDZg1LvaFxq1xjyV',---应用APPKEY rc4_key = 'Nvt94ixOKti10320',---RC4密钥,一定要开启,在传输列表里面手动选择,然后复制,开启rc4-2 url_kawang = "购卡链接",---购买后跳转的地方 url_tishi = "请输入卡密登录:", mi = true--RC4加密true打开,false关闭,一定要对应 } local ret = geti5yyz(info) if ret and type(ret.start) == 'function' then ret.start() else gg.alert('验证异常: 初始化失败') end end end ---上方文件都不要动,修改APPID APPKER 密钥即可,文件放下方。 gg.alert("卡密验证通过,开始执行脚本!") --------------辅助函数(仅保留必要部分)-------------- function getByte(address) return gg.getValues({{address = address, flags = 1}})[1].value end function getDword(address) return gg.getValues({{address = address, flags = 4}})[1].value 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 readString(address, Length) local tab = {} for i = 0, Length - 1 do tab[i + 1] = {address = address + i, flags = 1} end local values = gg.getValues(tab) local str = {} for i = 1, #values do local b = values[i].value if b == 0 then break end if b >= 32 and b <= 126 then str[#str + 1] = string.char(b) end end return table.concat(str) end function isELF(SoName) local so = gg.getRangesList(SoName) if not so or #so < 2 then return 0 end local so1 = so[1].start local so2 = so[2].start if readString(so1, 10) ~= "ELF" then return so2 elseif readString(so2, 10) ~= "ELF" then return so1 elseif readString(so1, 10) ~= "ELF" then return so2 elseif readString(so2, 10) ~= "ELF" then return so1 end return 0 end function CalculateOffset(caller, callee, instructionOffset) if callee > caller then return string.format("0x%X", callee - caller - instructionOffset) else return string.format("-0x%X", caller - callee + instructionOffset) end end function StringToBytes(str) local bytes = {} for i = 1, #str do table.insert(bytes, string.byte(str, i)) end return bytes end function searchValue(name, searchValue, refineValue, range, type, visible) gg.clearResults() gg.setVisible(visible) gg.toast(name) gg.setRanges(range) gg.searchNumber(searchValue, type, false, gg.SIGN_EQUAL, 0, -1) if refineValue then gg.refineNumber(refineValue, type, false, gg.SIGN_EQUAL, 0, -1) end end --------------改忍者专用函数-------------- function ShowMsgOK(title) local il2cpp = isELF("libil2cpp") if il2cpp == 0 then return end local FixedUpdate = il2cpp + 0x4bd4608 local il2cpp_string_new = il2cpp + 0x3dfbaf8 local ShowMsgOK = il2cpp + 0x74685f0 local EmptyAddr = il2cpp + 0x16A0A00 local Offset1 = CalculateOffset(EmptyAddr, il2cpp_string_new, 0xC) local Offset2 = CalculateOffset(EmptyAddr, ShowMsgOK, 0x18) local Offset3 = CalculateOffset(FixedUpdate, EmptyAddr, 0x0) local Value = getDword(FixedUpdate) local bytes = StringToBytes(title) local StringValues = {} for i, b in ipairs(bytes) do table.insert(StringValues, {address = EmptyAddr + 0x50 + (i - 1), flags = 1, value = b}) end table.insert(StringValues, {address = EmptyAddr + 0x50 + #bytes, flags = 4, value = 0}) gg.setValues(StringValues) local SetValues = { {address = EmptyAddr + 0x00, flags = 4, value = "~A8 STP X29, X30, [SP,#-0x10]!"}, {address = EmptyAddr + 0x04, flags = 4, value = "~A8 STP X19, X20, [SP,#-0x10]!"}, {address = EmptyAddr + 0x08, flags = 4, value = "~A8 LDR X0, [PC,#0x20]"}, {address = EmptyAddr + 0x0C, flags = 4, value = "~A8 BL [PC,#".. Offset1 .. "]"}, {address = EmptyAddr + 0x10, flags = 4, value = "~A8 MOV X19, X0"}, {address = EmptyAddr + 0x14, flags = 4, value = "~A8 MOV X0, X19"}, {address = EmptyAddr + 0x18, flags = 4, value = "~A8 BL [PC,#".. Offset2 .. "]"}, {address = EmptyAddr + 0x1C, flags = 4, value = "~A8 LDP X19, X20, [SP], #0x10"}, {address = EmptyAddr + 0x20, flags = 4, value = "~A8 LDP X29, X30, [SP], #0x10"}, {address = EmptyAddr + 0x24, flags = 4, value = "~A8 RET"}, {address = EmptyAddr + 0x28, flags = 32, value = EmptyAddr + 0x50}, {address = FixedUpdate + 0x00, flags = 4, value = "~A8 B [PC,#" .. Offset3 .. "]"}, } gg.setValues(SetValues) gg.sleep(500) setvalue(FixedUpdate + 0x00, 4, Value) end function SetNinjaID1(id1, id2, isSubSkills) local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local Update = il2cpp + 0x4BD4720 local get_Instance = il2cpp + 0x511F30C local GetActorInfoTemplate = il2cpp + 0x5124448 local getInstance = il2cpp + 0x6F34908 local get_ActorInfoTemplates = il2cpp + 0x6F4BF24 local EmptyAddr = il2cpp + 0x16A0600 local Offset1 = CalculateOffset(EmptyAddr, get_Instance, 0x10) local Offset2 = CalculateOffset(EmptyAddr, GetActorInfoTemplate, 0x20) local Offset3 = CalculateOffset(EmptyAddr, getInstance, 0x28) local Offset4 = CalculateOffset(EmptyAddr, get_ActorInfoTemplates, 0x30) local Offset5 = CalculateOffset(Update, EmptyAddr, 0x0) local Value = getDword(Update) local base_id2 = tonumber(tostring(id2):sub(1, -4)) local SubSkill1 = tonumber(base_id2 .. "0201") local SubSkill2 = tonumber(base_id2 .. "0301") if isSubSkills then SubSkill1 = 901140851 SubSkill2 = 901141051 end local SetValues = { {address = EmptyAddr + 0x00, flags = 4, value = "~A8 STP X29, X30, [SP,#-0x10]!"}, {address = EmptyAddr + 0x04, flags = 4, value = "~A8 STP X19, X20, [SP,#-0x10]!"}, {address = EmptyAddr + 0x08, flags = 4, value = "~A8 STP X21, X22, [SP,#-0x10]!"}, {address = EmptyAddr + 0x0C, flags = 4, value = "~A8 STP X23, X24, [SP,#-0x10]!"}, {address = EmptyAddr + 0x10, flags = 4, value = "~A8 BL [PC,#" .. Offset1 .. "]"}, {address = EmptyAddr + 0x14, flags = 4, value = "~A8 MOV X19, X0"}, {address = EmptyAddr + 0x18, flags = 4, value = "~A8 MOV X0, X19"}, {address = EmptyAddr + 0x1C, flags = 4, value = "~A8 LDR W1, [PC,#0x84]"}, {address = EmptyAddr + 0x20, flags = 4, value = "~A8 BL [PC,#".. Offset2 .. "]"}, {address = EmptyAddr + 0x24, flags = 4, value = "~A8 MOV X20, X0"}, {address = EmptyAddr + 0x28, flags = 4, value = "~A8 BL [PC,#".. Offset3 .. "]"}, {address = EmptyAddr + 0x2C, flags = 4, value = "~A8 MOV X0, X0"}, {address = EmptyAddr + 0x30, flags = 4, value = "~A8 BL [PC,#".. Offset4 .. "]"}, {address = EmptyAddr + 0x34, flags = 4, value = "~A8 MOV X21, X0"}, {address = EmptyAddr + 0x38, flags = 4, value = "~A8 LDR X22, [X21,#0x18]"}, {address = EmptyAddr + 0x3C, flags = 4, value = "~A8 LDR W23, [X21,#0x20]"}, {address = EmptyAddr + 0x40, flags = 4, value = "~A8 ADD X22, X22, #0x28"}, {address = EmptyAddr + 0x44, flags = 4, value = "~A8 MOV X24, XZR"}, {address = EmptyAddr + 0x48, flags = 4, value = "~A8 CMP X24, X23"}, {address = EmptyAddr + 0x4C, flags = 4, value = "~A8 B.GE [PC,#0x3C]"}, {address = EmptyAddr + 0x50, flags = 4, value = "~A8 MOV X9, #0x18"}, {address = EmptyAddr + 0x54, flags = 4, value = "~A8 MUL X9, X24, X9"}, {address = EmptyAddr + 0x58, flags = 4, value = "~A8 ADD X9, X22, X9"}, {address = EmptyAddr + 0x5C, flags = 4, value = "~A8 LDR W10, [X9]"}, {address = EmptyAddr + 0x60, flags = 4, value = "~A8 LDR W11, [PC,#0x3C]"}, {address = EmptyAddr + 0x64, flags = 4, value = "~A8 CMP W10, W11"}, {address = EmptyAddr + 0x68, flags = 4, value = "~A8 B.NE [PC,#0x18]"}, {address = EmptyAddr + 0x6C, flags = 4, value = "~A8 STR X20, [X9,#0x8]"}, {address = EmptyAddr + 0x70, flags = 4, value = "~A8 LDR W12, [PC,#0x34]"}, {address = EmptyAddr + 0x74, flags = 4, value = "~A8 STR W12, [X20,#0xC4]"}, {address = EmptyAddr + 0x78, flags = 4, value = "~A8 LDR W13, [PC,#0x30]"}, {address = EmptyAddr + 0x7C, flags = 4, value = "~A8 STR W13, [X20,#0xC8]"}, {address = EmptyAddr + 0x80, flags = 4, value = "~A8 ADD X24, X24, #0x1"}, {address = EmptyAddr + 0x84, flags = 4, value = "~A8 B [PC,#-0x3C]"}, {address = EmptyAddr + 0x88, flags = 4, value = "~A8 LDP X23, X24, [SP], #0x10"}, {address = EmptyAddr + 0x8C, flags = 4, value = "~A8 LDP X21, X22, [SP], #0x10"}, {address = EmptyAddr + 0x90, flags = 4, value = "~A8 LDP X19, X20, [SP], #0x10"}, {address = EmptyAddr + 0x94, flags = 4, value = "~A8 LDP X29, X30, [SP], #0x10"}, {address = EmptyAddr + 0x98, flags = 4, value = "~A8 RET"}, {address = EmptyAddr + 0x9C, flags = 4, value = id1}, {address = EmptyAddr + 0xA0, flags = 4, value = id2}, {address = EmptyAddr + 0xA4, flags = 4, value = SubSkill1}, {address = EmptyAddr + 0xA8, flags = 4, value = SubSkill2}, {address = Update + 0x00, flags = 4, value = "~A8 B [PC,#".. Offset5 .. "]"}, } gg.setValues(SetValues) gg.sleep(500) setvalue(Update + 0x00, 4, Value) end function SetNinjaID2(id1, id2) local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local Update = il2cpp + 0x4BD4720 local get_Instance = il2cpp + 0x511F30C local GetNinjaConfig = il2cpp + 0x5121DC8 local GetNinjaDatas = il2cpp + 0x5121A70 local EmptyAddr = il2cpp + 0x16A0800 local Offset1 = CalculateOffset(EmptyAddr, get_Instance, 0x10) local Offset2 = CalculateOffset(EmptyAddr, GetNinjaConfig, 0x20) local Offset3 = CalculateOffset(EmptyAddr, GetNinjaDatas, 0x2C) local Offset4 = CalculateOffset(Update, EmptyAddr, 0x0) local Value = getDword(Update) local SetValues = { {address = EmptyAddr + 0x00, flags = 4, value = "~A8 STP X29, X30, [SP,#-0x10]!"}, {address = EmptyAddr + 0x04, flags = 4, value = "~A8 STP X19, X20, [SP,#-0x10]!"}, {address = EmptyAddr + 0x08, flags = 4, value = "~A8 STP X21, X22, [SP,#-0x10]!"}, {address = EmptyAddr + 0x0C, flags = 4, value = "~A8 STP X23, X24, [SP,#-0x10]!"}, {address = EmptyAddr + 0x10, flags = 4, value = "~A8 BL [PC,#" .. Offset1 .. "]"}, {address = EmptyAddr + 0x14, flags = 4, value = "~A8 MOV X19, X0"}, {address = EmptyAddr + 0x18, flags = 4, value = "~A8 MOV X0, X19"}, {address = EmptyAddr + 0x1C, flags = 4, value = "~A8 LDR W1, [PC,#0x70]"}, {address = EmptyAddr + 0x20, flags = 4, value = "~A8 BL [PC,#".. Offset2 .. "]"}, {address = EmptyAddr + 0x24, flags = 4, value = "~A8 MOV X20, X0"}, {address = EmptyAddr + 0x28, flags = 4, value = "~A8 MOV X0, X19"}, {address = EmptyAddr + 0x2C, flags = 4, value = "~A8 BL [PC,#".. Offset3 .. "]"}, {address = EmptyAddr + 0x30, flags = 4, value = "~A8 MOV X21, X0"}, {address = EmptyAddr + 0x34, flags = 4, value = "~A8 LDR X22, [X21,#0x18]"}, {address = EmptyAddr + 0x38, flags = 4, value = "~A8 LDR W23, [X21,#0x20]"}, {address = EmptyAddr + 0x3C, flags = 4, value = "~A8 ADD X22, X22, #0x28"}, {address = EmptyAddr + 0x40, flags = 4, value = "~A8 MOV X24, XZR"}, {address = EmptyAddr + 0x44, flags = 4, value = "~A8 CMP X24, X23"}, {address = EmptyAddr + 0x48, flags = 4, value = "~A8 B.GE [PC,#0x2C]"}, {address = EmptyAddr + 0x4C, flags = 4, value = "~A8 MOV X9, #0x18"}, {address = EmptyAddr + 0x50, flags = 4, value = "~A8 MUL X9, X24, X9"}, {address = EmptyAddr + 0x54, flags = 4, value = "~A8 ADD X9, X22, X9"}, {address = EmptyAddr + 0x58, flags = 4, value = "~A8 LDR W10, [X9]"}, {address = EmptyAddr + 0x5C, flags = 4, value = "~A8 LDR W11, [PC,#0x2C]"}, {address = EmptyAddr + 0x60, flags = 4, value = "~A8 CMP W10, W11"}, {address = EmptyAddr + 0x64, flags = 4, value = "~A8 B.NE [PC,#0x8]"}, {address = EmptyAddr + 0x68, flags = 4, value = "~A8 STR X20, [X9,#0x8]"}, {address = EmptyAddr + 0x6C, flags = 4, value = "~A8 ADD X24, X24, #0x1"}, {address = EmptyAddr + 0x70, flags = 4, value = "~A8 B [PC,#-0x2C]"}, {address = EmptyAddr + 0x74, flags = 4, value = "~A8 LDP X23, X24, [SP], #0x10"}, {address = EmptyAddr + 0x78, flags = 4, value = "~A8 LDP X21, X22, [SP], #0x10"}, {address = EmptyAddr + 0x7C, flags = 4, value = "~A8 LDP X19, X20, [SP], #0x10"}, {address = EmptyAddr + 0x80, flags = 4, value = "~A8 LDP X29, X30, [SP], #0x10"}, {address = EmptyAddr + 0x84, flags = 4, value = "~A8 RET"}, {address = EmptyAddr + 0x88, flags = 4, value = id1}, {address = EmptyAddr + 0x8C, flags = 4, value = id2}, {address = Update + 0x00, flags = 4, value = "~A8 B [PC,#".. Offset4 .. "]"}, } gg.setValues(SetValues) gg.sleep(500) setvalue(Update + 0x00, 4, Value) end function AddCryptKey(resName, key) local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local Update = il2cpp + 0x579C918 local il2cpp_string_new = il2cpp + 0x3DFBAF8 local AddCryptKey = il2cpp + 0x42B7F48 local EmptyAddr = il2cpp + 0x16A0F00 local Offset1 = CalculateOffset(EmptyAddr, il2cpp_string_new, 0xC) local Offset2 = CalculateOffset(EmptyAddr, il2cpp_string_new, 0x18) local Offset3 = CalculateOffset(EmptyAddr, AddCryptKey, 0x28) local Offset4 = CalculateOffset(Update, EmptyAddr, 0x0) local Value = getDword(Update) local bytes1 = StringToBytes(resName) local bytes2 = StringToBytes(key) local StringValues = {} for i, b in ipairs(bytes1) do table.insert(StringValues, {address = EmptyAddr + 0x50 + (i - 1), flags = 1, value = b}) end for i, b in ipairs(bytes2) do table.insert(StringValues, {address = EmptyAddr + 0x100 + (i - 1), flags = 1, value = b}) end table.insert(StringValues, {address = EmptyAddr + 0x50 + #bytes1, flags = 4, value = 0}) table.insert(StringValues, {address = EmptyAddr + 0x100 + #bytes2, flags = 4, value = 0}) gg.setValues(StringValues) local SetValues = { {address = EmptyAddr + 0x00, flags = 4, value = "~A8 STP X29, X30, [SP,#-0x10]!"}, {address = EmptyAddr + 0x04, flags = 4, value = "~A8 STP X19, X20, [SP,#-0x10]!"}, {address = EmptyAddr + 0x08, flags = 4, value = "~A8 LDR X0, [PC,#0x30]"}, {address = EmptyAddr + 0x0C, flags = 4, value = "~A8 BL [PC,#".. Offset1 .. "]"}, {address = EmptyAddr + 0x10, flags = 4, value = "~A8 MOV X19, X0"}, {address = EmptyAddr + 0x14, flags = 4, value = "~A8 LDR X0, [PC,#0x2C]"}, {address = EmptyAddr + 0x18, flags = 4, value = "~A8 BL [PC,#".. Offset2 .. "]"}, {address = EmptyAddr + 0x1C, flags = 4, value = "~A8 MOV X20, X0"}, {address = EmptyAddr + 0x20, flags = 4, value = "~A8 MOV X0, X19"}, {address = EmptyAddr + 0x24, flags = 4, value = "~A8 MOV X1, X20"}, {address = EmptyAddr + 0x28, flags = 4, value = "~A8 BL [PC,#".. Offset3 .. "]"}, {address = EmptyAddr + 0x2C, flags = 4, value = "~A8 LDP X19, X20, [SP], #0x10"}, {address = EmptyAddr + 0x30, flags = 4, value = "~A8 LDP X29, X30, [SP], #0x10"}, {address = EmptyAddr + 0x34, flags = 4, value = "~A8 RET"}, {address = EmptyAddr + 0x38, flags = 32, value = EmptyAddr + 0x50}, {address = EmptyAddr + 0x40, flags = 32, value = EmptyAddr + 0x100}, {address = Update + 0x00, flags = 4, value = "~A8 B [PC,#" .. Offset4 .. "]"}, } gg.setValues(SetValues) end function showDuihua(title, text, bgAlpha) local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local Update = il2cpp + 0x57E8430 local getInstance = il2cpp + 0x4AEF0D0 local showDuihua = il2cpp + 0x4AF2410 local EmptyAddr = il2cpp + 0x16A1000 local il2cpp_string_new = il2cpp + 0x3DFBAF8 local Offset1 = CalculateOffset(EmptyAddr, il2cpp_string_new, 0xC) local Offset2 = CalculateOffset(EmptyAddr, il2cpp_string_new, 0x18) local Offset3 = CalculateOffset(EmptyAddr, getInstance, 0x20) local Offset4 = CalculateOffset(EmptyAddr, showDuihua, 0x34) local Offset5 = CalculateOffset(Update, EmptyAddr, 0x0) local Value = getDword(Update) local bytes1 = StringToBytes(title) local bytes2 = StringToBytes(text) local StringValues = {} for i, b in ipairs(bytes1) do table.insert(StringValues, {address = EmptyAddr + 0x58 + (i - 1), flags = 1, value = b}) end for i, b in ipairs(bytes2) do table.insert(StringValues, {address = EmptyAddr + 0x108 + (i - 1), flags = 1, value = b}) end table.insert(StringValues, {address = EmptyAddr + 0x58 + #bytes1, flags = 4, value = 0}) table.insert(StringValues, {address = EmptyAddr + 0x108 + #bytes2, flags = 4, value = 0}) gg.setValues(StringValues) local SetValues = { {address = EmptyAddr + 0x00, flags = 4, value = "~A8 STP X29, X30, [SP,#-0x10]!"}, {address = EmptyAddr + 0x04, flags = 4, value = "~A8 STP X19, X20, [SP,#-0x10]!"}, {address = EmptyAddr + 0x08, flags = 4, value = "~A8 LDR X0, [PC,#0x3C]"}, {address = EmptyAddr + 0x0C, flags = 4, value = "~A8 BL [PC,#" .. Offset1 .. "]"}, {address = EmptyAddr + 0x10, flags = 4, value = "~A8 MOV X19, X0"}, {address = EmptyAddr + 0x14, flags = 4, value = "~A8 LDR X0, [PC,#0x38]"}, {address = EmptyAddr + 0x18, flags = 4, value = "~A8 BL [PC,#" .. Offset2 .. "]"}, {address = EmptyAddr + 0x1C, flags = 4, value = "~A8 MOV X20, X0"}, {address = EmptyAddr + 0x20, flags = 4, value = "~A8 BL [PC,#" .. Offset3 .. "]"}, {address = EmptyAddr + 0x24, flags = 4, value = "~A8 MOV X0, X0"}, {address = EmptyAddr + 0x28, flags = 4, value = "~A8 MOV X1, X19"}, {address = EmptyAddr + 0x2C, flags = 4, value = "~A8 MOV X2, X20"}, {address = EmptyAddr + 0x30, flags = 4, value = "~A8 LDR S3, [PC,#0x20]"}, {address = EmptyAddr + 0x34, flags = 4, value = "~A8 BL [PC,#" .. Offset4 .. "]"}, {address = EmptyAddr + 0x38, flags = 4, value = "~A8 LDP X19, X20, [SP], #0x10"}, {address = EmptyAddr + 0x3C, flags = 4, value = "~A8 LDP X29, X30, [SP], #0x10"}, {address = EmptyAddr + 0x40, flags = 4, value = "~A8 RET"}, {address = EmptyAddr + 0x44, flags = 32, value = EmptyAddr + 0x58}, {address = EmptyAddr + 0x4C, flags = 32, value = EmptyAddr + 0x108}, {address = EmptyAddr + 0x54, flags = 16, value = bgAlpha}, {address = Update + 0x00, flags = 4, value = "~A8 B [PC,#" .. Offset5 .. "]"} } gg.setValues(SetValues) gg.sleep(500) setvalue(Update, 4, Value) end function Unbuild() local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local Update = il2cpp + 0x57E8430 local getInstance = il2cpp + 0x4AEF0D0 local Unbuild = il2cpp + 0x4AEF8B4 local EmptyAddr = il2cpp + 0x16A1300 local Offset1 = CalculateOffset(EmptyAddr, getInstance, 0x4) local Offset2 = CalculateOffset(EmptyAddr, Unbuild, 0xC) local Offset3 = CalculateOffset(Update, EmptyAddr, 0x0) local Value = getDword(Update) local SetValues = { {address = EmptyAddr + 0x00, flags = 4, value = "~A8 STP X29, X30, [SP,#-0x10]!"}, {address = EmptyAddr + 0x04, flags = 4, value = "~A8 BL [PC,#" .. Offset1 .. "]"}, {address = EmptyAddr + 0x08, flags = 4, value = "~A8 MOV X0, X0"}, {address = EmptyAddr + 0x0C, flags = 4, value = "~A8 BL [PC,#" .. Offset2 .. "]"}, {address = EmptyAddr + 0x10, flags = 4, value = "~A8 LDP X29, X30, [SP], #0x10"}, {address = EmptyAddr + 0x14, flags = 4, value = "~A8 RET"}, {address = Update + 0x00, flags = 4, value = "~A8 B [PC,#" .. Offset3 .. "]"} } gg.setValues(SetValues) gg.sleep(500) setvalue(Update, 4, Value) end --------------恢复值变量-------------- local CryptKeyValue = nil local HasReleased1 = nil local HasReleased2 = nil --------------功能函数-------------- function Process() gg.toast('请选择当前游戏最大的内存') gg.setProcessX() gg.setConfig("快速冻结", 1) gg.setConfig("冻结间隔", 0) end function a1() -- 防闪 local tersafe = isELF("libtersafe.so") if tersafe == 0 then gg.alert("未找到 libtersafe.so") return end local text = tersafe + 0x20B198 local exit = tersafe + 0x536EE0 local time = tersafe + 0x5365A0 local gettimeofday = tersafe + 0x536510 local clock_gettime = tersafe + 0x536770 local none = tersafe + 0xAC5F4 local SetValues = { {address = text + 0x00, flags = 4, value = "~A8 RET"}, {address = exit + 0x00, flags = 4, value = "~A8 RET"}, {address = time + 0x00, flags = 4, value = "~A8 RET"}, {address = gettimeofday + 0x00, flags = 4, value = "~A8 RET"}, {address = clock_gettime + 0x00, flags = 4, value = "~A8 RET"}, {address = none + 0x00, flags = 4, value = 0} } gg.setValues(SetValues) gg.toast("防闪开启成功") end -- 改忍者功能子项 function c1() -- 改密钥忍者 local id = gg.prompt({"请输入被修改忍者的ID(默认小佐助)", "请输入修改忍者的ID(默认天道超)", "是否改子技能"}, {"90003001", "90321001", false}, {"text", "text", "checkbox"}) if id == nil then return end SetNinjaID1(id[1], id[2], id[3]) SetNinjaID2(id[1], id[2]) gg.toast("改密钥忍者开启成功") end function c2() -- 改副本忍者 local lastid1, lastid2 = "90003", "77559" local file = io.open("/sdcard/Android/改忍者记录.txt", "r") if file then local lastLine = "" for line in file:lines() do lastLine = line end file:close() if lastLine ~= "" then local a, b = string.match(lastLine, "(.-) → (.*)") if a and b then lastid1, lastid2 = a, b end end end local id = gg.prompt({"输入被修改忍者的ID(例如小佐助90003)", "输入修改忍者的ID(例如六道斑77559)"}, {lastid1, lastid2}, {"text", "text"}) if id == nil then return end file = io.open("/sdcard/Android/改忍者记录.txt", "a") if file then file:write(id[1] .. " → " .. id[2] .. "\n") file:close() end searchValue("改忍者", ";" .. id[1], nil, 32, 2, false) gg.getResults(10000) gg.editAll(";" .. id[2], 2) gg.clearResults() gg.toast("改忍者开启成功") end function c3() -- 改立绘 local id = gg.prompt({"90xxx", "输入要改的忍者例会"}, {"003", "101"}, {"text", "text"}) if id == nil then return end searchValue("改立绘", "90" .. id[1] .. "001;20" .. id[1] .. ";10" .. id[1], "90" .. id[1] .. "001", 32, 4, false) gg.getResults(10000) gg.editAll("90" .. id[2] .. "001", 4) gg.clearResults() gg.toast("改立绘开启成功") end function c4() -- 改子技能 local id = gg.prompt({"请输入想改忍者的子技能的ID"}, {"90003"}, {"text"}) if id == nil then return end searchValue("子技能", id[1].. "0101;0;0;1::25", "0", 32, 4, false) gg.getResults(10000) gg.editAll("901140851;901141051", 4) gg.clearResults() gg.toast("改子技能开启成功") end function c5() -- 改预览忍者 local id = gg.prompt({"自定义预览忍者ID(如90503001):"}, {"90503001"}, {"text"}) if id == nil then return end local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local get_CurrentNinjaId = il2cpp + 0x87BC3DC local SetValues = { {address = get_CurrentNinjaId + 0x00, flags = 4, value = "~A8 LDR W0, [PC,#0x8]"}, {address = get_CurrentNinjaId + 0x04, flags = 4, value = "~A8 RET"}, {address = get_CurrentNinjaId + 0x08, flags = 4, value = id[1]} } gg.setValues(SetValues) gg.toast("改预览忍者开启成功") end function c6() -- 过PVE local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local toPVP = il2cpp + 0x6ECD548 setvalue(toPVP, 4, "~A8 MOV W20, WZR") gg.toast("过PVE开启成功") end function c7() -- 实战落地 local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local get_isNeedJumpInMode = il2cpp + 0x5DC8248 local SetValues = { {address = get_isNeedJumpInMode + 0x00, flags = 4, value = "~A8 MOV X0, XZR"}, {address = get_isNeedJumpInMode + 0x04, flags = 4, value = "~A8 RET"} } gg.setValues(SetValues) gg.toast("实战落地开启成功") end function c8() -- 训练营落地 local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local BuildSelf = il2cpp + 0xA57B1B0 local BuildAI = il2cpp + 0xA57BA94 local SetValues = { {address = BuildSelf + 0x00, flags = 4, value = "~A8 MOV W20, WZR"}, {address = BuildAI + 0x00, flags = 4, value = "~A8 MOV W20, WZR"} } gg.setValues(SetValues) gg.toast("训练营落地开启成功") end function c9() -- 去异常弹窗 local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local CallActivityFunction = il2cpp + 0x7DAFE20 setvalue(CallActivityFunction, 4, "~A8 RET") gg.toast("去异常弹窗开启成功") end function c10() -- 忍者解密 local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local AddCryptKey = il2cpp + 0x42B7F48 if not CryptKeyValue then CryptKeyValue = getDword(AddCryptKey) end local choice = gg.alert("请选择操作:", "关闭功能", "开启功能") if choice == 1 then setvalue(AddCryptKey, 4, CryptKeyValue) gg.toast("副本忍者解密关闭成功") elseif choice == 2 then setvalue(AddCryptKey, 4, "~A8 RET") gg.toast("副本忍者解密开启成功") end end function c11() -- 密钥添加 local input = gg.prompt({"请输入资源名称(默认天道超)", "请输入密钥(默认天道超)"}, {"LogicData/Actor/90321_p", "db842be92d9b8d581d4b21b01018a43e0af63e8cb2e93660255b9b7c24a1f1c6"}, {"text", "text"}) if input == nil then return end AddCryptKey(input[1], input[2]) gg.toast("添加忍者密钥开启成功") end -- 改场景功能子项 function b12() -- 显示隐藏忍者 local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local get_HasReleased = il2cpp + 0x6C8EE94 if not HasReleased1 then HasReleased1 = getDword(get_HasReleased) HasReleased2 = getDword(get_HasReleased + 0x04) end local choice = gg.alert("请选择操作:", "关闭功能", "开启功能") if choice == 1 then local SetValues = { {address = get_HasReleased + 0x00, flags = 4, value = HasReleased1}, {address = get_HasReleased + 0x04, flags = 4, value = HasReleased2} } gg.setValues(SetValues) gg.toast("显示隐藏忍者关闭成功") elseif choice == 2 then local SetValues = { {address = get_HasReleased + 0x00, flags = 4, value = "~A8 MOV W0, #0x1"}, {address = get_HasReleased + 0x04, flags = 4, value = "~A8 RET"} } gg.setValues(SetValues) gg.toast("显示隐藏忍者开启成功") end end function d17() -- 自定义训练营场景 local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local get_PracticeFieldSceneID = il2cpp + 0xA569A7C local value = gg.prompt({"请输入您想改的场景ID:"}, {"1001"}, {"text"}) if value == nil then return end local SetValues = { {address = get_PracticeFieldSceneID + 0x00, flags = 4, value = "~A8 LDR W0, [PC,#0x8]"}, {address = get_PracticeFieldSceneID + 0x04, flags = 4, value = "~A8 RET"}, {address = get_PracticeFieldSceneID + 0x08, flags = 4, value = value[1]}, } gg.setValues(SetValues) gg.toast("自定义训练营场景开启成功") end function d18() -- 自定义决斗场场景 local il2cpp = isELF("libil2cpp.so") if il2cpp == 0 then return end local get_sceneID = il2cpp + 0x5D6D6A8 local value = gg.prompt({"请输入您想改的场景ID:"}, {"1001"}, {"text"}) if value == nil then return end local SetValues = { {address = get_sceneID + 0x00, flags = 4, value = "~A8 LDR W0, [PC,#0x8]"}, {address = get_sceneID + 0x04, flags = 4, value = "~A8 RET"}, {address = get_sceneID + 0x08, flags = 4, value = value[1]}, } gg.setValues(SetValues) gg.toast("自定义决斗场场景开启成功") end --------------菜单函数-------------- function C() -- 改忍者功能菜单 local choice = gg.multiChoice({ "改密钥忍者", "改副本忍者", "改立绘", "改子技能", "改预览忍者", "过PVE", "实战落地", "训练营落地", "去异常弹窗", "忍者解密", "密钥添加", "返回主页" }, nil, "改忍者功能") if choice == nil then return end if choice[1] then c1() end if choice[2] then c2() end if choice[3] then c3() end if choice[4] then c4() end if choice[5] then c5() end if choice[6] then c6() end if choice[7] then c7() end if choice[8] then c8() end if choice[9] then c9() end if choice[10] then c10() end if choice[11] then c11() end if choice[12] then Main() end end function D() -- 改场景功能菜单 local choice = gg.multiChoice({ "显示隐藏忍者", "自定义训练营场景", "自定义决斗场场景", "返回主页" }, nil, "改场景功能") if choice == nil then return end if choice[1] then b12() end if choice[2] then d17() end if choice[3] then d18() end if choice[4] then Main() end end function Main() local choice = gg.choice({ "选择进程", "防闪", "改忍者功能", "改场景功能", "退出" }, nil, "定制版") if choice == 1 then Process() elseif choice == 2 then a1() elseif choice == 3 then C() elseif choice == 4 then D() else os.exit() end end --------------主循环-------------- while true do if gg.isVisible(true) then gg.setVisible(false) Main() end gg.sleep(10) end