From 6da87a4a1f8e99716d4455c8e3f2b1c398526018 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 1 Jan 2024 04:56:59 -0800 Subject: [PATCH] Implement server time spoofer --- src/main/java/emu/lunarcore/Config.java | 8 ++++++ src/main/java/emu/lunarcore/LunarCore.java | 26 ++++++++++++++++++- .../send/PacketPlayerHeartBeatScRsp.java | 3 ++- .../packet/send/PacketPlayerLoginScRsp.java | 3 ++- .../java/emu/lunarcore/util/JsonUtils.java | 2 +- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main/java/emu/lunarcore/Config.java b/src/main/java/emu/lunarcore/Config.java index aad7435..78172db 100644 --- a/src/main/java/emu/lunarcore/Config.java +++ b/src/main/java/emu/lunarcore/Config.java @@ -1,5 +1,6 @@ package emu.lunarcore; +import java.util.Date; import java.util.List; import java.util.Set; @@ -22,6 +23,7 @@ public class Config { public GameServerConfig gameServer = new GameServerConfig(23301); public ServerOptions serverOptions = new ServerOptions(); + public ServerTime serverTime = new ServerTime(); public ServerRates serverRates = new ServerRates(); public LogOptions logOptions = new LogOptions(); public DownloadData downloadData = new DownloadData(); @@ -107,6 +109,12 @@ public class Config { } } + @Getter + public static class ServerTime { + public boolean spoofTime = false; + public Date spoofDate = new Date(1705276800000L); // January 15, 2024 12:00:00 AM (GMT) + } + @Getter public static class ServerOptions { public boolean autoCreateAccount = true; diff --git a/src/main/java/emu/lunarcore/LunarCore.java b/src/main/java/emu/lunarcore/LunarCore.java index 7bec1d6..427f1c0 100644 --- a/src/main/java/emu/lunarcore/LunarCore.java +++ b/src/main/java/emu/lunarcore/LunarCore.java @@ -43,6 +43,8 @@ public class LunarCore { private static LineReaderImpl reader; @Getter private static boolean usingDumbTerminal; + + private static long timeOffset = 0; static { // Setup console reader @@ -58,6 +60,7 @@ public class LunarCore { // Load config LunarCore.loadConfig(); + LunarCore.updateServerTimeOffset(); } public static void main(String[] args) { @@ -195,7 +198,12 @@ public class LunarCore { public static void saveConfig() { try (FileWriter file = new FileWriter(configFile)) { - Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create(); + Gson gson = new GsonBuilder() + .setDateFormat("dd-MM-yyyy hh:mm:ss") + .setPrettyPrinting() + .serializeNulls() + .create(); + file.write(gson.toJson(config)); } catch (Exception e) { getLogger().error("Config save error"); @@ -241,6 +249,22 @@ public class LunarCore { return builder.toString(); } } + + /** + * Returns the current server's time in milliseconds to send to the client. Can be used to spoof server time. + */ + public static long currentServerTime() { + return System.currentTimeMillis() + timeOffset; + } + + private static void updateServerTimeOffset() { + var timeOptions = LunarCore.getConfig().getServerTime(); + if (timeOptions.isSpoofTime() && timeOptions.getSpoofDate() != null) { + timeOffset = timeOptions.getSpoofDate().getTime() - System.currentTimeMillis(); + } else { + timeOffset = 0; + } + } // Server console diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java index 2363545..0d04987 100644 --- a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerHeartBeatScRsp.java @@ -1,5 +1,6 @@ package emu.lunarcore.server.packet.send; +import emu.lunarcore.LunarCore; import emu.lunarcore.proto.PlayerHeartbeatScRspOuterClass.PlayerHeartbeatScRsp; import emu.lunarcore.server.packet.BasePacket; import emu.lunarcore.server.packet.CmdId; @@ -11,7 +12,7 @@ public class PacketPlayerHeartBeatScRsp extends BasePacket { var data = PlayerHeartbeatScRsp.newInstance() .setClientTimeMs(clientTime) - .setServerTimeMs(System.currentTimeMillis()); + .setServerTimeMs(LunarCore.currentServerTime()); this.setData(data); } diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java index d327ebe..a607fac 100644 --- a/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketPlayerLoginScRsp.java @@ -1,6 +1,7 @@ package emu.lunarcore.server.packet.send; import emu.lunarcore.GameConstants; +import emu.lunarcore.LunarCore; import emu.lunarcore.proto.PlayerLoginScRspOuterClass.PlayerLoginScRsp; import emu.lunarcore.server.game.GameSession; import emu.lunarcore.server.packet.BasePacket; @@ -14,7 +15,7 @@ public class PacketPlayerLoginScRsp extends BasePacket { var data = PlayerLoginScRsp.newInstance() .setBasicInfo(session.getPlayer().toProto()) .setCurTimezone(GameConstants.CURRENT_TIMEZONE) - .setServerTimestampMs(System.currentTimeMillis()) + .setServerTimestampMs(LunarCore.currentServerTime()) .setStamina(session.getPlayer().getStamina()); this.setData(data); diff --git a/src/main/java/emu/lunarcore/util/JsonUtils.java b/src/main/java/emu/lunarcore/util/JsonUtils.java index 403c01d..2ac9ae3 100644 --- a/src/main/java/emu/lunarcore/util/JsonUtils.java +++ b/src/main/java/emu/lunarcore/util/JsonUtils.java @@ -13,7 +13,7 @@ import com.google.gson.reflect.TypeToken; import emu.lunarcore.LunarCore; public class JsonUtils { - private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + private static final Gson gson = new GsonBuilder().setDateFormat("dd-MM-yyyy hh:mm:ss").setPrettyPrinting().create(); private static final Gson gsonCompact = new GsonBuilder().create(); public static Gson getGsonFactory() {