hyugogirubato/lscr

GitHub: hyugogirubato/lscr

纯Python实现的LSCR二进制脚本解析器,支持解析Level-5 LT3引擎的逻辑脚本和动画脚本,输出伪代码或JSON格式。

Stars: 0 | Forks: 0

lscr-parser icon

lscr-parser

LSCR 二进制脚本(.lbin / .cani)解析器,来自 LT3 引擎(Level-5)。
基于 libll3.so 逆向工程。

## 功能 - 解析 `.lbin`(逻辑脚本)和 `.cani`(动画脚本)文件 - 输出人类可读的伪代码、JSON、原始结构或使用统计信息 - 零外部依赖 — 纯 Python 3.10+ - 完整的操作码和命令 ID 覆盖(364 条 LSCR 命令 + 8 条 CANI 操作码) - 正确的字符串表解析、浮点数重解释和 REF 槽位命名 ## 快速开始 ``` # 将脚本解析为伪代码 python3 parse_lscr.py lbin/lt3_movie.lbin # 解析 CANI 动画脚本 python3 parse_lscr.py cani/server_connect.cani # 导出为 JSON python3 parse_lscr.py --json out.json lbin/lt3_common.lbin # JSON 到 stdout python3 parse_lscr.py -j lbin/lt3_event.lbin # 显示原始解码结构(用于逆向工程) python3 parse_lscr.py --raw cani/fill.cani # 命令使用统计 python3 parse_lscr.py --stats lbin/*.lbin # 多个文件 python3 parse_lscr.py lbin/lt3_common.lbin lbin/lt3_movie.lbin ``` ## 输出示例 ### `.lbin` — 逻辑脚本 ``` ====================================================================== lt3_movie.lbin (LSCR) — 253 instructions, 94 strings, 6592 bytes ====================================================================== @script "LT3" by "u_kumagai" function MOVIE_BEGIN(0 params): $iState = param0 goto_if(1001, work4, 1) var_get_global(work4, 2) event_call("ムービー回転", $iState) res_load_anim("movie_anm", 0, "menu/movie.cani") chr_create_button("movie_btn_rotate", "movie_anm", ...) wait_frame("MOVIE_LAYOUT") wait_frame("MOVIE_DISP") end ``` ### `.cani` — 动画脚本 ``` ====================================================================== server_connect.cani (CANI) — 36 instructions, 18 strings, 1161 bytes ====================================================================== anim_header(69, 8, 8, 1, 8) sprite_sheet(3, 23, "<...>") frame_def("loop_00", 0, 0, 150, 150) frame_rect(0, 0, 150, 150, 0, 0) frame_end() seq_def("connect", 75, 75, 0, 0, 150, 150) keyframe(0, 4, 0, 0, 0) keyframe(1, 4, 0, 0, 0) seq_end() ``` ## 文件格式 ### `.lbin` — 逻辑脚本 具有结构化控制流的标准 LSCR 脚本: | 操作码 | 名称 | 描述 | |--------|--------|-------------| | `0x0000` | INIT | 脚本头(作者、项目) | | `0x044C` | LABEL | 函数/标签定义 | | `0x044D` | END | 函数块结束 | | `0x044E` | ASSIGN | 变量赋值 | | `0x0456` | CALL | 命令调用(第一个参数 = CommandId) | | `0x0457` | JUMP | 跳转到标签 | 命令通过 `lt3_CASE` 分发,使用第一个参数作为命令 ID(1000-9999)。 ### `.cani` — 动画脚本 使用相同的 LSCR 头格式,但直接使用动画专用操作码: | 操作码 | 名称 | 描述 | |--------|--------------|-------------| | 1000 | ANIM_HEADER | 动画定义(帧数、列数、行数、层数) | | 1010 | SPRITE_SHEET | 精灵图设置(数量、数据大小、纹理) | | 1020 | FRAME_DEF | 定义命名帧区域(名称、x、y、w、h) | | 1021 | FRAME_END | 帧定义结束 | | 1022 | FRAME_RECT | 精灵图中的源矩形(x、y、w、h、offset_x、offset_y) | | 1030 | SEQ_DEF | 定义动画序列(名称、x、y、ox、oy、w、h) | | 1031 | SEQ_END | 序列结束 | | 1032 | KEYFRAME | 序列中的关键帧(frame_idx、duration、...) | ## 二进制格式 ``` Offset Size Field 0x00 4 Magic "LSCR" 0x04 2 Instruction count (u16le) 0x06 2 Instruction table offset (u16le) 0x08 4 Argument data offset (u32le) 0x0C 4 String table offset (u32le) Each instruction (8 bytes): +0 2 Opcode (u16le) +2 2 Argument count (u16le) +4 2 Argument start index (u16le) +6 2 Reserved (always 0) Each argument (5 bytes): +0 1 Type (u8): 0=INT, 1=FLOAT, 2=STR, 3=ETC, 4=REF, 5=ARG +1 4 Value (u32le): raw int, float bits, or string table offset String table: Null-terminated UTF-8 strings, referenced by byte offset from table start. ``` ## 参数类型 | 类型 | 名称 | 描述 | |------|-------|-------------| | 0 | INT | 32 位有符号/无符号整数 | | 1 | FLOAT | IEEE 754 float32(存储为 u32,重新解释) | | 2 | STR | 字符串表中的字节偏移量(标签、资源名称) | | 3 | ETC | 字符串表中的字节偏移量(变量名称,显示为 `$name`) | | 4 | REF | 槽位引用:`param0-15`、`arg0-15` 或 `work0-15` | | 5 | ARG | 指向另一个 ltCArg 的指针(不在二进制文件中使用) | ## VS Code 扩展 专用的 VS Code 扩展为解析输出(`.lscr` 和 `.rlscr` 文件)提供语法高亮。安装说明请参阅 [`vscode-lscr/README.md`](vscode-lscr/README.md)。 ### 安装 ``` cd vscode-lscr ./build-vsix.sh code --install-extension lscr-syntax-0.1.0.vsix ``` 或将 `vscode-lscr/` 复制到 `~/.vscode/extensions/lscr-syntax`。 ### 使用方法 ``` python3 -X utf8 parse_lscr.py lbin/lt3_movie.lbin > movie.lscr python3 -X utf8 parse_lscr.py --raw lbin/lt3_movie.lbin > movie.rlscr ``` 在 VS Code 中打开 — 高亮自动生效。颜色会适应您的主题(深色或浅色)。 ## 项目结构 ``` . ├── parse_lscr.py # The parser (standalone, no dependencies) ├── icon.svg # Project icon ├── README.md ├── vscode-lscr/ # VS Code extension │ ├── package.json │ ├── build-vsix.sh │ ├── syntaxes/ │ │ ├── lscr.tmLanguage.json # Pseudo-code grammar │ │ └── rlscr.tmLanguage.json # Raw output grammar │ └── README.md ├── lbin/ # Sample .lbin scripts │ ├── lt3_common.lbin │ ├── lt3_event.lbin │ └── ... ├── cani/ # Sample .cani animation scripts │ ├── fill.cani │ ├── server_connect.cani │ └── ... └── docs/ ├── libll3.so # Original ARM64 library (Android/NDK r19) └── reverse-engineering.md # How to reverse the library ``` ## 文档 - **[逆向工程指南](docs/reverse-engineering.md)** — 详细讲解如何分析 `libll3.so` 以重构此解析器。 ## 许可证 本工具仅供教育和研究目的(游戏保护、模组开发)。
标签:APT分析, CANI, DAST, HTTP工具, Level-5, LSCR, LT3引擎, Python, 二进制分析, 二进制逆向, 云安全监控, 云安全运维, 云资产清单, 子域名变形, 恶意代码分析, 恶意软件分析, 数字取证, 无后门, 无线安全, 游戏引擎, 网络安全审计, 脚本解析器, 自动化脚本, 逆向工程, 配置文件, 静态分析