Codex对三个文件做了第一轮静态分析,没有运行 DLL。
结果挺有料:
-
SGP2.DLL 是 32 位 x86 VSTi DLL,导出函数只有 main。
- DLL 内部明确包含:
sxgbnw6l.tbl
sxgdat6l.tbl
YAMAHA SoftSynthesizer S-YXG2006LE
- 它通过
GetModuleFileNameA 找自身路径,再用 CreateFileA / GetFileSize / ReadFile 把两个 .tbl 整个读入内存。
-
sxgbnw6l.tbl 不是波形本体,更像 索引/参数/映射表。开头是:
UTG VPRM 06 07 28 15 28
- 后面有一组 offset table。
-
sxgdat6l.tbl 才更像大数据/波形数据,但它不是裸 WAV/PCM,原始内容高熵,DLL 里有解码逻辑。
Codex找到的关键代码位置:
SGP2.DLL+0x2DD0 负责加载两个 tbl
SGP2.DLL+0x2D60 复制字符串 sxgbnw6l.tbl
SGP2.DLL+0x2D80 复制字符串 sxgdat6l.tbl
SGP2.DLL+0x4C830 通用“读取整个文件”函数
SGP2.DLL+0x2EF0 sxgdat6l.tbl 解码例程
SGP2.DLL+0x4C900 解码 helper
SGP2.DLL+0x2EF0 里面能看到一个明显的处理:先调用 +0x4C900 做第一阶段变换,然后对数据做类似“每两个字节交换 + XOR 0x5A”的第二阶段处理。解码后仍然不是 RIFF/WAVE,所以后面很可能还有专有采样压缩、ADPCM 或 Yamaha 自己的波形编码格式。
另外,外部资料也能对应上:SGP2.DLL 确实被社区记录为 Yamaha MidRadio 7 里的 S-YXG2006LE VSTi,使用 sxgbnw6l.tbl / sxgdat6l.tbl 这组新 wavetable。参考:VEG.BY、XG-Central。
下一步最有价值的是用 Ghidra 或 x32dbg 深入 SGP2.DLL+0x2EF0、+0x4C900 和读取后的数据结构,把 sxgbnw6l.tbl 里的 20 字节表项、6048 个指针表项和 sxgdat6l.tbl 的偏移关系对应起来。这样才能进一步判断它到底是 PCM、ADPCM、循环采样,还是更复杂的 Yamaha AWM2 风格数据。