add diff files for auto updating client, readme for installation and running tutorial

This commit is contained in:
raphaeIl
2025-01-16 08:49:31 -05:00
parent 582d91d2a5
commit fa75125d65
29 changed files with 30550 additions and 5686 deletions

View File

@@ -4,6 +4,7 @@ using System.Text;
using NSec.Cryptography;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Parameters;
namespace Novaria.Common.Crypto
@@ -28,6 +29,8 @@ namespace Novaria.Common.Crypto
public static readonly byte[] DEFAULT_SERVERLIST_KEY = new byte[] { 74, 72, 42, 67, 80, 51, 50, 57, 89, 120, 111, 103, 81, 74, 69, 120 };
public static readonly byte[] DEFAULT_SERVERLIST_IV = new byte[] { 225, 92, 61, 72, 193, 89, 3, 64, 50, 61, 50, 145, 59, 128, 99, 72 };
public static readonly byte[] DEFAULT_AND_IV = new byte[] { 105, 7, 110, 72, 167, 117, 102, 212, 150, 44, 52, 229, 65, 61, 204, 205 };
public static readonly byte[] DEFAULT_WIN_IV = new byte[] { 144, 129, 81, 233, 8, 4, 33, 39, 106, 181, 229, 64, 68, 134, 31, 107 };
public static readonly byte[] IKE_KEY = Encoding.ASCII.GetBytes("3LS9&oYdsp^5wi8&ZxC#c7MZg73hbEDw");
@@ -150,18 +153,13 @@ namespace Novaria.Common.Crypto
// probably wrong
public static byte[] DecryptAesCBCInfo(byte[] key, byte[] IV, byte[] cipherBytes)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.IV = IV;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
using (ICryptoTransform decryptor = aes.CreateDecryptor())
{
return decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
}
}
PaddedBufferedBlockCipher paddedBufferedBlockCipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()), new Pkcs7Padding());
ParametersWithIV parametersWithIV = new ParametersWithIV(new KeyParameter(key), IV);
paddedBufferedBlockCipher.Init(false, parametersWithIV);
byte[] array = new byte[paddedBufferedBlockCipher.GetOutputSize(cipherBytes.Length)];
int num = paddedBufferedBlockCipher.ProcessBytes(cipherBytes, array, 0);
paddedBufferedBlockCipher.DoFinal(array, num);
return array;
}
public static byte[] EncryptAesCBCInfo(byte[] key, byte[] IV, byte[] plainBytes)

View File

@@ -15,6 +15,7 @@ namespace Novaria.Common.Crypto
public DiffieHellman()
{
Console.WriteLine(spriv);
//g** Spriv mod p
ServerPublicKey = BigInteger.ModPow(g, spriv, p);
}

View File

@@ -0,0 +1,230 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: ClientDiff.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Pb {
/// <summary>Holder for reflection information generated from ClientDiff.proto</summary>
public static partial class ClientDiffReflection {
#region Descriptor
/// <summary>File descriptor for ClientDiff.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
private static pbr::FileDescriptor descriptor;
static ClientDiffReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"ChBDbGllbnREaWZmLnByb3RvGg5GaWxlRGlmZi5wcm90byIlCgpDbGllbnRE",
"aWZmEhcKBGRpZmYYASADKAsyCS5GaWxlRGlmZkIFqgICUGJiBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Pb.FileDiffReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::Pb.ClientDiff), global::Pb.ClientDiff.Parser, new[]{ "Diff" }, null, null, null, null)
}));
}
#endregion
}
#region Messages
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
public sealed partial class ClientDiff : pb::IMessage<ClientDiff>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
private static readonly pb::MessageParser<ClientDiff> _parser = new pb::MessageParser<ClientDiff>(() => new ClientDiff());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pb::MessageParser<ClientDiff> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Pb.ClientDiffReflection.Descriptor.MessageTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public ClientDiff() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public ClientDiff(ClientDiff other) : this() {
diff_ = other.diff_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public ClientDiff Clone() {
return new ClientDiff(this);
}
/// <summary>Field number for the "diff" field.</summary>
public const int DiffFieldNumber = 1;
private static readonly pb::FieldCodec<global::Pb.FileDiff> _repeated_diff_codec
= pb::FieldCodec.ForMessage(10, global::Pb.FileDiff.Parser);
private readonly pbc::RepeatedField<global::Pb.FileDiff> diff_ = new pbc::RepeatedField<global::Pb.FileDiff>();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public pbc::RepeatedField<global::Pb.FileDiff> Diff {
get { return diff_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
return Equals(other as ClientDiff);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Equals(ClientDiff other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if(!diff_.Equals(other.diff_)) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override int GetHashCode() {
int hash = 1;
hash ^= diff_.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void WriteTo(pb::CodedOutputStream output) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
output.WriteRawMessage(this);
#else
diff_.WriteTo(output, _repeated_diff_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
diff_.WriteTo(ref output, _repeated_diff_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
}
#endif
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int CalculateSize() {
int size = 0;
size += diff_.CalculateSize(_repeated_diff_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(ClientDiff other) {
if (other == null) {
return;
}
diff_.Add(other.diff_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(pb::CodedInputStream input) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
input.ReadRawMessage(this);
#else
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10: {
diff_.AddEntriesFrom(input, _repeated_diff_codec);
break;
}
}
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
break;
case 10: {
diff_.AddEntriesFrom(ref input, _repeated_diff_codec);
break;
}
}
}
}
#endif
}
#endregion
}
#endregion Designer generated code

View File

@@ -0,0 +1,316 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: FileDiff.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
namespace Pb {
/// <summary>Holder for reflection information generated from FileDiff.proto</summary>
public static partial class FileDiffReflection {
#region Descriptor
/// <summary>File descriptor for FileDiff.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
private static pbr::FileDescriptor descriptor;
static FileDiffReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Cg5GaWxlRGlmZi5wcm90byI8CghGaWxlRGlmZhIRCglmaWxlX25hbWUYASAB",
"KAkSDAoEaGFzaBgCIAEoCRIPCgd2ZXJzaW9uGAMgASgDQgWqAgJQYmIGcHJv",
"dG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::Pb.FileDiff), global::Pb.FileDiff.Parser, new[]{ "FileName", "Hash", "Version" }, null, null, null, null)
}));
}
#endregion
}
#region Messages
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
public sealed partial class FileDiff : pb::IMessage<FileDiff>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
private static readonly pb::MessageParser<FileDiff> _parser = new pb::MessageParser<FileDiff>(() => new FileDiff());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pb::MessageParser<FileDiff> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::Pb.FileDiffReflection.Descriptor.MessageTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public FileDiff() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public FileDiff(FileDiff other) : this() {
fileName_ = other.fileName_;
hash_ = other.hash_;
version_ = other.version_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public FileDiff Clone() {
return new FileDiff(this);
}
/// <summary>Field number for the "file_name" field.</summary>
public const int FileNameFieldNumber = 1;
private string fileName_ = "";
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string FileName {
get { return fileName_; }
set {
fileName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "hash" field.</summary>
public const int HashFieldNumber = 2;
private string hash_ = "";
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string Hash {
get { return hash_; }
set {
hash_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "version" field.</summary>
public const int VersionFieldNumber = 3;
private long version_;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public long Version {
get { return version_; }
set {
version_ = value;
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
return Equals(other as FileDiff);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Equals(FileDiff other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (FileName != other.FileName) return false;
if (Hash != other.Hash) return false;
if (Version != other.Version) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override int GetHashCode() {
int hash = 1;
if (FileName.Length != 0) hash ^= FileName.GetHashCode();
if (Hash.Length != 0) hash ^= Hash.GetHashCode();
if (Version != 0L) hash ^= Version.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void WriteTo(pb::CodedOutputStream output) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
output.WriteRawMessage(this);
#else
if (FileName.Length != 0) {
output.WriteRawTag(10);
output.WriteString(FileName);
}
if (Hash.Length != 0) {
output.WriteRawTag(18);
output.WriteString(Hash);
}
if (Version != 0L) {
output.WriteRawTag(24);
output.WriteInt64(Version);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
if (FileName.Length != 0) {
output.WriteRawTag(10);
output.WriteString(FileName);
}
if (Hash.Length != 0) {
output.WriteRawTag(18);
output.WriteString(Hash);
}
if (Version != 0L) {
output.WriteRawTag(24);
output.WriteInt64(Version);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
}
#endif
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int CalculateSize() {
int size = 0;
if (FileName.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(FileName);
}
if (Hash.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(Hash);
}
if (Version != 0L) {
size += 1 + pb::CodedOutputStream.ComputeInt64Size(Version);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(FileDiff other) {
if (other == null) {
return;
}
if (other.FileName.Length != 0) {
FileName = other.FileName;
}
if (other.Hash.Length != 0) {
Hash = other.Hash;
}
if (other.Version != 0L) {
Version = other.Version;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(pb::CodedInputStream input) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
input.ReadRawMessage(this);
#else
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10: {
FileName = input.ReadString();
break;
}
case 18: {
Hash = input.ReadString();
break;
}
case 24: {
Version = input.ReadInt64();
break;
}
}
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
break;
case 10: {
FileName = input.ReadString();
break;
}
case 18: {
Hash = input.ReadString();
break;
}
case 24: {
Version = input.ReadInt64();
break;
}
}
}
}
#endif
}
#endregion
}
#endregion Designer generated code

View File

@@ -16,9 +16,9 @@ namespace Novaria.GameServer.Controllers.Api.ProtocolHandlers
{
Mails mailListResp = (Mails)PcapParser.PcapParser.Instance.GetPcapPacket(NetMsgId.mail_list_succeed_ack);
mailListResp.List[0].Subject = "夏萝莉是小楠梁";
mailListResp.List[1].Subject = "夏萝莉是小楠梁";
mailListResp.List[2].Subject = "夏萝莉是小楠梁";
mailListResp.List[0].Subject = "seggs";
mailListResp.List[1].Subject = "seggs";
mailListResp.List[2].Subject = "seggs";
return Packet.Create(NetMsgId.mail_list_succeed_ack, mailListResp);
}

View File

@@ -12,7 +12,7 @@ namespace Novaria.GameServer.Controllers.Api.ProtocolHandlers
}
[ProtocolHandler(NetMsgId.resident_shop_get_req)] // req id goes here
public Packet PlayerLoginHandler(ResidentShopGetReq req)
public Packet ResidentShopGetHandler(ResidentShopGetReq req)
{
ResidentShopGetResp resp = new ResidentShopGetResp();

View File

@@ -1,11 +1,13 @@
using Google.Protobuf;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Novaria.Common.Crypto;
using Novaria.Common.Util;
using Pb;
using Serilog;
using System.Text.Json;
namespace Novaria.GameServer.CoNovariaollers
namespace Novaria.GameServer.Controllers
{
[ApiController]
[Route("/meta")]
@@ -39,6 +41,23 @@ namespace Novaria.GameServer.CoNovariaollers
Log.Information("Response bytes:");
return File(response, "text/html");
}
[Route("and.html")]
public IActionResult GetAndroid()
{
string diffJson = System.IO.File.ReadAllText($"../../../../Novaria.GameServer/and.json"); // disgusting pathing, but "not hardcoded" now ig
ClientDiff clientDiff = JsonConvert.DeserializeObject<ClientDiff>(diffJson);
Console.WriteLine(clientDiff.Diff.Count);
Console.WriteLine(clientDiff.Diff[0].FileName);
byte[] encrypted_content = AeadTool.EncryptAesCBCInfo(AeadTool.DEFAULT_SERVERLIST_KEY, AeadTool.DEFAULT_AND_IV, clientDiff.ToByteArray());
byte[] response = Utils.CombineByteArrays(AeadTool.DEFAULT_AND_IV, encrypted_content);
return File(response, "text/html");
}
}
}

View File

@@ -2,12 +2,25 @@
using Serilog;
// rest of the random as packets during sdk
namespace Novaria.GameServer.CoNovariaollers
namespace Novaria.GameServer.Controllers
{
[ApiController]
[Route("/")]
public class SDKController : ControllerBase
{
[HttpPost("user/oauth2/v2/grant")]
public IResult OAuthGrant()
{
return Results.Content(
@"
{
""msg"": """",
""status"": 106,
""type"": ""A""
}",
"application/json"
);
}
[Route("")]
public IResult GetNothing()
{
@@ -271,6 +284,17 @@ namespace Novaria.GameServer.CoNovariaollers
");
}
[Route("common/client-code")]
public IResult PostClientCode()
{
return Results.Text(@"
{
""Code"": 200,
""Msg"": ""OK""
}
");
}
}
}

View File

@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using Serilog;
namespace Novaria.GameServer.CoNovariaollers
namespace Novaria.GameServer.Controllers
{
[ApiController]
[Route("/user")]

View File

@@ -1,17 +1,8 @@
using System.Reflection;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Novaria.Common.Crypto;
using Novaria.Common.Core;
using Proto;
using Serilog;
using Novaria.GameServer.Controllers.Api.ProtocolHandlers;
using Novaria.Common.Util;
using System.Numerics;
using Microsoft.AspNetCore.DataProtection;
using System.Text;
using System.Text.Json;
using Nova.Client;
namespace Novaria.GameServer
{

View File

@@ -6,6 +6,10 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Content Remove="win.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DotNetZip" Version="1.16.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.2">

29874
Novaria.GameServer/and.json Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,14 +0,0 @@
{
"version": "37",
"agent": [
{
"name": "启明测试",
"addr": "https://nova.yostar.cn/agent-zone-1/",
"status": 1,
"zone": "1"
}
],
"status": 1,
"message": "测试尚未开始预计开服时间1月9日11:00",
"reportEndpoint": "https://nova.yostar.cn/report/"
}

File diff suppressed because it is too large Load Diff

View File

@@ -7,10 +7,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Novaria", "Novaria\Novaria.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Novaria.Common", "Novaria.Common\Novaria.Common.csproj", "{F65D281C-FAF5-45A2-919C-CE5E9E038D43}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Novaria.GameServer", "Novaria.SDKServer\Novaria.GameServer.csproj", "{085E64B4-F04A-4866-8A3F-8E67DEB8E678}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Novaria.PcapParser", "Novaria.PcapParser\Novaria.PcapParser.csproj", "{80CF22EB-B5AB-48B6-9706-23292461CCD3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Novaria.GameServer", "Novaria.GameServer\Novaria.GameServer.csproj", "{4A2CD3C5-9F10-493B-AEC9-B3DC74A292A1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -25,14 +25,14 @@ Global
{F65D281C-FAF5-45A2-919C-CE5E9E038D43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F65D281C-FAF5-45A2-919C-CE5E9E038D43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F65D281C-FAF5-45A2-919C-CE5E9E038D43}.Release|Any CPU.Build.0 = Release|Any CPU
{085E64B4-F04A-4866-8A3F-8E67DEB8E678}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{085E64B4-F04A-4866-8A3F-8E67DEB8E678}.Debug|Any CPU.Build.0 = Debug|Any CPU
{085E64B4-F04A-4866-8A3F-8E67DEB8E678}.Release|Any CPU.ActiveCfg = Release|Any CPU
{085E64B4-F04A-4866-8A3F-8E67DEB8E678}.Release|Any CPU.Build.0 = Release|Any CPU
{80CF22EB-B5AB-48B6-9706-23292461CCD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{80CF22EB-B5AB-48B6-9706-23292461CCD3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{80CF22EB-B5AB-48B6-9706-23292461CCD3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80CF22EB-B5AB-48B6-9706-23292461CCD3}.Release|Any CPU.Build.0 = Release|Any CPU
{4A2CD3C5-9F10-493B-AEC9-B3DC74A292A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A2CD3C5-9F10-493B-AEC9-B3DC74A292A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A2CD3C5-9F10-493B-AEC9-B3DC74A292A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A2CD3C5-9F10-493B-AEC9-B3DC74A292A1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -8,7 +8,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Novaria.SDKServer\Novaria.GameServer.csproj" />
<ProjectReference Include="..\Novaria.GameServer\Novaria.GameServer.csproj" />
</ItemGroup>
</Project>

33
README.md Normal file
View File

@@ -0,0 +1,33 @@
# Novaria
# Client Installation Tutorial
## PC (highly recommended, one click install)
Download and extract zip from [PC_NOVA_CN](https://tenshis-archive.duckdns.org/d/Tenshi's%20Archive/Game%20Files/Yostar%20Games/Stellar%20Sora/0.1.0/CN/PC_NOVA_CN.7z)
## Android (NOT recommended)
Download and install the apk from [APK_NOVA](https://tenshis-archive.duckdns.org/d/Tenshi's%20Archive/Game%20Files/Yostar%20Games/Stellar%20Sora/0.1.0/CN/星塔旅人.apk)
After installing the apk on your emulator, you have two ways of installing the resources needed
1. Manual install - download and extract [ANDROID_NOVA_CN](https://tenshis-archive.duckdns.org/d/Tenshi's%20Archive/Game%20Files/Yostar%20Games/Stellar%20Sora/0.1.0/CN/星塔旅人.apk) and move them into the game files on your emulator
2. Automatic install - run [android_update.bat](android_update.bat) (change the ip in [android_update.py](android_update.py) to your own ip first) and Novaria Server, after joining game the resources will download automatically.
#### I really do not recommend the android version, many things can go wrong, you are better off installing the pc client in one click lol
<br>
# Running
1. IMPORTANT: change the ip in [proxy.py](proxy.py) into your own ip
2. Run proxy.bat
3. Run Novaria
4. Join game
## Special Thanks
- Tenshi - (for hosting all the resources that was needed and creating the custom cdn <3)

1
android_update.bat Normal file
View File

@@ -0,0 +1 @@
mitmweb -k -m wireguard --set block_global=false --mode local -s .\update.py

24
android_update.py Normal file
View File

@@ -0,0 +1,24 @@
from mitmproxy import http
from mitmproxy import ctx
from mitmproxy.proxy import layer
def load(loader):
ctx.options.connection_strategy = "lazy"
ctx.options.upstream_cert = False
ctx.options.ssl_insecure = True
ctx.options.allow_hosts = ['nova-static.yostar.cn', 'nova.yostar.cn', 'sdk-api.yostar.cn', 'static-stellasora.yostar.net', "udata-api.open.yostar.net"]
def next_layer(nextlayer: layer.NextLayer):
sni = nextlayer.context.client.sni
if sni and (sni.endswith("nova.yostar.cn") or sni.endswith("sdk-api.yostar.cn") or sni.endswith("static-stellasora.yostar.net") or sni.endswith("udata-api.open.yostar.net")):
ctx.log('sni:' + sni)
nextlayer.context.server.address = ("192.168.86.32", 443)
def request(flow: http.HTTPFlow) -> None:
if (flow.request.host_header.endswith("nova-static.yostar.cn")) and ("serverlist.html" not in flow.request.path_components) and ("and.html" not in flow.request.path_components):
flow.request.host = "nova-static.duckdns.org"
flow.request.port = 443
if ("serverlist.html" in flow.request.path_components or "and.html" in flow.request.path_components):
flow.request.host = "192.168.86.32"
flow.request.port = 443

View File

View File