lua脚本外挂写法[全网最全最早发布]

您所在的位置:网站首页 lua脚本apex lua脚本外挂写法[全网最全最早发布]

lua脚本外挂写法[全网最全最早发布]

2023-08-01 19:25| 来源: 网络整理| 查看: 265

本文由周某(既本人)整理。

——

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 xqmnb(qmnb)   gg.clearResults()   gg.setRanges(qmnb[1]["memory"])   gg.toast("开始搜索") gg.setVisible(false)   gg.searchNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)   if gg.getResultCount() == 0 then gg.setVisible(false)     gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false)    else     gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)     gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)     gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false) gg.setVisible(false)    if gg.getResultCount() == 0 then gg.setVisible(false)      gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false) gg.setVisible(false)     else gg.setVisible(false)      sl = gg.getResults(999999) gg.setVisible(false)      sz = gg.getResultCount() gg.setVisible(false)      xgsl = 0 if sz > 999999 then gg.setVisible(false)        sz = 999999 end for i = 1, sz do         pdsz = true for v = 4, #(qmnb) do if             pdsz == true then gg.setVisible(false)             pysz = {} pysz[1]             = {} pysz[1].address             = sl[i].address + qmnb[v]["offset"] pysz[1].flags             = qmnb[v]["type"]             szpy = gg.getValues(pysz)             pdpd = qmnb[v]["lv"] .. ";" .. szpy[1].value szpd             = split(pdpd, ";") tzszpd             = szpd[1] pyszpd = szpd[2]             if tzszpd == pyszpd then               pdjg = true pdsz = true else               pdjg = false pdsz = false end end end if           pdjg == true then szpy           = sl[i].address xgxc(szpy, qmxg) end end gg.setVisible(false)      if xgjg == true then gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "成功")         else gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "失败")  end end end end

D=gg.TYPE_DWORD  E=gg.TYPE_DOUBLE  F=gg.TYPE_FLOAT W=gg.TYPE_WORD B=gg.TYPE_BYTE X=gg.TYPE_XOR Q=gg.TYPE_QWORD

------------------------------------------------------------------------------------------------------------------------------- gg.alert("输入一开始提示的文字一般是欢迎之类的") function main()--这个是当运行main时显示这个页面   aa=gg.choice({     "◎第一个分类◎",     "◎第二个分类◎",     "◎退出◎",   },0,"输入页面上方显示的文字,一般是这里是主菜单") if aa==1 then a1() end--前面的1是指按下第一个按钮,后面的a1是指运行a1文件 if aa==2 then a2() end--前面的2是指按下第二个按钮,后面的a2是指运行a2文件 if aa==3 then gg.toast("已退出\n感谢使用")print("已退出")os.exit() end--没什么好说的 end ------------------------------------------------------------------------------------------------------------------------------- function a1()--这个是当运行main时显示这个页面联系到上面的代码意思是按下菜单的第一个按钮运行这个页面     aa=gg.choice({         "丨☔功能1🔥丨",         "丨☔功能2🔥丨",         "丨☔功能3🔥丨",         "丨☔功能4🔥丨",         "丨☔返回主菜单🔥丨",       },0,"输入页面上方显示的文字,一般是这里是分类的名字概括里面功能") if aa==1 then dd1() end--前面的1是指按下第一个按钮,后面的dd1是指运行dd1文件{注意:所有调用的a1、dd1之类的不能重复} if aa==2 then dd2() end--前面的2是指按下第二个按钮,后面的dd2是指运行dd2文件 if aa==3 then dd3() end--前面的3是指按下第三个按钮,后面的dd3是指运行dd3文件 if aa==4 then dd4() end--前面的4是指按下第四个按钮,后面的dd4是指运行dd4文件 if aa==5 then main() end--前面的5是指按下第五个按钮,后面的main是指运行main文件而main是对应的主菜单所以就回到了主菜单 ------------------------------------------------------------------------------------------------------------------------------------------------下面是放上源码就好了 --如: function dd1() ----此处放功能 ----此处放功能 ----此处放功能 ----此处放功能 ----此处放功能 --功能长度没有限制 end--这个end很重要,是结束这个功能的没有这个end会直接报错如果你得到的功能源码里有end则不需要单独加 ------------------------------------------------------------------------------------------------------------------------------------------------如: function t2() qmnb = { {["memory"] = 16384}, {["name"] = "加速"}, {["value"] = 0.0010000000474974513, ["type"] = 16}, {["lv"] = 0.20000000298023224, ["offset"] = -4, ["type"] = 16}, {["lv"] = 0.0, ["offset"] = 4, ["type"] = 16}, {["lv"] = 0.10000000149011612, ["offset"] = 8, ["type"] = 16}, } qmxg = { {["value"] = 0.2, ["offset"] = 0, ["type"] = 16}, } xqmnb(qmnb) end --这是你得到的源码,想要加到功能里只需要把function t2()这个改成对应被运行的 --如:加到功能一里面只需要改成function dd1()即可 function dd1() qmnb = { {["memory"] = 16384}, {["name"] = "加速"}, {["value"] = 0.0010000000474974513, ["type"] = 16}, {["lv"] = 0.20000000298023224, ["offset"] = -4, ["type"] = 16}, {["lv"] = 0.0, ["offset"] = 4, ["type"] = 16}, {["lv"] = 0.10000000149011612, ["offset"] = 8, ["type"] = 16}, } qmxg = { {["value"] = 0.2, ["offset"] = 0, ["type"] = 16}, } xqmnb(qmnb) end --这样就好了其他的功能一样 --这就是功能调用 ------------------------------------------------------------------------------------------------------------------------------------------------下面的脚本的结束,也就是脚本必须要有的部分 while true do if gg.isVisible(true) then     gg.setVisible(false)     main()     gg.clearResults()     gg.setVisible(false) end 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 xqmnb(qmnb)   gg.clearResults()   gg.setRanges(qmnb[1]["memory"])   gg.toast("开始搜索") gg.setVisible(false)   gg.searchNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)   if gg.getResultCount() == 0 then gg.setVisible(false)     gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false)    else     gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)     gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)     gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false) gg.setVisible(false)    if gg.getResultCount() == 0 then gg.setVisible(false)      gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false) gg.setVisible(false)     else gg.setVisible(false)      sl = gg.getResults(999999) gg.setVisible(false)      sz = gg.getResultCount() gg.setVisible(false)      xgsl = 0 if sz > 999999 then gg.setVisible(false)        sz = 999999 end for i = 1, sz do         pdsz = true for v = 4, #(qmnb) do if             pdsz == true then gg.setVisible(false)             pysz = {} pysz[1]             = {} pysz[1].address             = sl[i].address + qmnb[v]["offset"] pysz[1].flags             = qmnb[v]["type"]             szpy = gg.getValues(pysz)             pdpd = qmnb[v]["lv"] .. ";" .. szpy[1].value szpd             = split(pdpd, ";") tzszpd             = szpd[1] pyszpd = szpd[2]             if tzszpd == pyszpd then               pdjg = true pdsz = true else               pdjg = false pdsz = false end end end if           pdjg == true then szpy           = sl[i].address xgxc(szpy, qmxg) end end gg.setVisible(false)      if xgjg == true then gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "成功")         else gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "失败")  end end end end function editData(qmnb,qmxg)gg.setVisible(false)gg.clearResults()qmnbv=qmnb[3]["value"]or qmnb[3][1]qmnbt=qmnb[3]["type"]or qmnb[3][2]qmnbn=qmnb[2]["name"]or qmnb[2][1]gg.setRanges(qmnb[1]["memory"]or qmnb[1][1])gg.searchNumber(qmnbv,qmnbt)gg.refineNumber(qmnbv,qmnbt)sz=gg.getResultCount()if sz==0 then gg.toast(qmnbn.."开启失败")else sl=gg.getResults(999999)for i=1,sz do pdsz=true for v=4,#qmnb do if pdsz==true then pysz={{}}pysz[1].address=sl[i].address+(qmnb[v]["offset"]or qmnb[v][2])pysz[1].flags=qmnb[v]["type"]or qmnb[v][3]szpy=gg.getValues(pysz)tzszpd=tostring(qmnb[v]["lv"]or qmnb[v][1]):gsub(",","")pyszpd=tostring(szpy[1].value):gsub(",","")if tzszpd==pyszpd then pdjg=true pdsz=true else pdjg=false pdsz=false end end end if pdjg==true then szpy=sl[i].address for x=1,#qmxg do xgsz=qmxg[x]["value"]or qmxg[x][1]xgpy=szpy+(qmxg[x]["offset"]or qmxg[x][2])xglx=qmxg[x]["type"]or qmxg[x][3]xgdj=qmxg[x]["freeze"]or qmxg[x][4]xg={{address=xgpy,flags=xglx,value=xgsz}}if xgdj==true then xg[1].freeze=xgdj gg.addListItems(xg)else gg.setValues(xg)end end xgjg=true end end if xgjg==true then gg.toast(qmnbn.."开启成功")else gg.toast(qmnbn.."开启失败")end end end D=gg.TYPE_DWORD  E=gg.TYPE_DOUBLE  F=gg.TYPE_FLOAT W=gg.TYPE_WORD B=gg.TYPE_BYTE X=gg.TYPE_XOR Q=gg.TYPE_QWORD ------------------------------------------------------------------------------------------------------------------------------------------------------------- gg.alert("输入一开始提示的文字") function main()   aa=gg.choice({     "◎第一个分类◎",     "◎第二个分类◎",     "◎退出◎",   },0,"主菜单") if aa==1 then a1() end if aa==2 then a2() end if aa==3 then gg.toast("已退出\n感谢使用")print("已退出")os.exit() end end ------------------------------------------------------------------------------------------------------------------------------------------------------------- function a1()     aa=gg.choice({         "丨☔功能1🔥丨",         "丨☔功能2🔥丨",         "丨☔功能3🔥丨",         "丨☔功能4🔥丨",         "丨☔返回主菜单🔥丨",       },0,"功能") if aa==1 then aa1() end if aa==2 then aa2() end if aa==3 then aa3() end if aa==4 then aa4() end if aa==5 then main() end end ------------------------------------------------------------------------------------------------------------------------------------------------------------- function a2()     aa=gg.choice({         "丨☔功能1🔥丨",         "丨☔功能2🔥丨",         "丨☔功能3🔥丨",         "丨☔功能4🔥丨",         "丨☔返回主菜单🔥丨",       },0,"功能") if aa==1 then dd1() end if aa==2 then dd2() end if aa==3 then dd3() end if aa==4 then dd4() end if aa==5 then main() end end ------------------------------------------------------------------------------------------------------------------------------------------------------------- 放入功能

------------------------------------------------------------------------------------------------------------------------------------------------------------- while true do if gg.isVisible(true) then     gg.setVisible(false)     main()     gg.clearResults()     gg.setVisible(false) end end

第二课: 普通写法: function aa1()--早说过了 gg.clearResults()--意思是清楚搜索记录 gg.setRanges(gg.REGION_C_ALLOC)--设置内存范围 gg.searchNumber("搜索的值", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_DWORD内存类型 gg.searchNumber("改善的值", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_DWORD内存类型 gg.getResults(100)--设置改多少个100是改前一百个 gg.editAll("修改的值", gg.TYPE_FLOAT)-- gg.TYPE_FLOAT内存类型 gg.clearResults()--意思是清楚搜索记录 gg.toast("提示的文字") end

--下面是普通写法冻结模板 function HS16()      gg.clearResults()--意思是清楚搜索记录      gg.setRanges(262207)--设置内存范围ps内存      gg.searchNumber("搜索的值", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_FLOAT内存类型      gg.searchNumber("改善的值", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_FLOAT内存类型      jg=gg.getResults(100)--设置改多少个100是改前一百个      sl=gg.getResultCount()      for i = 1, sl do           dzy=jg[i].address           gg.addListItems({[1] = {address = dzy,flags = gg.TYPE_FLOAT,freeze = true,value = 修改的值}})      end      gg.toast("提示文字")      gg.clearResults() end

freeze = false--不冻结 freeze = true--冻结

------------------------------------------------------------------------------------------------------------------------------------------------------------- 1. function:函数,功能

2. gg.alert  弹出提示窗口

3. gg.toast 屏幕下方弹出提示条( 会自动消失 )

3. gg.prompt 弹出带有控件的提示窗口

4. gg.choice 弹出单选列表窗口

5. gg.clearResults 清除搜索结果

6. gg.editAll 修改搜索结果

7. gg.getFile 获取当前脚本所在目录

8. gg.getResults 获取搜索结果

9. gg.getResultCount 获取搜索结果数量

10. gg.setRanges 设置搜索内存

下面是内存范围 Jh内存: ['REGION_JAVA_HEAP'] = 2,

Ch内存: ['REGION_C_HEAP'] = 1,

Ca内存: ['REGION_C_ALLOC'] = 4,

Cd内存: ['REGION_C_DATA'] = 8,

Cb内存: ['REGION_C_BSS'] = 16,

Ps内存:['REGION_PPSSPP'] = 262144,

A内存: ['REGION_ANONYMOUS'] = 32,

J内存: ['REGION_JAVA'] = 65536,

S内存: ['REGION_STACK'] = 64,

As内存: ['REGION_ASHMEM'] = 524288,

V内存: ['REGION_VIDEO'] = 1048576,

O内存 ['REGION_OTHER'] = -2080896,

B内存: ['REGION_BAD'] = 131072,

Xa内存: ['REGION_CODE_APP'] = 16384,

Xs内存: ['REGION_CODE_SYS'] = 32768, 数字是内存的代号可以这么理解在偏移写法中比较常见普通写法也可以用 比如:gg.setRanges(gg.REGION_C_ALLOC)=gg.setRanges(4)意思都是设置范围是ca

内存种类 A类搜: ['TYPE_AUTO'] = 127,

B类搜: ['TYPE_BYTE'] = 1,

E类搜: ['TYPE_DOUBLE'] = 64,

D类搜: ['TYPE_DWORD'] = 4,

F类搜: ['TYPE_FLOAT'] = 16,

Q类搜: ['TYPE_QWORD'] = 32,

W类搜: ['TYPE_WORD'] = 2,

X类搜: ['TYPE_XOR'] = 8,  数字代表同上 不同内存管理的数据不一样 人物一般在f内存 改物附魔在w内存 个数,模式在d内存

偏移写法:

function ab7()--同上 qmnb = { {["memory"] = 内存范围用数字写}, {["name"] = "名字"}, {["value"] = 主特征码, ["type"] = 内存类型},一个永远不变的值 {["lv"] = 副特征码, ["offset"] = 偏移, ["type"] = 内存类型},一个永远不变的值,偏移是这个值到主特征中间值的个数 } qmxg = { {["value"] = 修改后的值, ["offset"] = 偏移, ["type"] = 内存类型,["freeze"] = false},偏移是到主特征的值的个数 } end

["freeze"] = false--不冻结 ["freeze"] = true--冻结

--建议用内存工具找特征

---------------------------------------------------------------------------------------------------------------------------------------------------------- 指针写法: function 功能名称()     gg.setRanges(gg.REGION_BAD) --设定搜索范围     local dataType = gg.TYPE_FLOAT --数据类型     gg.clearResults()--意思是清楚搜索记录     local 搜索数组 = {                     {主特征码, 主特征码偏移}, {副特征码1, 副特征码偏移}, {副特征码2, 副特征码偏移2},                     }     local 写入数组 = {                     {数值1, 相对主特征码偏移1, 是否冻结(可以留空, 表示不冻结 true表示冻结)}, {数值2, 相对主特征码偏移2, 是否冻结},                      }

end

偏移的计算与xs的方法相同

----------------------------------------------------------------------------------------------------------------------------------------------------------基址写法:

function a3() gg.clearResults()--意思是清楚搜索记录 local t = {"libUE4.so:bss", "Cb"} local tt = {0x1B7B8, 0x5E8, 0x640, 0x53C,0x690} local ttt = S_Pointer(t, tt, true) gg.setValues({{address = ttt, flags = 4, value = 41792}}) gg.toast("提示") end

libUE4.so:bss基址 Cb范围 0x1B7B8, 0x5E8, 0x640, 0x53C,0x690指针 找到基址然后一层一层的跳最后找到那个真值 如找一个人 基址是中国国门 第一个0x1B7B8相当于省 第二个0x5E8相当于市 第三个0x640相当于区 第四个0x53C相当于镇 第五个0x690相当于门牌号 这样你就找到这个人了 值也一样这样就都找到了 然后修改 gg.setValues({{address = ttt, flags = 4, value = 41792}}) 这个是修改了 --

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3