-- ============================================ -- 脚本名称:千夏范围优化完整版 -- 作者:千夏 -- 官方频道:@QXNB9178 -- 版本:1.0 (完整功能优化版) -- 描述:基于原“千夏泛滥.lua”,重构并整合全部9个功能。 -- 核心逻辑不变,代码结构、注释、错误处理全面优化。 -- ============================================ -- 初始化提示 mr = gg.alert("公告:\n欢迎使用千夏范围\n作者:千夏\n官方频道:@QXNB9178\n记得反馈 ", "进入千夏范围") DM = "欢迎使用千夏范围 祝你们玩的开心 记得给反馈 " -- ============================================ -- 核心工具函数库 (高度复用) -- ============================================ --- 字符串分割函数 local function split(szFullString, szSeparator) local nFindStartIndex, nSplitIndex, nSplitArray = 1, 1, {} 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 --- 通用内存修改/冻结函数 local function xgxc(szpy, qmxg) local xgsl, xgjg = 0, false for i = 1, #qmxg do local item = { address = szpy + qmxg[i].offset, flags = qmxg[i].type, value = qmxg[i].value } if qmxg[i].freeze then item.freeze = true gg.addListItems({item}) else gg.setValues({item}) end xgsl = xgsl + 1 xgjg = true end return xgsl, xgjg end --- 通用内存搜索与批量修改 (核心函数) local function xqmnb(qmnb, qmxg) if not qmnb or not qmxg then gg.toast("参数错误") return false, 0 end gg.clearResults() gg.setRanges(qmnb[1].memory or gg.REGION_ANONYMOUS) gg.searchNumber(qmnb[3].value, qmnb[3].type, false, gg.SIGN_EQUAL, 0, -1) if gg.getResultCount() == 0 then gg.toast((qmnb[2].name or "功能") .. " 搜索失败") return false, 0 end for _ = 1, 3 do gg.refineNumber(qmnb[3].value, qmnb[3].type) end if gg.getResultCount() == 0 then gg.toast((qmnb[2].name or "功能") .. " 精筛失败") return false, 0 end local sl = gg.getResults(999999) local sz = math.min(gg.getResultCount(), 999999) local totalModified, isModified = 0, false for i = 1, sz do local isPatternMatch = true for v = 4, #qmnb do if isPatternMatch then local checkAddr = sl[i].address + qmnb[v].offset local checkValue = gg.getValues({{address = checkAddr, flags = qmnb[v].type}})[1].value local expectedStr = tostring(qmnb[v].lv) .. ";" .. tostring(checkValue) local splitResult = split(expectedStr, ";") if splitResult[1] ~= splitResult[2] then isPatternMatch = false break end end end if isPatternMatch then local modifiedCount, modifySuccess = xgxc(sl[i].address, qmxg) totalModified = totalModified + modifiedCount isModified = modifySuccess or isModified end end if isModified then gg.toast((qmnb[2].name or "功能") .. " 开启成功,修改 " .. totalModified .. " 条") else gg.toast((qmnb[2].name or "功能") .. " 无匹配数据") end return isModified, totalModified end --- 播放TTS语音提示 local function playTTS(text) if text and text ~= "" then local url = "https://fanyi.baidu.com/gettts?lan=zh&text=" .. text .. "&spd=5&source=wise" gg.playMusic(url) end end -- ============================================ -- 功能模块函数 (1-9) - 全部功能完整实现 -- ============================================ function a() -- 1. 选择游戏进程 gg.setProcessX() gg.toast("游戏进程已切换") end function b() -- 2. 64位防闪 gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber(';测试版本不代表最终品质', gg.TYPE_WORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(520) gg.editAll(';频道@FYHOOKK', gg.TYPE_WORD) draw.setSize(50) draw.setStyle('填充') local t = {} t[1] = gg.getRangesList("libanogs.so")[1].start + 0x213000 t[2] = gg.getRangesList("libanogs.so")[1].start + 0x2AE72C gg.addListItems({ {address = t[1], flags = 4, value = -698416192, freeze = true}, {address = t[2], flags = 4, value = -698416192, freeze = true} }) DM = "游戏防闪⁶⁴开启成功" gg.toast(DM) playTTS(DM) end function c() -- 3. HOOK范围 local OP = gg.prompt({'请输入范围值 (100-300):'}, {[1] = '200'}, {[1] = 'number'}) if not OP or OP[1] == '' or tonumber(OP[1]) == 0 then gg.toast("已取消") return end local customValue = tonumber(OP[1]) -- 组1: 头部范围 local qmnb1 = { {memory = 32}, {name = "头部范围"}, {value = 4740038608910024704, type = 32}, {lv = 4752423507886342144, offset = 4, type = 32}, {lv = 1106509824, offset = 8, type = 32}, } local qmxg1 = { {value = 150, offset = 0, type = 16}, {value = 150, offset = 4, type = 16}, {value = 150, offset = 8, type = 16}, } xqmnb(qmnb1, qmxg1) -- 组2: 伤害范围 local qmnb2 = { {memory = 32}, {name = "伤害范围"}, {value = 4771563806291656704, type = 32}, {lv = 1110966272, offset = 4, type = 32}, {lv = 4692750811720056832, offset = -4, type = 32}, } local qmxg2 = { {value = 9999, offset = 0, type = 16}, } xqmnb(qmnb2, qmxg2) -- 应用自定义值 gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("25;30.5", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) local res = gg.getResults(1000) if #res > 0 then for _, v in ipairs(res) do v.value = customValue end gg.setValues(res) end -- 其他内存修改 gg.clearResults(); gg.setRanges(gg.REGION_CODE_APP) gg.searchNumber("-443715560;-299365883", gg.TYPE_DWORD) gg.refineNumber("-443715560", gg.TYPE_DWORD) gg.getResults(10); gg.editAll("0", gg.TYPE_DWORD) gg.clearResults(); gg.setRanges(16384) gg.searchNumber("-289596733;-308983296;-298640831;-298370492;-294581562;-298706367:193", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100); gg.editAll("0", gg.TYPE_DWORD) gg.clearResults(); gg.setRanges(gg.REGION_CODE_APP) gg.searchNumber("-299365883", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(200); gg.editAll("10", gg.TYPE_DWORD) gg.processResume() DM = "HOOK范围开启成功" gg.toast(DM) playTTS(DM) end function d() -- 4. 千夏独家爆头范围 -- 使用xqmnb执行修改 local qmnb = { {memory = 32}, {name = "爆头范围"}, {value = 4771563806291656704, type = 32}, {lv = 1110966272, offset = 4, type = 32}, {lv = 4692750811720056832, offset = -4, type = 32}, } local qmxg = { {value = 99995, offset = 0, type = 16}, } xqmnb(qmnb, qmxg) -- 命中特效修改 local function mnnb(Search, Write, Neicun, Mingcg, Shuzhiliang) gg.clearResults(); gg.setRanges(Neicun) gg.searchNumber(Search[1][1], Search[1][3]) local count = gg.getResultCount() if count == 0 then return false end local result = gg.getResults(count) for i, v in ipairs(result) do v.isUseful = true end for k = 2, #Search do local tmp = {} local offset = Search[k][2] - Search[1][2] for i, v in ipairs(result) do tmp[#tmp+1] = {address = v.address + offset, flags = Search[k][3]} end tmp = gg.getValues(tmp) for i, v in ipairs(tmp) do if tostring(v.value) ~= tostring(Search[k][1]) then result[i].isUseful = false end end end local data = {} 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 > Shuzhiliang and Shuzhiliang or #data) do for _, w in ipairs(Write) do offset = w[2] - base t[#t+1] = {address = data[i] + offset, flags = w[3], value = w[1]} end end gg.setValues(t) gg.toast(Mingcg .. " 修改 " .. #t .. " 条") end return true end mnnb({{10.0,0,16},{46.0,4,16},}, {{2000,0,16},}, 32, "命中特效", 999) -- 直接地址修改 local so = gg.getRangesList('libUE4.so')[1].start local py = 0x2C54E90 gg.setValues({{address = so + py, flags = 16, value = -9.90696528E27}}) gg.clearResults(); gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("23;25;30.5", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("300", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(10); gg.editAll("250", gg.TYPE_FLOAT) gg.searchNumber("30.5;25", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(10); gg.editAll("220", gg.TYPE_FLOAT) gg.toast("独家爆头范围开启成功") end function e() -- 5. 千夏路飞范围2 -- 指针计算函数 (保留原逻辑) local function S_Pointer(A0_19, A1_20, A2_21) local function getWritableRanges() local ranges = {} for _, r in pairs(gg.getRangesList("^/data/*.so*$")) do if r.type:sub(2, 2) == "w" then table.insert(ranges, r) end end return ranges end local writable = getWritableRanges() local targetRange for _, r in ipairs(writable) do if A0_19[1] == r.internalName:gsub("^.*/", "") and A0_19[2] == r.state then targetRange = r break end end if not targetRange then return "0x0" end local currentAddress = targetRange.start + A1_20[1] for i = 2, #A1_20 do local val = gg.getValues({{address = currentAddress, flags = 4}})[1].value if not gg.getTargetInfo().x64 then val = val & 4294967295 end currentAddress = val + A1_20[i] end return string.format("0x%X", currentAddress) end -- 范围修改 gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("30.5;25", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1, 0) gg.processResume(); gg.editAll("240", gg.TYPE_FLOAT) gg.processResume() gg.searchNumber("25;30.5", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1, 0) gg.processResume(); gg.editAll("170", gg.TYPE_FLOAT) gg.clearResults() gg.searchNumber("4,752,423,507,886,342,144", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("4,752,423,507,916,455,936", gg.TYPE_QWORD) gg.clearResults() gg.searchNumber("1,106,509,824", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("300", gg.TYPE_FLOAT) gg.clearResults() gg.setRanges(gg.REGION_CODE_APP) gg.searchNumber("-3.77830899e28;-3.74440972e28;-3.71834013e28;-1.7334334e28", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1, 0) gg.refineNumber("-3.77830899e28", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(999999); gg.editAll("0", gg.TYPE_FLOAT) gg.processResume() gg.searchNumber("-299365883", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(200); gg.editAll("10", gg.TYPE_DWORD) gg.processResume() gg.clearResults(); gg.setRanges(32) gg.searchNumber("10.0F;10.0F;10.0F;10.0F;45:193", 16, false, 536870912, 0, -1) gg.searchNumber("10", 16, false, 536870912, 0, -1) gg.getResults(100); gg.editAll("200", 16) gg.toast("路飞范围2开启成功") end function f() -- 6. 千夏测试范围[指针写法] local function SearchWrite(Search, Modification) gg.clearResults() gg.searchNumber(Search[1][1], Search[1][2], false, 536870912, 0, -1) if gg.getResultCount() == 0 then gg.toast('开启失败') return end local Result = gg.getResults(gg.getResultCount()) local sum = 0 for i = 2, #Search do for idx = 1, #Result do if gg.getValues({{address = Result[idx].address + Search[i][3], flags = Search[i][2]}})[1].value ~= Search[i][1] then Result[idx].Usable = true sum = sum + 1 end end end if sum == #Result then gg.toast('开启失败') return end local Data, Freeze, Freezes = {}, {}, 0 sum = 0 for _, value in pairs(Modification) do for idx = 1, #Result do if not Result[idx].Usable then local Value = { address = Result[idx].address + value[3], flags = value[2], value = value[1], freeze = true } sum = sum + 1 if value[4] then Freeze[#Freeze+1] = Value Freezes = Freezes + 1 else Data[#Data+1] = Value end end end end gg.setValues(Data) if #Freeze > 0 then gg.addListItems(Freeze) end gg.toast('测试范围开启成功,修改 ' .. sum .. ' 条,冻结 ' .. Freezes .. ' 条') end gg.setRanges(32) local tb1 = { {30.5, 16, 0}, {30.5, 16, 0}, } local tb2 = { {110, 16, 0, false}, } SearchWrite(tb1, tb2) end function g() -- 7. 千夏自研范围 gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber(';测试版本不代表最终品质', gg.TYPE_WORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(520); gg.editAll(';频道@FYHOOKK', gg.TYPE_WORD) gg.searchNumber("4,752,423,507,886,342,144", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("4,752,423,507,916,455,936", gg.TYPE_QWORD) gg.clearResults() gg.searchNumber("1,106,509,824", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("1,138,425,856", gg.TYPE_QWORD) gg.clearResults() gg.searchNumber("10.0F;10.0F;10.0F;10.0F;45:193", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("10", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100); gg.editAll("250", gg.TYPE_FLOAT) gg.alert("自研范围开启成功") gg.clearResults(); gg.setRanges(gg.REGION_BAD) gg.searchNumber("-88.66608428955;26:512", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("26", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(2); gg.editAll("-460", gg.TYPE_FLOAT) gg.searchNumber("-88.73961639404;28:512", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.searchNumber("28", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(2); gg.editAll("-560", gg.TYPE_FLOAT) DM = "自研范围开启成功" playTTS(DM) gg.toast(DM) end function h() -- 8. 千夏冲榜爆头范围 gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber(';测试版本不代表最终品质', gg.TYPE_WORD, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(520); gg.editAll(';频道FYHOOKK', gg.TYPE_WORD) -- 基础范围修改 gg.searchNumber("4,752,423,507,886,342,144", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("4,752,423,507,916,455,936", gg.TYPE_QWORD) gg.clearResults() gg.searchNumber("1,106,509,824", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("1,138,425,856", gg.TYPE_QWORD) gg.clearResults() gg.searchNumber("30.5;25", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.refineNumber("23", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(1111); gg.editAll("15", gg.TYPE_FLOAT) gg.clearResults() gg.searchNumber("25;30.5", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100); gg.editAll("350", gg.TYPE_FLOAT) gg.clearResults() -- 多组xqmnb修改 local qmnb1 = { {memory = 32}, {name = "冲榜范围1"}, {value = 4740038608910024704, type = 32}, {lv = 4752423507886342144, offset = 4, type = 32}, {lv = 1106509824, offset = 8, type = 32}, } local qmxg1 = { {value = 700, offset = 4, type = 16}, {value = 700, offset = 8, type = 16}, } xqmnb(qmnb1, qmxg1) local qmnb2 = { {memory = 32}, {name = "冲榜范围2"}, {value = 4719772412750681088, type = 32}, {lv = 4742290408720039936, offset = 4, type = 32}, } local qmxg2 = { {value = -460, offset = 8, type = 16}, } xqmnb(qmnb2, qmxg2) local qmnb3 = { {memory = 32}, {name = "冲榜范围3"}, {value = -4417614866316724128, type = 32}, {lv = 4724276012378061824, offset = 4, type = 32}, } local qmxg3 = { {value = -560, offset = 12, type = 16}, } xqmnb(qmnb3, qmxg3) local qmnb4 = { {memory = 32}, {name = "冲榜范围4"}, {value = -4416487068034336768, type = 32}, {lv = 4724276012378323968, offset = 4, type = 32}, } local qmxg4 = { {value = -660, offset = 8, type = 16}, {value = -660, offset = 12, type = 16}, } xqmnb(qmnb4, qmxg4) DM = "冲榜爆头范围开启成功" gg.toast(DM) playTTS(DM) end function i() -- 9. 千夏凌晨范围 gg.clearResults() gg.setRanges(gg.REGION_ANONYMOUS) gg.searchNumber("4,752,423,507,886,342,144", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("4,752,423,507,916,455,936", gg.TYPE_QWORD) gg.clearResults() gg.searchNumber("1,106,509,824", gg.TYPE_QWORD, false, gg.SIGN_EQUAL, 0, -1, 0) gg.getResults(100); gg.editAll("1,138,425,856", gg.TYPE_QWORD) gg.clearResults() gg.searchNumber("23;25;30.5", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.refineNumber("23", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(1111); gg.editAll("15", gg.TYPE_FLOAT) gg.clearResults() gg.searchNumber("25;30.5", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1) gg.getResults(100); gg.editAll("250", gg.TYPE_FLOAT) gg.clearResults() -- 多组xqmnb修改 local qmnb1 = { {memory = 32}, {name = "凌晨范围1"}, {value = 4740038608910024704, type = 32}, {lv = 4752423507886342144, offset = 4, type = 32}, {lv = 1106509824, offset = 8, type = 32}, } local qmxg1 = { {value = 700, offset = 4, type = 16}, {value = 700, offset = 8, type = 16}, } xqmnb(qmnb1, qmxg1) local qmnb2 = { {memory = 32}, {name = "凌晨范围2"}, {value = 4719772412750681353, type = 32}, {lv = 4742290408720039936, offset = 4, type = 32}, } local qmxg2 = { {value = -460, offset = 8, type = 16}, } xqmnb(qmnb2, qmxg2) local qmnb3 = { {memory = 32}, {name = "凌晨范围3"}, {value = -4417614866316724128, type = 32}, {lv = 4724276012378061487, offset = 4, type = 32}, } local qmxg3 = { {value = -560, offset = 12, type = 16}, } xqmnb(qmnb3, qmxg3) local qmnb4 = { {memory = 32}, {name = "凌晨范围4"}, {value = -4416487068034336677, type = 32}, {lv = 4724276012378324073, offset = 4, type = 32}, } local qmxg4 = { {value = -660, offset = 8, type = 16}, {value = -660, offset = 12, type = 16}, } xqmnb(qmnb4, qmxg4) DM = "凌晨范围开启成功" gg.toast(DM) playTTS(DM) end function Exit() print("@FYHOOKK") gg.toast("感谢使用,脚本已退出") os.exit() end -- ============================================ -- 主菜单与循环 -- ============================================ function Main() SN = gg.choice({ "1. 选择游戏进程", "2. 64位防闪", "3. HOOK范围", "4. 千夏独家爆头范围(风险)", "5. 千夏路飞范围2", "6. 千夏测试范围[指针](风险)", "7. 千夏自研范围", "8. 千夏冲榜爆头范围", "9. 千夏凌晨范围", "10. 退出脚本" }, nil, "千夏范围助手 - 完整优化版\n官方频道:@QXNB9178") if SN == 1 then a() end if SN == 2 then b() end if SN == 3 then c() end if SN == 4 then d() end if SN == 5 then e() end if SN == 6 then f() end if SN == 7 then g() end if SN == 8 then h() end if SN == 9 then i() end if SN == 10 then Exit() end end -- 主循环 cs = "@FYHOOKK" while true do if gg.isVisible(true) then gg.setVisible(false) Main() end gg.sleep(100) end