本文由周某(既本人)整理。
——
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}})
这个是修改了
--