开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6283|回复: 160
收起左侧

[易源码分享] 【Gemini 3Pro】模拟器CeServer内存读写-AI帮助我成功

  [复制链接]
结帖率:83% (5/6)
发表于 2025-11-28 21:17:44 | 显示全部楼层 |阅读模式   湖南省长沙市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
[color=rgba(0, 0, 0, 0.9)]心路历程(AI润色):
我目前用的是模拟器特征码内存扫描,但速度实在太慢了,有时候一次扫描就要10秒左右。于是我开始琢磨能不能直接读写模拟器内存,结果逛了一圈论坛,发现根本没有相关模块。B站倒是有人做,但开口就要300块。
不死心,我打开了GitHub,惊喜地发现已经有大佬开源了 Ceserver-api 这个项目!立马装上试试,结果一看——只能Python调用。那咋办?这时候想到了最近很火的 Gemini,于是把Python代码丢给它,让它帮我转写成C++,方便编译成DLL给易语言调用。
折腾了一番,终于搞定了!虽然还没正式用上,但困扰我已久的问题总算有了突破。本着“大家先用”的原则,先分享出来再说!
中间其实还走过不少弯路。之前为了解决这个问题,我还专门去研究了 Frida,结果踩了个大坑:模拟器是 x86_64 架构,而游戏本身是 ARM 架构,导致 Frida 根本读取不到 so 库,白忙活一场。

现在回头看看,这一路真是跌跌撞撞,好在最后终于找到了可行的方案。


github地址:https://github.com/NathanNT/ceserver-api 无比感谢
我会把C++的DLL源码和编译好的DLL以及易语言用例,发在附件。
ceserver我也打包了,放在里面。
附上一些adb的命令代码:
adb shell su
cd /data/local/tmp/ceserverbin76/
./ceserver_x86_64
adb forward tcp:52736 tcp:52736


下载地址:https://97f.lanzoue.com/itIFy3cegv7e
C++的DLL源码:https://97f.lanzoue.com/iJrqu3ceh56d

屏幕截图 2025-11-28 205651.png

评分

参与人数 6精币 +6 收起 理由
chuanqibuding + 1 感谢分享!
风雨3137 + 1 感谢分享,很给力!~
cui870222829 + 1 感谢分享,很给力!~
cbl521ysys + 1 感谢分享,很给力!~
恒大大 + 1 感谢分享,很给力!~
文西哥 + 1 感谢分享,很给力!~

查看全部评分


结帖率:83% (5/6)

签到天数: 1 天

 楼主| 发表于 2026-7-18 12:10:09 | 显示全部楼层   贵州省安顺市
music154 发表于 2026-7-4 19:12
如果说有多个模拟器窗口, 如何安装服务 并转发端口呢?

可以通过模拟器窗口索引来计算,例如计算本地映射端口 (52736 + 索引),下面是我自己写用到的例子:
  
窗口程序集名保 留  保 留备 注
CeServer程序集   
子程序名返回值类型公开备 注
CE初始化并部署逻辑型 
参数名类 型参考可空数组备 注
索引整数型
模拟器索引整数型
变量名类 型静态数组备 注
本地端口整数型 
运行目录文本型 
结果文本型 
连接句柄整数型 
i整数型 
检查文件结果文本型 
' 1. 计算本地映射端口 (52736 + 索引)
本地端口 = 52736 + 索引
' =========================================================
' 2. 检查 ceserver 是否已存在
' =========================================================
大漠多线程信息 [索引 + 1].雷电.置模拟器目录 (全局雷电目录)
检查文件结果 = 大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “shell ls /data/local/tmp/ceserver”)
调试输出 (“[索引”到文本 (索引)“] 文件检查结果: ” + 检查文件结果)
' =========================================================
' 1. 修改文件路径处理(防止路径末尾斜杠问题)
' =========================================================
运行目录 = 取运行目录 ()
如果真 (取文本右边 (运行目录, 1)“\”)
运行目录 = 运行目录 + “\”

' =========================================================
' 2. 增加 EXE 环境下的强力文件检查
' =========================================================
如果真 (文件是否存在 (运行目录 + “ceserver_x86_64”))
' 调试输出在EXE无效,所以必须用 列表框 信息框
_启动窗口.列表框1.插入项目 (0, “[严重错误] 目录下缺少 ceserver_x86_64 文件!”, )
信息框 (“请将 ceserver_x86_64 文件拷贝到本软件运行目录下!”, #错误图标, “文件缺失”, )
返回 ()

' =========================================================
' 3. 执行推送 (带 EXE 可见的错误提示)
' =========================================================
如果 (寻找文本 (检查文件结果, “No such file”, , ) ≠ -1 寻找文本 (检查文件结果, “ceserver”, , ) = -1)
_启动窗口.列表框1.插入项目 (0, “[索引”到文本 (索引)“] 正在推送 ceserver...”, )
结果 = 大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “push ”#引号 + 运行目录 + “ceserver_x86_64”#引号“ /data/local/tmp/ceserver”)
' 检查 ADB 返回的错误
如果真 (寻找文本 (结果, “error”, , ) ≠ -1 寻找文本 (结果, “cannot stat”, , ) ≠ -1)
_启动窗口.列表框1.插入项目 (0, “[错误] 推送失败:” + 结果, )
信息框 (“ADB推送失败,原因:”#换行符 + 结果, #错误图标, “错误”, )
返回 ()

' 赋权
大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “shell chmod 777 /data/local/tmp/ceserver”)
_启动窗口.列表框1.插入项目 (0, “[索引”到文本 (索引)“] 推送并赋权完成”, )

_启动窗口.列表框1.插入项目 (0, “[索引”到文本 (索引)“] 文件已存在,跳过推送”, )
' 即使存在也要赋权,防止权限丢失
大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “shell chmod 777 /data/local/tmp/ceserver”)

' =========================================================
' 3. [关键修改] 关闭 SELinux 安全策略
' 这一步非常重要!如果不关,即使有 Root 权限也可能读不到内存
大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “shell su -c setenforce 0”)
' 4. 清理旧进程
' 同样需要用 su -c 确保杀掉的是 Root 权限运行的旧进程
大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “shell su -c 'pkill -f ceserver'”)
' 5. [关键修改] 以 ROOT 权限启动服务
' 原代码: shell nohup ... (这是普通用户权限)
' 新代码: shell su -c "nohup ... &" (这是 ROOT 权限)
' 注意引号的嵌套,这里直接传给 adb 即可
结果 = 大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “shell su -c 'nohup /data/local/tmp/ceserver >/dev/null 2>&1 &'”)
' 调试输出 (“启动命令结果: ” + 结果)
' 6. 端口转发
结果 = 大漠多线程信息 [索引 + 1].雷电.adb (模拟器索引, “forward tcp:”到文本 (本地端口)“ tcp:52736”)
调试输出 (结果)
调试输出 (本地端口)
如果真 (寻找文本 (结果, “error”, , ) ≠ -1)
调试输出 (“[索引”到文本 (索引)“] 端口转发失败”)
返回 ()

' 7. 保存端口信息
大漠多线程信息 [索引 + 1].模拟器adb端口 = 本地端口
' 8. 尝试连接验证
计次循环首 (10, i)  ' 稍微增加尝试次数到10次,Root启动可能稍慢
程序_延时 (500)
连接句柄 = CE_连接 (“127.0.0.1”, 本地端口)
如果真 (连接句柄 ≠ 0)
CE_断开 (连接句柄)
调试输出 (“[索引”到文本 (索引)“] CE服务(Root)部署并验证成功!”)
_启动窗口.列表框1.插入项目 (0, “[索引”到文本 (索引)“] CE服务(Root)部署并验证成功!”, )
返回 ()

调试输出 (“[索引”到文本 (索引)“] 等待服务启动(”到文本 (i)“/10)...”)
计次循环尾 ()
调试输出 (“[索引”到文本 (索引)“] 严重错误:CE服务启动超时。”)
返回 ()
子程序名返回值类型公开备 注
解析指针链长整数型 
参数名类 型参考可空数组备 注
句柄整数型
基址长整数型
偏移数组整数型
当前类型文本型
变量名类 型静态数组备 注
当前指针长整数型 
下一个地址长整数型 
i整数型 
数组数量整数型 
最终偏移整数型 
当前偏移整数型 
' --- [调试开始] 打印输入参数 ---
调试输出 (“========== [解析指针链 开始] ==========”)
调试输出 (“[参数] 句柄:”, 句柄, “ | 基址(HEX):”, HEX (基址))
数组数量 = 取数组下标 (偏移数组, )
调试输出 (“[参数] 偏移层数:”, 数组数量)
如果真 (数组数量 = 0)
调试输出 (“[错误] 偏移数组为空,直接返回基址”)
返回 (基址)

' --- [第1步] 读取基址 ---
' 这里的读操作必须带句柄
当前指针 = 读长整数型 (句柄, 基址)
调试输出 (“[第 0 步] 读取基址:”, HEX (基址), “ -> 读到指针:”, HEX (当前指针))
如果真 (当前指针 < 65536)
调试输出 (“[错误] 基址指针无效 (空指针或太小):”, HEX (当前指针))
返回 (0)

' --- [第2步] 循环偏移 ---
如果真 (数组数量 > 1)
计次循环首 (数组数量 - 1, i)
当前偏移 = 偏移数组 [i]
' 计算逻辑:当前存放的指针值 + 当前层的偏移 = 下一个存放指针的内存地址
下一个地址 = 当前指针 + 当前偏移
调试输出 (“--------------------------------”)
调试输出 (当前类型 + “[第 ”到文本 (i)“ 层] 当前指针:”, HEX (当前指针), “ + 偏移:”, HEX (当前偏移))
调试输出 (当前类型 + “[第 ”到文本 (i)“ 层] 目标读取地址:”, HEX (下一个地址))
' 循环读指针,必须带句柄
当前指针 = 读长整数型 (句柄, 下一个地址)
调试输出 (当前类型 + “[第 ”到文本 (i)“ 层] 读取结果(新指针):”, HEX (当前指针))
如果真 (当前指针 < 65536)
调试输出 (当前类型 + “[错误] 第 ”到文本 (i)“ 层读取到的指针无效,链条中断!”)
返回 (0)

如果真 (当前指针 < 1e+014)
调试输出 (当前类型 + “[错误] 第 ”到文本 (i)“ 层读到异常指针(不在堆内存区): ”HEX (当前指针))
返回 (0)  ' 强制返回0,触发外部切换方案B

计次循环尾 ()

' --- [第3步] 最终计算 ---
最终偏移 = 偏移数组 [数组数量]
调试输出 (“--------------------------------”)
调试输出 (“[最终步] 最终指针:”, HEX (当前指针), “ + 最终偏移:”, HEX (最终偏移))
调试输出 (“[最终步] 结果地址:”, HEX (当前指针 + 最终偏移))
调试输出 (“========== [解析指针链 结束] ==========”)
返回 (当前指针 + 最终偏移)
子程序名返回值类型公开备 注
HEX文本型 
参数名类 型参考可空数组备 注
地址数值长整数型
' 调用易语言提供的长整数转十六进制函数
' 我们选择不补零,保持地址的简洁性
返回 (进制_十到十六 (地址数值, ))
子程序名返回值类型公开备 注
CE取进程PID整数型 
参数名类 型参考可空数组备 注
句柄整数型
寻找名称文本型
变量名类 型静态数组备 注
pid整数型 
p_name文本型 
is_first整数型 
ret整数型 
' 必须传入句柄
CE_初始化遍历 (句柄)
is_first = 1
p_name = 取空白文本 (256)
判断循环首 ()
ret = CE_遍历进程 (句柄, is_first, pid, p_name)
如果真 (ret = 0)
跳出循环 ()
' 调试输出 (p_name)
如果真 (寻找文本 (p_name, 寻找名称, , ) ≠ -1)
返回 (pid)
is_first = 0
判断循环尾 ()
返回 (0)
子程序名返回值类型公开备 注
读长整数型长整数型 
参数名类 型参考可空数组备 注
句柄整数型
地址长整数型
变量名类 型静态数组备 注
buf字节集 
实际读取长度整数型 
buf = 取空白字节集 (8)
实际读取长度 = CE_读内存 (句柄, 地址, 8, buf)
如果真 (实际读取长度 = 8)
返回 (取字节集数据 (buf, #长整数型, ))
调试输出 (“[DLL错误] 读长整数型失败!地址: ”HEX (地址)“ | DLL返回长度: ”到文本 (实际读取长度))
返回 (0)
子程序名返回值类型公开备 注
读小数型小数型 
参数名类 型参考可空数组备 注
句柄整数型
地址长整数型
变量名类 型静态数组备 注
buf字节集 
buf = 取空白字节集 (4)
' 调用DLL时带上句柄
如果真 (CE_读内存 (句柄, 地址, 4, buf) = 4)
返回 (取字节集数据 (buf, #小数型, ))
返回 (0)
子程序名返回值类型公开备 注
写小数型整数型 
参数名类 型参考可空数组备 注
句柄整数型
地址长整数型
数值小数型
变量名类 型静态数组备 注
buf字节集 
buf = 到字节集 (数值)
' 调用DLL时带上句柄
返回 (CE_写内存 (句柄, 地址, buf, 4))
' =========================================================
' 工具函数 (无需改动)
' =========================================================
子程序名返回值类型公开备 注
线程_初始化CE逻辑型 
参数名类 型参考可空数组备 注
索引整数型
变量名类 型静态数组备 注
句柄整数型 
PID整数型 
Il2cpp_基址2长整数型 
' 1. 建立连接
句柄 = CE_连接 (“127.0.0.1”, 大漠多线程信息 [索引 + 1].模拟器adb端口)
如果真 (句柄 = 0)
CE初始化并部署 (索引, 到整数 (_启动窗口.超级列表框1.取标题 (索引, 14)))
调试输出 (“[线程”到文本 (索引)“] CE连接失败”)
_启动窗口.列表框1.插入项目 (0, “[线程”到文本 (索引)“] CE连接失败”, )
返回 ()

' 2. 获取 PID
PID = CE取进程PID (句柄, “com.Gaggle.fun.GooseGooseDuck”)
如果真 (PID = 0)
调试输出 (“[线程”到文本 (索引)“] 未找到游戏进程”)
CE_断开 (句柄)
返回 ()

CE_打开进程 (句柄, PID)
' =======



i支持库列表   支持库注释   
spec特殊功能支持库
iext扩展界面支持库一

回复 支持 反对

使用道具 举报

签到天数: 16 天

发表于 2026-7-15 10:34:01 | 显示全部楼层   广东省广州市
有能用的模块吗,我试了这个取不到模拟器里面的进程列表
回复 支持 反对

使用道具 举报

签到天数: 8 天

发表于 2026-7-4 19:12:47 | 显示全部楼层   江苏省盐城市
如果说有多个模拟器窗口, 如何安装服务 并转发端口呢?
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)

签到天数: 4 天

发表于 2026-7-4 17:19:29 | 显示全部楼层   湖南省娄底市
        感谢分享,很给力!~
回复 支持 反对

使用道具 举报

签到天数: 8 天

发表于 2026-7-4 14:03:10 | 显示全部楼层   江苏省盐城市
本帖最后由 music154 于 2026-7-4 14:04 编辑

我遇到一个问题,当 CE里 看到绿色地址,鼠标双击查看事: libBugly_Native.so+3FA81,  易语言如何读取这个地址时,应该如何取到  libBugly_Native.so的地址呢?
回复 支持 反对

使用道具 举报

签到天数: 16 天

发表于 2026-7-1 15:20:47 | 显示全部楼层   广东省广州市
连接成功,但是ce遍历进程出来的进程列表都是 ?,这是什么原因
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2026-5-3 17:47:54 | 显示全部楼层   广东省汕头市
下载学习下,谢谢分享,参考下
回复 支持 反对

使用道具 举报

发表于 2026-4-1 17:40:24 | 显示全部楼层   天津市天津市
非常感谢愿意分享,
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2026-1-21 01:04:01 高大上手机用户 | 显示全部楼层   广东省*
66666666666666
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2026-1-19 13:20:46 | 显示全部楼层   江苏省盐城市
.大佬,我想问下那个CE特征码扫描如何使用 易语言的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表