Skip to content

About

一个对qq经典农场小程序代码进行反混淆的工具

Resources

Stars

7 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

一个简陋的反混淆qq经典农场小程序js的nodejs脚本,当然 代码随时可能失效

它的作用

qq经典农场小程序反编译出来的代码是高度混淆的,进行数据分析时很不方便 此项目可以辅助你进行反混淆,还原为基本可读的代码 也有利于你使用ai查找游戏逻辑,PB结构等

目前脚本并不完善还有一些报错,大佬可以尽情完善(实际上是codex太慢了我懒得让他改了)

使用方法

代码依赖nodejs及bable模块,请自行下载nodejs 然后安装依赖:

npm install @babel/parser @babel/generator @babel/traverse @babel/types

将tools复制到你的游戏已解包代码根目录

所有脚本默认都基于 process.cwd() 工作,所以必须在项目根目录运行。

当前脚本列表

  • tools/deobfuscate-readable.js
  • tools/decode-main-strings.js
  • tools/normalize-resolved-js.js
  • tools/extract-main-modules.js
  • tools/extract-main-resolved-modules.js
  • tools/format-deobfuscated-js.js
  • tools/enhance-resolved-readability.js
  • tools/inline-wrapper-objects.js

推荐执行顺序

1. 第一层去壳

node tools\deobfuscate-readable.js

作用:

  • 处理根包和子包里的可读化入口
  • 生成 deobfuscated/ 目录
  • 当前会处理这些输入:
    • game.js
    • subContext.js
    • subpackages\internal\game.js
    • subpackages\main\game.js

输出:

  • deobfuscated\game.js
  • deobfuscated\subContext.js
  • deobfuscated\subpackages\internal\game.js
  • deobfuscated\subpackages\main\game.js

控制台会打印每个文件的统计:

  • total
  • replaced
  • skipped

2. 主包字符串表还原

node tools\decode-main-strings.js

作用:

  • 自动加载主包 deobfuscated\subpackages\main\game.js
  • 自动寻找并加载 wasm
  • 自动提取当前版本的字符串 seed / 指针 / 解码函数
  • 把 STRINGS[...] 替换成真实字符串

默认输出:

  • deobfuscated\subpackages\main\game.resolved.js
  • deobfuscated\subpackages\main\strings.main.json

当前脚本会自动尝试这些 wasm 路径:

  • .tmp\acesdk.wasm
  • tsdk\acesdk.wasm
  • tsdk\acesdk.wasm.br
  • .tmp\tsdk.wasm
  • tsdk\tsdk.wasm
  • tsdk\tsdk.wasm.br

控制台会打印:

  • decoded strings
  • replaced STRINGS[...] references
  • string seed
  • string pointer
  • decode function
  • wasm export
  • wasm input

备注:

  • 运行时如果末尾出现一次 _typeof2 is not a function 这类 bootstrap 噪声,通常不影响字符串表产物。

3. resolved 文件二次规范化

node tools\normalize-resolved-js.js

作用:

  • 修复 obj["foo"] -> obj.foo
  • 修复部分关键字黏连
  • 当前会处理:
    • deobfuscated\subpackages\main\game.resolved.js
    • deobfuscated\subpackages\main\modules-resolved\*.js

说明:

  • 第一次跑时如果 modules-resolved 还不存在,建议先在拆模块之后再补跑一次。
  • 它是就地修改,不会生成新文件。

4. 拆分主包模块

推荐拆已解析版本:

node tools\extract-main-resolved-modules.js

作用:

  • 从 deobfuscated\subpackages\main\game.resolved.js 里提取 System.register(...)
  • 拆成单独模块文件

输出目录:

  • deobfuscated\subpackages\main\modules-resolved\
  • deobfuscated\subpackages\main\modules-resolved\_manifest.txt

控制台会打印:

  • extracted modules
  • output dir

如果你想拆“未还原字符串”的版本,也可以用:

node tools\extract-main-modules.js

它的输出目录是:

  • deobfuscated\subpackages\main\modules\

但平时更建议优先用 modules-resolved。

5. 统一格式化

node tools\format-deobfuscated-js.js

默认会自动格式化:

  • deobfuscated\subpackages\main\game.resolved.js
  • deobfuscated\subpackages\main\modules-resolved\

也支持手动指定目标:

node tools\format-deobfuscated-js.js deobfuscated\subpackages\main\game.resolved.js
node tools\format-deobfuscated-js.js deobfuscated\subpackages\main\modules-resolved

依赖:

  • @babel/parser
  • @babel/generator

6. 进一步增强可读性

node tools\enhance-resolved-readability.js

默认会处理:

  • deobfuscated\subpackages\main\game.resolved.js
  • deobfuscated\subpackages\main\modules-resolved\

当前主要做:

  • 部分短别名重命名
  • 移除一部分 _RF.push/_RF.pop

控制台会打印:

  • enhanced files
  • renamed aliases
  • removed _RF calls

依赖:

  • @babel/parser
  • @babel/traverse
  • @babel/types
  • @babel/generator

7. 包装器对象内联

node tools\inline-wrapper-objects.js

默认处理:

  • deobfuscated\subpackages\main\modules-resolved\
  • deobfuscated\subpackages\main\game.resolved.js

当前只会内联能静态判断的简单包装器,例如:

  • 字符串常量
  • ===
  • !==
  • instanceof
  • 比较运算

控制台会打印:

  • processed files
  • wrapper replacements

一条建议直接照跑的命令链

如果你是从原包开始重新跑,建议按这个顺序:

node tools\deobfuscate-readable.js
node tools\decode-main-strings.js
node tools\normalize-resolved-js.js
node tools\extract-main-resolved-modules.js
node tools\format-deobfuscated-js.js
node tools\enhance-resolved-readability.js
node tools\format-deobfuscated-js.js
node tools\inline-wrapper-objects.js
node tools\format-deobfuscated-js.js

更稳一点的校验方式:

node --check deobfuscated\subpackages\main\game.resolved.js
Get-ChildItem deobfuscated\subpackages\main\modules-resolved\*.js | ForEach-Object { node --check $_.FullName }

关键产物怎么看

最重要的输出通常是:

  • deobfuscated\subpackages\main\game.js
    • 第一层去壳后的主包
  • deobfuscated\subpackages\main\strings.main.json
    • 解出来的主包字符串表
  • deobfuscated\subpackages\main\game.resolved.js
    • 替换字符串后的总文件
  • deobfuscated\subpackages\main\modules-resolved\
    • 拆开的单模块目录
  • deobfuscated\subpackages\main\modules-resolved\_manifest.txt
    • 模块文件与原模块名映射

常见问题

1. decode-main-strings.js 找不到 wasm

先检查这些位置是否存在:

  • .tmp\acesdk.wasm
  • tsdk\acesdk.wasm.br
  • tsdk\acesdk.wasm

当前版本最常见是:

  • tsdk\acesdk.wasm.br

2. 格式化脚本报 Babel 依赖缺失

需要补这些依赖:

  • @babel/parser
  • @babel/generator
  • @babel/traverse
  • @babel/types

3. extract-main-resolved-modules.js 提取不到模块

优先确认:

  1. deobfuscated\subpackages\main\game.resolved.js 是否已经生成
  2. 是否先执行过 normalize-resolved-js.js
  3. 文件里是否仍能看到 System.register(

4. 为什么既有 modules 又有 modules-resolved

  • modules:从 game.js 直接拆出来,字符串通常还没完全还原
  • modules-resolved:从 game.resolved.js 拆出来,平时分析优先看这个

当前版本最常用的几个脚本

如果只看实用性,优先记住这几个:

  • tools/deobfuscate-readable.js
  • tools/decode-main-strings.js
  • tools/normalize-resolved-js.js
  • tools/extract-main-resolved-modules.js
  • tools/format-deobfuscated-js.js

后面的 enhance-resolved-readability.js 和 inline-wrapper-objects.js 更偏“继续打磨可读性”。

About

一个对qq经典农场小程序代码进行反混淆的工具

Resources

Stars

7 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages