可乐助手内存功能脚本写法¶
1. Lua 基础介绍¶
1.1 Lua 版本¶
可乐助手使用 Lua 5.4.7 作为脚本引擎,提供强大的脚本编程能力。
1.2 标准库¶
Lua 标准库包含以下主要模块:
- 基础库 (base): 提供基本函数如
print()
,type()
,tonumber()
,tostring()
等 - 字符串库 (string): 字符串操作函数如
string.find()
,string.sub()
,string.format()
等 - 表库 (table): 表操作函数如
table.insert()
,table.remove()
,table.sort()
等 - 数学库 (math): 数学函数如
math.floor()
,math.ceil()
,math.random()
等 - 输入输出库 (io): 文件操作函数如
io.open()
,io.read()
,io.write()
等 - 操作系统库 (os): 系统相关函数如
os.time()
,os.date()
,os.execute()
等 - 调试库 (debug): 调试相关函数
- 协程库 (coroutine): 协程操作函数
2. cola 库 - 内存操作核心¶
2.1 库介绍¶
cola 库是为了还原 GameGuardian 的 gg 库而设计的扩展库,提供了完整的内存搜索、读取、写入等功能。该库是可乐助手内存修改功能的核心,支持多种数据类型的内存操作。
2.2 数据类型常量¶
cola.TYPE_BYTE = 1 -- 1字节整数
cola.TYPE_WORD = 2 -- 2字节整数
cola.TYPE_DWORD = 4 -- 4字节整数
cola.TYPE_QWORD = 32 -- 8字节整数
cola.TYPE_FLOAT = 16 -- 4字节浮点数
cola.TYPE_DOUBLE = 64 -- 8字节双精度浮点数
2.3 内存区域常量¶
cola.REGION_ANONYMOUS = 32 -- 匿名内存
cola.REGION_ASHMEM = 524288 -- Android共享内存
cola.REGION_BAD = 131072 -- 坏内存区域
cola.REGION_CODE_APP = 16384 -- 应用代码区
cola.REGION_CODE_SYS = 32768 -- 系统代码区
cola.REGION_C_ALLOC = 4 -- C分配内存
cola.REGION_C_BSS = 16 -- C BSS段
cola.REGION_C_DATA = 8 -- C数据段
cola.REGION_C_HEAP = 1 -- C堆内存
cola.REGION_JAVA = 65536 -- Java内存
cola.REGION_JAVA_HEAP = 2 -- Java堆内存
cola.REGION_OTHER = -2080896 -- 其他内存区域
cola.REGION_PPSSPP = 262144 -- PPSSPP模拟器内存
cola.REGION_STACK = 64 -- 栈内存
cola.REGION_VIDEO = 1048576 -- 视频内存
2.4 核心函数¶
2.4.1 cola.setRanges(ranges)¶
设置搜索的内存区域范围。
参数:
- ranges
: 内存区域类型(使用上面定义的REGION常量)
示例:
cola.setRanges(cola.REGION_C_ALLOC) -- 设置搜索C分配内存
2.4.2 cola.searchNumber(value, value_type [, memoryFrom, memoryTo])¶
在指定内存区域中搜索数值。
参数:
- value
: 要搜索的数值
- value_type
: 数值类型(使用上面定义的TYPE常量)
- memoryFrom
: 可选,搜索起始地址
- memoryTo
: 可选,搜索结束地址
返回值: - 找到的结果数量
示例:
cola.setRanges(cola.REGION_C_ALLOC)
local count = cola.searchNumber(100, cola.TYPE_DWORD)
print("Found", count, "results")
-- 在指定地址范围内搜索
local count2 = cola.searchNumber(100, cola.TYPE_DWORD, 0x10000000, 0x20000000)
2.4.3 cola.getResults([max_count, skip])¶
获取搜索结果。
参数:
- max_count
: 可选,最大返回结果数
- skip
: 可选,跳过的结果数
返回值: - 结果表数组,每个结果包含地址、标志和值
示例:
local results = cola.getResults(10) -- 获取前10个结果
for i, result in ipairs(results) do
print("Address:", string.format("0x%x", result.address),
"Value:", result.value)
end
2.4.4 cola.getResultsCount()¶
获取搜索结果总数。
返回值: - 结果总数
示例:
local count = cola.getResultsCount()
print("Total results:", count)
2.4.5 cola.setValues(values_table)¶
修改内存中的值。
参数:
- values_table
: 包含地址、类型和新值的表数组
返回值: - 布尔值,表示是否全部修改成功
示例:
local modify_list = {
{address = 0x12345678, flags = cola.TYPE_DWORD, value = 999},
{address = 0x12345680, flags = cola.TYPE_FLOAT, value = 3.14}
}
local success = cola.setValues(modify_list)
print("Modification", success and "successful" or "failed")
2.4.6 cola.getValues(addresses_table)¶
读取内存中的值。
参数:
- addresses_table
: 包含地址和类型的表数组
返回值: - 包含地址和值的结果表数组
示例:
local read_list = {
{address = 0x12345678, flags = cola.TYPE_DWORD},
{address = 0x12345680, flags = cola.TYPE_FLOAT}
}
local values = cola.getValues(read_list)
for i, v in ipairs(values) do
print("Address:", string.format("0x%x", v.address), "Value:", v.value)
end
2.4.7 cola.clearResults()¶
清空搜索结果。
示例:
cola.clearResults()
2.4.8 cola.getTargetPackage()¶
获取目标包名。
返回值: - 目标包名字符串
示例:
local package = cola.getTargetPackage()
print("Target package:", package)
2.4.9 cola.getRangesList([module_name])¶
获取内存区域列表。
参数:
- module_name
: 可选,模块名称过滤
返回值: - 内存区域信息表数组
示例:
local ranges = cola.getRangesList()
for i, range in ipairs(ranges) do
print("Start:", string.format("0x%x", range.start),
"End:", string.format("0x%x", range.end),
"Type:", range.type)
end
3. tools 库 - 便捷工具函数¶
3.1 库介绍¶
tools 库提供了一些便捷的封装函数,简化常见的内存操作任务。这些函数基于 cola 库构建,提供更高级的抽象和更简单的使用方式。
3.2 核心函数¶
3.2.1 tools.getModuleAddress(moduleName, permission, index)¶
获取指定模块的地址。
参数:
- moduleName
: 模块名称
- permission
: 权限类型
- index
: 索引(第几个匹配的模块)
返回值: - 模块起始地址,如果未找到则返回 nil
示例:
-- 获取第一个匹配的libc.so模块地址
local libc_addr = tools.getModuleAddress("libc.so", "r-xp", 1)
if libc_addr then
print("libc.so address:", string.format("0x%x", libc_addr))
else
print("libc.so not found")
end
3.2.2 tools.pointerChain(baseAddress, chains)¶
执行指针链跟踪。
参数:
- baseAddress
: 基础地址
- chains
: 偏移量数组
返回值: - 最终计算得到的地址
示例:
-- 跟踪指针链: baseAddr -> [baseAddr + 0x10] -> [result + 0x20]
local base_addr = 0x12345678
local final_addr = tools.pointerChain(base_addr, {0x10, 0x20})
print("Final address:", string.format("0x%x", final_addr))
3.2.3 tools.fastSearch(Search, Group)¶
快速搜索并修改内存值的组合函数。
参数:
- Search
: 搜索条件数组,每个元素包含 {值, 类型, 偏移/内存区域}
- Group
: 修改组数组,每个元素包含 {新值, 类型, 偏移}
返回值: - 布尔值,表示是否找到并成功修改
示例:
-- 搜索特定的数值组合并修改
local search_pattern = {
{100, cola.TYPE_DWORD, cola.REGION_C_ALLOC}, -- 搜索值100
{200, cola.TYPE_DWORD, 4} -- 在+4偏移处搜索值200
}
local modify_group = {
{999, cola.TYPE_DWORD, 0}, -- 将第一个值改为999
{888, cola.TYPE_DWORD, 4} -- 将+4偏移处的值改为888
}
local success = tools.fastSearch(search_pattern, modify_group)
print("Fast search and modify:", success and "successful" or "failed")
4. 完整示例¶
4.1 基础内存搜索和修改¶
-- 设置目标包名(通常由可乐助手自动设置)
print("Target package:", cola.getTargetPackage())
-- 设置搜索范围为C分配内存
cola.setRanges(cola.REGION_C_ALLOC)
-- 搜索数值100(DWORD类型)
local count = cola.searchNumber(100, cola.TYPE_DWORD)
print("Found", count, "results")
if count > 0 then
-- 获取前5个结果
local results = cola.getResults(5)
-- 显示结果
for i, result in ipairs(results) do
print(string.format("Result %d: Address=0x%x, Value=%d",
i, result.address, result.value))
end
-- 修改第一个结果的值
if #results > 0 then
local modify_list = {
{address = results[1].address, flags = cola.TYPE_DWORD, value = 999}
}
local success = cola.setValues(modify_list)
print("Modification", success and "successful" or "failed")
end
end
-- 清空搜索结果
cola.clearResults()
4.2 使用工具函数的高级示例¶
-- 获取模块地址
local module_addr = tools.getModuleAddress("libgame.so", "r-xp", 1)
if module_addr then
print("Game module found at:", string.format("0x%x", module_addr))
-- 使用指针链
local player_data = tools.pointerChain(module_addr + 0x1000, {0x20, 0x10, 0x8})
print("Player data address:", string.format("0x%x", player_data))
-- 读取玩家数据
local player_values = cola.getValues({
{address = player_data, flags = cola.TYPE_DWORD}, -- 生命值
{address = player_data + 4, flags = cola.TYPE_DWORD}, -- 魔法值
{address = player_data + 8, flags = cola.TYPE_FLOAT} -- 经验值
})
print("Player HP:", player_values[1].value)
print("Player MP:", player_values[2].value)
print("Player EXP:", player_values[3].value)
end
-- 使用快速搜索功能
local search_success = tools.fastSearch(
{{1000, cola.TYPE_DWORD, cola.REGION_C_ALLOC}}, -- 搜索生命值1000
{{9999, cola.TYPE_DWORD, 0}} -- 修改为9999
)
if search_success then
print("Health modified successfully!")
else
print("Health modification failed")
end
5. 注意事项¶
- 权限要求: 内存操作需要 root 权限
- 目标进程: 确保目标应用正在运行
- 内存保护: 某些内存区域可能受到保护,无法修改
- 数据类型: 选择正确的数据类型很重要,错误的类型可能导致搜索失败
- 内存地址: 内存地址在每次应用启动时可能会变化(ASLR)
- 搜索范围: 合理选择搜索范围可以提高搜索效率和准确性
6. 调试技巧¶
- 使用 print() 输出调试信息
- 检查搜索结果数量,避免结果过多或过少
- 使用 cola.getTargetPackage() 确认目标包名
- 通过 cola.getRangesList() 查看可用的内存区域
- 分步骤执行,逐步验证每个操作的结果