Fix bug where other players weren't visible

This commit is contained in:
AeonLucid authored and Mike committed 2020-09-20 23:13:57 +02:00
1 parent bc028b421c
commit 5db481e039
6 files changed
+284 -2

No files matched your search

+1 -1
View File
@@ -108,7 +108,7 @@ namespace AmongUs.Server.Net
message.Write(_hostId);
message.WritePacked(_players.Count - 1);
foreach (var (_, p) in _players.Where(x => x.Value == player))
foreach (var (_, p) in _players.Where(x => x.Value != player))
{
message.WritePacked(p.Client.Id);
}
@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net452</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Pcap.Net.x64" Version="1.0.4.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\submodules\Hazel-Networking\Hazel\Hazel.csproj" />
</ItemGroup>
</Project>
+70
View File
@@ -0,0 +1,70 @@
using System;
using System.Text;
namespace AmongUs.Tools.Proxy
{
public static class HexUtils
{
public static string HexDump(byte[] bytes, int bytesPerLine = 16)
{
if (bytes == null) return "<null>";
int bytesLength = bytes.Length;
char[] HexChars = "0123456789ABCDEF".ToCharArray();
int firstHexColumn =
8 // 8 characters for the address
+ 3; // 3 spaces
int firstCharColumn = firstHexColumn
+ bytesPerLine * 3 // - 2 digit for the hexadecimal value and 1 space
+ (bytesPerLine - 1) / 8 // - 1 extra space every 8 characters from the 9th
+ 2; // 2 spaces
int lineLength = firstCharColumn
+ bytesPerLine // - characters to show the ascii value
+ Environment.NewLine.Length; // Carriage return and line feed (should normally be 2)
char[] line = (new String(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray();
int expectedLines = (bytesLength + bytesPerLine - 1) / bytesPerLine;
StringBuilder result = new StringBuilder(expectedLines * lineLength);
for (int i = 0; i < bytesLength; i += bytesPerLine)
{
line[0] = HexChars[(i >> 28) & 0xF];
line[1] = HexChars[(i >> 24) & 0xF];
line[2] = HexChars[(i >> 20) & 0xF];
line[3] = HexChars[(i >> 16) & 0xF];
line[4] = HexChars[(i >> 12) & 0xF];
line[5] = HexChars[(i >> 8) & 0xF];
line[6] = HexChars[(i >> 4) & 0xF];
line[7] = HexChars[(i >> 0) & 0xF];
int hexColumn = firstHexColumn;
int charColumn = firstCharColumn;
for (int j = 0; j < bytesPerLine; j++)
{
if (j > 0 && (j & 7) == 0) hexColumn++;
if (i + j >= bytesLength)
{
line[hexColumn] = ' ';
line[hexColumn + 1] = ' ';
line[charColumn] = ' ';
}
else
{
byte b = bytes[i + j];
line[hexColumn] = HexChars[(b >> 4) & 0xF];
line[hexColumn + 1] = HexChars[b & 0xF];
line[charColumn] = (b < 32 ? '·' : (char)b);
}
hexColumn += 3;
charColumn++;
}
result.Append(line);
}
return result.ToString();
}
}
}
+183
View File
@@ -0,0 +1,183 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Hazel;
using Hazel.Udp;
using PcapDotNet.Core;
using PcapDotNet.Packets;
namespace AmongUs.Tools.Proxy
{
internal static class Program
{
private const string DeviceName = "Intel(R) I211 Gigabit Network Connection";
private static readonly Dictionary<byte, string> TagMap = new Dictionary<byte, string>
{
{0, "HostGame"},
{1, "JoinGame"},
{2, "StartGame"},
{3, "RemoveGame"},
{4, "RemovePlayer"},
{5, "GameData"},
{6, "GameDataTo"},
{7, "JoinedGame"},
{8, "EndGame"},
{9, "GetGameList"},
{10, "AlterGame"},
{11, "KickPlayer"},
{12, "WaitForHost"},
{13, "Redirect"},
{14, "ReselectServer"},
{16, "GetGameListV2"}
};
private static void Main(string[] args)
{
var devices = LivePacketDevice.AllLocalMachine;
if (devices.Count == 0)
{
Console.WriteLine("No interfaces found! Make sure WinPcap is installed.");
return;
}
var device = devices.FirstOrDefault(x => x.Description.Contains(DeviceName));
if (device == null)
{
Console.WriteLine("Unable to find configured device.");
return;
}
using (var communicator = device.Open(65536, PacketDeviceOpenAttributes.Promiscuous, 1000))
{
using (var filter = communicator.CreateFilter("udp and port 22023"))
{
communicator.SetFilter(filter);
}
communicator.ReceivePackets(0, PacketHandler);
}
}
private static void PacketHandler(Packet packet)
{
var ip = packet.Ethernet.IpV4;
var ipSrc = ip.Source.ToString();
var udp = ip.Udp;
// True if this is our own packet.
using (var stream = udp.Payload.ToMemoryStream())
{
var reader = MessageReader.Get(stream.ToArray());
if (reader.Buffer[0] == (byte) SendOption.Reliable)
{
reader.Offset = 3;
reader.Length = udp.Payload.Length - 3;
reader.Position = 0;
}
else if (reader.Buffer[0] == (byte) UdpSendOption.Acknowledgement ||
reader.Buffer[0] == (byte) UdpSendOption.Ping ||
reader.Buffer[0] == (byte) UdpSendOption.Hello ||
reader.Buffer[0] == (byte) UdpSendOption.Disconnect)
{
return;
}
else
{
reader.Offset = 1;
reader.Length = udp.Payload.Length - 1;
reader.Position = 0;
}
var isSent = ipSrc.StartsWith("192.");
while (true)
{
if (reader.Position >= reader.Length)
{
break;
}
var message = reader.ReadMessage();
if (isSent)
{
HandleToServer(ipSrc, message);
}
else
{
HandleToClient(ipSrc, message);
}
if (message.Position < message.Length)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("- Did not consume all bytes.");
}
}
}
}
private static void HandleToClient(string source, MessageReader packet)
{
var tagName = TagMap.ContainsKey(packet.Tag) ? TagMap[packet.Tag] : "Unknown";
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine($"{source,-15} Client received: {packet.Tag,-2} {tagName}");
switch (packet.Tag)
{
case 14:
case 13:
packet.Position = packet.Length;
break;
case 0:
Console.WriteLine("- GameCode " + packet.ReadInt32());
break;
case 5:
case 6:
Console.WriteLine(HexUtils.HexDump(packet.Buffer.Take(packet.Length).ToArray()));
packet.Position = packet.Length;
break;
case 7:
Console.WriteLine("- GameCode " + packet.ReadInt32());
Console.WriteLine("- PlayerId " + packet.ReadInt32());
Console.WriteLine("- Host " + packet.ReadInt32());
var playerCount = packet.ReadPackedInt32();
Console.WriteLine("- PlayerCount " + playerCount);
for (var i = 0; i < playerCount; i++)
{
Console.WriteLine("- PlayerId " + packet.ReadPackedInt32());
}
break;
case 10:
Console.WriteLine("- GameCode " + packet.ReadInt32());
Console.WriteLine("- Flag " + packet.ReadSByte());
Console.WriteLine("- Value " + packet.ReadBoolean());
break;
}
}
private static void HandleToServer(string source, MessageReader packet)
{
var tagName = TagMap.ContainsKey(packet.Tag) ? TagMap[packet.Tag] : "Unknown";
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"{source,-15} Server received: {packet.Tag,-2} {tagName}");
switch (packet.Tag)
{
case 0:
Console.WriteLine("- GameInfo length " + packet.ReadBytesAndSize().Length);
break;
case 1:
Console.WriteLine("- GameCode " + packet.ReadInt32());
Console.WriteLine("- Unknown " + packet.ReadByte());
break;
case 5:
case 6:
Console.WriteLine("- GameCode " + packet.ReadInt32());
Console.WriteLine(HexUtils.HexDump(packet.Buffer.Take(packet.Length).ToArray()));
packet.Position = packet.Length;
break;
}
}
}
}
+13
View File
@@ -17,6 +17,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hazel", "..\submodules\Haze
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AmongUs.Tests", "AmongUs.Tests\AmongUs.Tests.csproj", "{C1385C67-A7DD-46D2-80F6-FA428B85FB22}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{56DD9707-D811-4056-9E2C-8A9CC2479B07}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AmongUs.Tools.Proxy", "AmongUs.Tools.Proxy\AmongUs.Tools.Proxy.csproj", "{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -71,6 +75,14 @@ Global
{C1385C67-A7DD-46D2-80F6-FA428B85FB22}.Release|Any CPU.Build.0 = Release|Any CPU
{C1385C67-A7DD-46D2-80F6-FA428B85FB22}.Release|x86.ActiveCfg = Release|Any CPU
{C1385C67-A7DD-46D2-80F6-FA428B85FB22}.Release|x86.Build.0 = Release|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Debug|x86.ActiveCfg = Debug|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Debug|x86.Build.0 = Debug|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Release|Any CPU.Build.0 = Release|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Release|x86.ActiveCfg = Release|Any CPU
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -80,5 +92,6 @@ Global
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{02CFBD30-D77D-400F-94B2-700F60EFDD7F} = {DFA3CC6A-A27C-4713-876D-A55912C78C45}
{D16B8DE9-8EE2-4F6A-9352-305D5AB0233D} = {56DD9707-D811-4056-9E2C-8A9CC2479B07}
EndGlobalSection
EndGlobal