using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; using System.Windows; using Launcher.Code.Tools; using Launcher.Properties; using Launcher.XAML; namespace Launcher.Code { public class FileSecurityClient { public HackClient hClient; public string toIP = "95.211.135.154"; //kaduh: 174.123.29.170 public string Username { get; set; } public string Password { get; set; } public string GUID = ""; //Process ClientProgram; ProcessStartInfo startInfo; public void Start() { Trace.WriteLine("Check started"); hClient = new HackClient(toIP, 9334, Username, Password); //starts hackprotection session with server hClient.OnPacketReceived += client_OnPacketReceived; hClient.OnDisconnect += hClient_OnDisconnect; ((App)App.Current).ClientProcess = new Process(); } static void hClient_OnDisconnect(HackClient pClient) { Trace.WriteLine("Client disconnected."); ((App) Application.Current).SaveShutdown(-1); } void client_OnPacketReceived(Packet pPacket, HackClient pClient) { ushort opcode; if (!pPacket.ReadUShort(out opcode)) { SendError("Not enough data to read"); return; } switch (opcode) { default: Packet_Unknown(opcode); break; case 1: //getpcinfo Packet_ReqPcInfo(); break; case 4: //requestfilecheck Packet_FileCheck(pPacket); break; case 6: //launchclient Packet_LaunchClient(pPacket); break; case 7: //message or error Packet_Message(pPacket); break; case 8: //GUID Packet_GUID(pPacket); break; } } private void Packet_Unknown(ushort opcode) { Trace.WriteLine("Unknown packet reced."); SendError("No client response for: " + opcode); } private void Packet_ReqPcInfo() { Trace.WriteLine("Req-PC-Info packet reced."); SendPCInfo(); } private void Packet_FileCheck(Packet pPacket) { Trace.WriteLine("Req-FS packet reced."); HandleFileCheck(pPacket); } private void Packet_LaunchClient(Packet pPacket) { Trace.WriteLine("Launch-Client packet reced."); string filename; string arguments = ""; if (!pPacket.ReadString(out filename) || !pPacket.ReadString(out arguments)) { Trace.WriteLine("Missing launchparam"); SendError("Missing launchparam for launch."); Trace.WriteLine("Missing launch param => DC"); hClient.Disconnect(); } arguments += string.Format(" -k {0}#{1}", Username, Password); string fullpath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename); if (!File.Exists(filename)) { SendError(filename + " not found."); ((App) App.Current).UIFactory.StartNew(() => MessageWindow.ShowErrorMessage(Resources.Message_FileNotFound)); return; } SetStartInfo(arguments, fullpath); StartClient(); } private void SetStartInfo(string arguments, string fullpath) { startInfo = new ProcessStartInfo {Arguments = arguments, FileName = fullpath}; ((App)App.Current).ClientProcess.StartInfo = startInfo; } private void StartClient() { Trace.WriteLine("Starting client."); ((App)App.Current).ClientProcess.Start(); DataProvider.MainWindowInstance.SaveClose(); } private void Packet_Message(Packet pPacket) { Trace.WriteLine("Message/Error reced."); string message; bool isError; if (!pPacket.ReadString(out message) || !pPacket.ReadBool(out isError)) { SendError("Could not read error message from server."); return; } if (isError) { ((App) App.Current).UIFactory.StartNew(() => MessageWindow.ShowErrorMessage(message)); } } private void Packet_GUID(Packet pPacket) { Trace.WriteLine("GUID reced."); GUID = ""; if (!pPacket.ReadString(out GUID)) { SendError("Could not parse GUID."); return; } Listener lstener = new Listener(9010, 9333, toIP); Debug.WriteLine("Got GUID: " + GUID); } public static byte[] Version = {1, 0, 0, 3}; void HandleFileCheck(Packet packet) { Trace.WriteLine("File check reced"); string localPath = AppDomain.CurrentDomain.BaseDirectory; ushort count; if (!packet.ReadUShort(out count)) { Trace.WriteLine("Packet error"); SendError("Could not read FileCheck count."); return; } Dictionary Files = new Dictionary(); MD5 md5 = new MD5CryptoServiceProvider(); for (ushort i = 0; i