起因
兄弟炒币赚了大钱,买了ADX放家里
由于兄弟几个都很变态(当然不包括我),就想到是不是可以买个郊狼回来玩玩
当然不是电那种奇怪的地方(),只是电大腿之类的
我的提议就是,Miss一次电一次
开始
逆向基于的版本是DX-1.56
也就是Prism Plus
当然了,游戏文件我是不会提供的(不过这玩意已经满天飞了吧)
因为我没接触过Unity逆向,第一想法是用Frida去hook,当然是可以的
但是我的游戏是打过mod的,也就是AquaMai
既然现成的Mod我们去看看他的实现思路不是更好
说白了AquaMai的方法就是用MelonLoader注入他的Dll,看代码很容易得知他用的是HarmonyPatch这个框架
一搜不得了,这就是给Unity专用的,而且用起来简单的不得了
确定好框架就可以开始逆向了
很显然,我们需要知道Miss判定的函数,然后Hook他 当执行Miss函数的时候进行某些行为(比如WebSocket给那玩意开电)
众所周知,这游戏是Unity写的,它的核心逻辑都在Assembly-CSharp.dll
里面
把这个Dll丢进dnSpy里面
我这里假设你的Assembly-CSharp.dll
已经脱壳了
应该吧?不会有人动态解密跑这个吧 不然还hook个蛋
我一看 类名全都没混淆 简直是天堂
这就是Unity的魅力吗()
首先想法肯定是搜Miss
有点多啊
全词匹配看看
这次少了很多
我们看到左边有个Note.Judge
是他吗,点进去看看
不难发现这是一个枚举?Miss的时候=0分吗
对着他的调用一顿分析
看到有一堆东西调用了这个枚举
挨个进去看他们在相互调用
一个个进去看,都没找到当miss了调用的逻辑在哪里
我猜这可能是个将判定的时间转换成最终判定的方法,这个枚举就是给转换用的
那不几把是我们要的,尽管可以继续分析 但这样对一个没有混淆的Dll有点太麻烦了
我们接着看Miss的关键词
我们看到有一个NoteJudge.Judgebox里面的玩意
一看这个枚举调用可多了
前面的那堆是Debug类的,应该不是我们需要的
我认为我们要找的东西应该是在NoteMananger之类的东西里面
然后我在这堆调用中一眼相中了我的目标
这里很显然是一个switch语句通过判断Note的类型来赋予对应的DX分
他在Manager类里,和我想得差不多
而且Miss了DX分就是不加的,我觉得没毛病
那就试试吧,理论来说我们当然可以直接反编译这个Dll重新编译
但那样显然不咋健康,侵入性太强了
那反正我们都有Mod,写一个Dll不是更好?
赶紧去看看MelonLoader的文档
哇它里面还内置了HarmonyPatch
无敌了
核心实现就是以下的代码了
[HarmonyPatch(typeof(JudgeResultSt), nameof(JudgeResultSt.UpdateScore))]
public static class UpdateScorePatch
{
static void Postfix(ref JudgeResultSt __instance)
{
// 如果 DX分为0,视为 Miss
if (__instance.Deluxe == 0)
{
/// 在后台线程发请求,防止主线程卡顿
ThreadPool.QueueUserWorkItem(_ =>
{
MelonLogger.Msg("检测到 Miss,发送电击请求...");
MissDetected();
});
}
}
}
效果如下
雷电法王
这里用了多线程,把MissDeteced这个函数换成你需要执行的东西就好
编译了放进Mods文件夹,没啥毛病就收工了
具体详细用WebSocket调用郊狼的代码稍后写完我应该会丢到Github
应该不会有人用到这玩意吧 不要吧
结尾
下次试试mu3的逆向
chusan不是Unity 那个缓一缓
我还记得因为和某人争论chusan是不是Unity还吵过