hyugogirubato/lscr
GitHub: hyugogirubato/lscr
纯Python实现的LSCR二进制脚本解析器,支持解析Level-5 LT3引擎的逻辑脚本和动画脚本,输出伪代码或JSON格式。
Stars: 0 | Forks: 0
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, 二进制分析, 二进制逆向, 云安全监控, 云安全运维, 云资产清单, 子域名变形, 恶意代码分析, 恶意软件分析, 数字取证, 无后门, 无线安全, 游戏引擎, 网络安全审计, 脚本解析器, 自动化脚本, 逆向工程, 配置文件, 静态分析