可乐助手内存功能脚本写法

1. Lua 基础介绍

1.1 Lua 版本

可乐助手使用 Lua 5.4.7 作为脚本引擎,提供强大的脚本编程能力。

1.2 标准库

Lua 标准库包含以下主要模块:

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. 注意事项

  1. 权限要求: 内存操作需要 root 权限
  2. 目标进程: 确保目标应用正在运行
  3. 内存保护: 某些内存区域可能受到保护,无法修改
  4. 数据类型: 选择正确的数据类型很重要,错误的类型可能导致搜索失败
  5. 内存地址: 内存地址在每次应用启动时可能会变化(ASLR)
  6. 搜索范围: 合理选择搜索范围可以提高搜索效率和准确性

6. 调试技巧

  1. 使用 print() 输出调试信息
  2. 检查搜索结果数量,避免结果过多或过少
  3. 使用 cola.getTargetPackage() 确认目标包名
  4. 通过 cola.getRangesList() 查看可用的内存区域
  5. 分步骤执行,逐步验证每个操作的结果