|
|

楼主 |
发表于 2026-7-18 12:10:09
|
显示全部楼层
贵州省安顺市
可以通过模拟器窗口索引来计算,例如计算本地映射端口 (52736 + 索引),下面是我自己写用到的例子: | 窗口程序集名 | 保 留 | 保 留 | 备 注 | | CeServer程序集 | | | |
|
| CE初始化并部署 | 逻辑型 | | |
| 索引 | 整数型 | | | | 模拟器索引 | 整数型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 本地端口 | 整数型 | | | | 运行目录 | 文本型 | | | | 结果 | 文本型 | | | | 连接句柄 | 整数型 | | | | i | 整数型 | | | | 检查文件结果 | 文本型 | | |
本地端口 = 52736 + 索引 大漠多线程信息 [索引 + 1 ].雷电. 置模拟器目录 (全局雷电目录 )检查文件结果 = 大漠多线程信息 [索引 + 1 ].雷电. adb (模拟器索引, “shell ls /data/local/tmp/ceserver”)调试输出 (“[索引” + 到文本 (索引 ) + “] 文件检查结果: ” + 检查文件结果 ) 运行目录 = 取运行目录 () 如果真 (取文本右边 (运行目录, 1 ) ≠ “\”) 运行目录 = 运行目录 + “\” 如果真 (文件是否存在 (运行目录 + “ceserver_x86_64”) = 假)  _启动窗口.列表框1. 插入项目 (0, “[严重错误] 目录下缺少 ceserver_x86_64 文件!”, ) 信息框 (“请将 ceserver_x86_64 文件拷贝到本软件运行目录下!”, #错误图标, “文件缺失”, ) 返回 (假) 如果 (寻找文本 (检查文件结果, “No such file”, , 假) ≠ -1 或 寻找文本 (检查文件结果, “ceserver”, , 假) = -1 ) _启动窗口.列表框1. 插入项目 (0, “[索引” + 到文本 (索引 ) + “] 正在推送 ceserver...”, ) 结果 = 大漠多线程信息 [索引 + 1 ].雷电. adb (模拟器索引, “push ” + #引号 + 运行目录 + “ceserver_x86_64” + #引号 + “ /data/local/tmp/ceserver”)  如果真 (寻找文本 (结果, “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”) 大漠多线程信息 [索引 + 1 ].雷电. adb (模拟器索引, “shell su -c setenforce 0”) 大漠多线程信息 [索引 + 1 ].雷电. adb (模拟器索引, “shell su -c 'pkill -f ceserver'”) 结果 = 大漠多线程信息 [索引 + 1 ].雷电. adb (模拟器索引, “shell su -c 'nohup /data/local/tmp/ceserver >/dev/null 2>&1 &'”) 结果 = 大漠多线程信息 [索引 + 1 ].雷电. adb (模拟器索引, “forward tcp:” + 到文本 (本地端口 ) + “ tcp:52736”)调试输出 (结果 )调试输出 (本地端口 ) 如果真 (寻找文本 (结果, “error”, , 假) ≠ -1 ) 调试输出 (“[索引” + 到文本 (索引 ) + “] 端口转发失败”) 返回 (假) 大漠多线程信息 [索引 + 1 ].模拟器adb端口 = 本地端口 计次循环首 (10, i ) 程序_延时 (500 ) 连接句柄 = CE_连接 (“127.0.0.1”, 本地端口 ) 如果真 (连接句柄 ≠ 0 ) CE_断开 (连接句柄 ) 调试输出 (“[索引” + 到文本 (索引 ) + “] CE服务(Root)部署并验证成功!”)  _启动窗口.列表框1. 插入项目 (0, “[索引” + 到文本 (索引 ) + “] CE服务(Root)部署并验证成功!”, ) 返回 (真)  调试输出 (“[索引” + 到文本 (索引 ) + “] 等待服务启动(” + 到文本 (i ) + “/10)...”) 计次循环尾 ()调试输出 (“[索引” + 到文本 (索引 ) + “] 严重错误:CE服务启动超时。”)返回 (假)|
| 解析指针链 | 长整数型 | | |
| 句柄 | 整数型 | | | | 基址 | 长整数型 | | | | 偏移数组 | 整数型 | | | | 当前类型 | 文本型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 当前指针 | 长整数型 | | | | 下一个地址 | 长整数型 | | | | i | 整数型 | | | | 数组数量 | 整数型 | | | | 最终偏移 | 整数型 | | | | 当前偏移 | 整数型 | | | 调试输出 (“========== [解析指针链 开始] ==========”)调试输出 (“[参数] 句柄:”, 句柄, “ | 基址(HEX):”, HEX (基址 )) 数组数量 = 取数组下标 (偏移数组, )调试输出 (“[参数] 偏移层数:”, 数组数量 ) 如果真 (数组数量 = 0 ) 调试输出 (“[错误] 偏移数组为空,直接返回基址”) 返回 (基址 ) 当前指针 = 读长整数型 (句柄, 基址 )调试输出 (“[第 0 步] 读取基址:”, HEX (基址 ), “ -> 读到指针:”, HEX (当前指针 )) 如果真 (当前指针 < 65536 ) 调试输出 (“[错误] 基址指针无效 (空指针或太小):”, HEX (当前指针 )) 返回 (0 ) 如果真 (数组数量 > 1 ) 计次循环首 (数组数量 - 1, i )  当前偏移 = 偏移数组 [i ]   下一个地址 = 当前指针 + 当前偏移  调试输出 (“--------------------------------”) 调试输出 (当前类型 + “[第 ” + 到文本 (i ) + “ 层] 当前指针:”, HEX (当前指针 ), “ + 偏移:”, HEX (当前偏移 ))  调试输出 (当前类型 + “[第 ” + 到文本 (i ) + “ 层] 目标读取地址:”, HEX (下一个地址 ))    当前指针 = 读长整数型 (句柄, 下一个地址 ) 调试输出 (当前类型 + “[第 ” + 到文本 (i ) + “ 层] 读取结果(新指针):”, HEX (当前指针 ))   如果真 (当前指针 < 65536 )  调试输出 (当前类型 + “[错误] 第 ” + 到文本 (i ) + “ 层读取到的指针无效,链条中断!”)  返回 (0 )     如果真 (当前指针 < 1e+014 )  调试输出 (当前类型 + “[错误] 第 ” + 到文本 (i ) + “ 层读到异常指针(不在堆内存区): ” + HEX (当前指针 ))   返回 (0 )     计次循环尾 () 最终偏移 = 偏移数组 [数组数量 ]调试输出 (“--------------------------------”)调试输出 (“[最终步] 最终指针:”, HEX (当前指针 ), “ + 最终偏移:”, HEX (最终偏移 )) 调试输出 (“[最终步] 结果地址:”, HEX (当前指针 + 最终偏移 )) 调试输出 (“========== [解析指针链 结束] ==========”)返回 (当前指针 + 最终偏移 ) 返回 (进制_十到十六 (地址数值, 假)) | 变量名 | 类 型 | 静态 | 数组 | 备 注 | | pid | 整数型 | | | | p_name | 文本型 | | | | is_first | 整数型 | | | | ret | 整数型 | | | CE_初始化遍历 (句柄 )is_first = 1 p_name = 取空白文本 (256 ) 判断循环首 (真) ret = CE_遍历进程 (句柄, is_first, pid, p_name ) 如果真 (ret = 0 ) 跳出循环 ()
 如果真 (寻找文本 (p_name, 寻找名称, , 假) ≠ -1 ) 返回 (pid ) is_first = 0 判断循环尾 ()返回 (0 )| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | buf | 字节集 | | | | 实际读取长度 | 整数型 | | |
buf = 取空白字节集 (8 )实际读取长度 = CE_读内存 (句柄, 地址, 8, buf ) 如果真 (实际读取长度 = 8 ) 返回 (取字节集数据 (buf, #长整数型, )) 调试输出 (“[DLL错误] 读长整数型失败!地址: ” + HEX (地址 ) + “ | DLL返回长度: ” + 到文本 (实际读取长度 )) 返回 (0)buf = 取空白字节集 (4 ) 如果真 (CE_读内存 (句柄, 地址, 4, buf ) = 4 ) 返回 (取字节集数据 (buf, #小数型, )) 返回 (0)buf = 到字节集 (数值 ) 返回 (CE_写内存 (句柄, 地址, buf, 4 )) | 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 句柄 | 整数型 | | | | PID | 整数型 | | | | Il2cpp_基址2 | 长整数型 | | |
句柄 = CE_连接 (“127.0.0.1”, 大漠多线程信息 [索引 + 1 ].模拟器adb端口 ) 如果真 (句柄 = 0 ) CE初始化并部署 (索引, 到整数 (_启动窗口.超级列表框1. 取标题 (索引, 14 )) ) 调试输出 (“[线程” + 到文本 (索引 ) + “] CE连接失败”) _启动窗口.列表框1. 插入项目 (0, “[线程” + 到文本 (索引 ) + “] CE连接失败”, ) 返回 (假) PID = CE取进程PID (句柄, “com.Gaggle.fun.GooseGooseDuck”) 如果真 (PID = 0 ) 调试输出 (“[线程” + 到文本 (索引 ) + “] 未找到游戏进程”) CE_断开 (句柄 ) 返回 (假) CE_打开进程 (句柄, PID )
|
|