S_Pointer 函数:用于获取指定 SO 文件的内存地址
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(0x1c00f400)
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
print(string.char(231,190,164,58).._Q)
end
return _S
end
local _A = string.format('0x%X', Get_Address(t_So, t_Offset, _bit))
return _A
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
local t = {"libil2cpp.so:bss", "Cb"}
local tt = {0x2DB20, 0xA0, 0xE0}
local ttt = S_Pointer(t, tt, true)
gg.addListItems({{address = ttt, flags = 4, value = 165675026, freeze = true}})
local t = {"libtersafe.so:bss", "Cb"}
local tt = {0x6110}
local ttt = S_Pointer(t, tt, true)
gg.addListItems({{address = ttt, flags = 4, value = 2, freeze = true}})
local t = {"libtersafe.so:bss", "Cb"}
local tt = {0x2698}
local ttt = S_Pointer(t, tt, true)
gg.addListItems({{address = ttt, flags = 4, value = 2, freeze = true}})
gg.clearResults()
gg.clearList()
gg.alert("开启成功")
while true do
if gg.isVisible(true) then
gg.setVisible(false)
end
gg.clearResults()
end
代码说明:
-
S_Pointer 函数:
- 获取目标 SO 文件的地址范围。
- 根据输入的 SO 文件名称、偏移量和位数,计算目标内存地址。
- 返回该地址的十六进制字符串表示。
-
setvalue 函数:
- 用于修改指定内存地址的值。
-
while 循环:
- 循环检测 GG 游戏守护进程的界面是否可见。
- 如果可见,则将其隐藏,并清除所有搜索结果。
代码作用:
- 获取目标 SO 文件中指定位置的内存地址。
- 修改指定内存地址的值。
- 隐藏 GG 游戏守护进程的界面,防止其干扰程序运行。
代码解释:
代码中的 while true do 循环是一个无限循环,用于确保在程序执行期间 GG 游戏守护进程界面不会干扰到程序的正常运行。该代码段会不断检测 GG 游戏守护进程的界面是否可见,如果可见则将其隐藏,然后清除所有的搜索结果。
结论:
这段代码不应该被删除,因为它确保了在程序执行期间 GG 游戏守护进程界面不会干扰到程序的正常运行。
注意:
代码中的 gg.isVisible(true) 和 gg.setVisible(false) 是 GG 游戏守护进程的 API 函数,需要使用 GG 游戏守护进程的库文件才能使用。
代码优化建议:
- 使用更具描述性的变量名。
- 使用注释解释代码逻辑。
- 将代码分解成更小的函数,提高代码可读性和可维护性。
- 使用更安全的方式处理内存地址,例如使用
gg.checkAddress函数检查地址是否有效。 - 使用
gg.closeApp函数关闭 GG 游戏守护进程,而不是隐藏其界面。
代码安全建议:
- 不要在代码中使用硬编码的内存地址,而是使用变量或函数获取内存地址。
- 使用更安全的方式处理用户输入,例如使用
gg.trim函数去除字符串中的空格和特殊字符。 - 避免在代码中使用
gg.alert函数,因为该函数会显示在游戏界面上,可能会干扰游戏正常运行。 - 使用更安全的方式处理文件和网络操作,例如使用
gg.fopen函数打开文件,使用gg.download函数下载文件。
代码示例:
-- 获取目标 SO 文件的内存地址
local address = S_Pointer({"libil2cpp.so:bss", "Cb"}, {0x2DB20, 0xA0, 0xE0}, true)
-- 修改指定内存地址的值
setvalue(address, 4, 165675026)
-- 隐藏 GG 游戏守护进程的界面
gg.setVisible(false)
原文地址: https://www.cveoy.top/t/topic/pZ3V 著作权归作者所有。请勿转载和采集!