RukoBlood/jenny-mod-re-clean
GitHub: RukoBlood/jenny-mod-re-clean
该项目对经过重度混淆的 Minecraft Jenny Mod 进行逆向工程与代码清理,旨在还原可读的 Java 源码结构并消除各类混淆手段的影响。
Stars: 0 | Forks: 0
**18+ 警告!糟糕的代码警告!**
## **本项目是 https://github.com/palkaline/jenny-mod-re 的一个 fork**
# Jenny mod 逆向工程(及代码清理)(TMC 1.1.0 版本)
由 Palkaline 创建,由我编辑。目前我重命名了部分类,因为其中一半仍然在使用逆向工程产生的乱码。
## 关于
本项目的初始目标
- 对整个 jar 文件应用过的极端混淆进行逆向工程
- FOSS!
- 清理代码
## 构建和/或运行
查看原版。
## 混淆
按严重程度排序
- 异常传递与返回包装
try {
// 代码 ...
} catch (RuntimeException runtimeException) {
// 看这里... 异常被包装、传递并返回(同一性)
throw a(new RuntimeException(runtimeException));
}
public static RuntimeException a(RuntimeException runtimeException) {
return runtimeException;
}
- 异常表混淆
try {
try {
try {
// ... 真实代码
} catch (RuntimeException runtimeException) {
throw a(new RuntimeException(runtimeException));
}
// 代码 ... 或顺延执行
} catch (RuntimeException runtimeException) {
throw a(new RuntimeException(runtimeException));
}
// 代码 ... 或顺延执行
} catch (RuntimeException runtimeException) {
throw a(new RuntimeException(runtimeException));
}
- 悬空 catch 块
int a = 5 + z;
// 一些代码 ...
catch { // 没有前置 try 的悬空 catch
throw a.b(new RuntimeException());
}
- 不可能的控制流
block71: {
block73: {
block75: {
// 一些代码...
*** goto label69 *** // 无法追踪
}
}
}
- 局部变量复用
Object z = new Integer(5);
// 一些代码...
z = new HashMap();
- 重复标识符
class a {
int a;
Aa a;
A a();
public class a {
}
}
- synthetic(s) 值得单独开一个子话题讨论
- 通用的“全填充”包装器
- 内部类辅助方法
- 泛型剥离
- `class A` --> `class A`,涉及类、方法、参数等...
- 签名冲突
int a()
float a()
a a()
- 上面未包含的其他 CFR 失败情况...
## 正则表达式
下面是一些有用的模式:
- 剥离泛型的 onMessage 恢复:
- 查找:`((?:public|protected|private)?\s*IMessage\s+onMessage\s*\(\s*)IMessage(\s+\w+\s*,\s*MessageContext\s+\w+\s*\)\s*\{\s*return\s+[\w.]+\s*\(\s*\(\s*)([\w.]+)(\s*\)\s*\w+\s*,\s*\w+\s*\)\s*;\s*\})`
- 替换:`@Override\n$1$3$2$3$4`
- 查找对任意方法的调用,例如 `ad`:
- `(void |\.)ad\(\)`
-
查找屏蔽词:
cock|pussy|dick|sex|trol|(? 不再需要: - 异常包装混淆(传递与返回) - 查找:`throw ([\w\d]+)\.([\w\d]+)\(([\w\d]+)\);` - 替换:`throw $3;` ## Bug (Palkaline) 我 110% 保证在反混淆过程中产生了一些 bug。许多步骤很可能会导致许多 bug,并且每一步都会使之前步骤产生的 bug 叠加加剧。 最可能出现的 bug 是: - 我未能重命名的悬空 override - a 变成了 doRender, getResourceLocation, getTexture, getModelFileLocation - 因此,这些方法可能会回退到父类的默认实现。 - 引用了具有相同签名的错误方法。 - 静态方法的解析对我来说很奇怪……你总能学到新东西! ## Bug (我) Mod 的当前状态 - я сломаль(坏掉了) ## 相对于源 jar 文件的修改 - 我修改了一些我认为对用户有点不友好的代码部分: - 当年龄检查失败时,删除 `/mods` 中的 mod .jar 和当前工作目录 - 感觉文件系统操作很危险 - 我觉得这个检查界面挺难看的,我发誓以前曾 经在游戏内内置过询问年龄的 GUI 按钮……可能是我老了吧…… - 注释掉了损坏的代码: - 一个例子是 Kobold 伤害监听器 - 它在注册到伤害时输出部落统计数据。然而,目前这 似乎已经损坏了。 - 其他我可能已经忘记的事情……不过已经被注释掉了。 ## TODO (Palkaline) - 修复损坏的重构 - 见上文... - 添加 buttplug.io 支持和/或为动画添加适当的关键帧以解决动作问题 - 见 TODO(搜索 'toy' 等...) - 我写了一个小小的概念验证(未包含在此项目中)并且成功让它 运行起来了,但它需要为每个实体手动复制/粘贴。我讨厌这个项目的设计。 我觉得应该有更好的支持方式来实现这个……再说一次,看注释... ## TODO (我) - 修复女孩们的 bug - 重构一些东西 - ## 参考 - 参见:https://github.com/hfgufjkgjkfbg/Minecraft-Sex-Mod-Jenny-1.12.2-Forge标签:JS文件枚举, Minecraft, 云资产清单, 代码去混淆, 域名枚举, 游戏Mod, 逆向工程