Brave, с шифрацией особо не разбирался но на сколько я знаю расшифровать RSA не зная приватного ключа практически нереально, что в принципе не особо важно ибо нужен только при авторизации. Что насчет фришек, как обстоят дела с ними? И самый главный вопрос, какие ограничения накладывает клиент, каким образом он определяет как зашифрован пакет?
Вот в картинке нарисовал.
По синему проводу идет трафик от Сервера->Клиенту
По красному от Клиента->Серверу
По жёлтому ваше творчество.
Мне вот интересно. Если делать отправку только по жёлтому проводу, а клиент игры будет получать только результаты по синему, все ли в порядке будет с клиентом? Не кританёт от того что он получил пакет инвентаря без запроса? Мне кажется что ничего не случится, клиент это же по сути марионетка а сервер кукловод.
Мне вот интересно. Если делать отправку только по жёлтому проводу, а клиент игры будет получать только результаты по синему, все ли в порядке будет с клиентом? Не кританёт от того что он получил пакет инвентаря без запроса? Мне кажется что ничего не случится, клиент это же по сути марионетка а сервер кукловод.
Нашел у себя в захромах этот код можно использовать как пример) это к слову как расклеивать пакеты на сервере работает с линейкой прекрасно хоть и написан криво(писался давно)) показывает размер пакета и сам пакет(не дешефруя) можете посмотреть как текут пакеты на руофе ну и 1 - 2 пакет дальше будут шифрованы
как пример может кому пригодится:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace L2_test
{
class Program
{
static void Main(string[] args)
{
////////////////////////////////////////////////////////////////////////////////////////////
Socket outsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] buf = new byte[1000];
int ibuf;
string port;
string ipa = "";
int iport = 0;
int temp;
NetworkStream nsout;
//////////////////////////////////////////////////////////////////////////////////////
Socket ssockclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ssockclient.Bind(new IPEndPoint(IPAddress.Any, 5555));
ssockclient.Listen(100);
Socket ss = ssockclient.Accept();
Console.WriteLine("Запущен 1 поток "+ss.RemoteEndPoint);
NetworkStream nsin = new NetworkStream(ss);
ibuf = nsin.Read(buf, 0, buf.Length);
Console.WriteLine("Принят первый пакет: 1 \n");
if (buf[0] == 5 && buf[1] == 1 && buf[2] == 0)
{
buf[0] = 5;
buf[1] = 0;
nsin.Write(buf, 0, 2);
Console.WriteLine("Отправлен пакет: 1 \n");
ibuf = nsin.Read(buf, 0, buf.Length);
Console.WriteLine("Принят пакет: 2 \n");
if (buf[3] == 1)
{
Console.WriteLine("строка содержит ип адресс \n");
ipa = Convert.ToString(buf[4]);
for (int v = 5; v < 8; v++)
{
ipa = ipa + "." + Convert.ToString(buf[v]);
}
if (buf[8] != 0)
{
port = Convert.ToString(buf[8] * 256 + buf[9]) ;
}
else
{
port = Convert.ToString(buf[9]);
}
Console.WriteLine(ipa);
Console.WriteLine(port);
iport = Convert.ToInt32(port);
}
buf[1] = 0;
nsin.Write(buf, 0, 10);
Console.WriteLine("Отправлен пакет: 2 \n");
}
////////////////////////////////////
outsoc.Connect(new DnsEndPoint(ipa, iport));
nsout = new NetworkStream(outsoc);
while (true)
{
while (nsin.DataAvailable)
{
Console.Write("\n Пакет принят от клиента\n");
nsin.Read(buf, 0, 2);
temp = (buf[0] + buf[1] * 256)-2;
Console.WriteLine(temp);
nsout.Write(buf, 0, 2);
ibuf = nsin.Read(buf, 0, temp);
for (int v = 0; v < ibuf; v++)
{
Console.Write(buf[v] + " ");
}
Console.Write("\n");
nsout.Write(buf, 0, ibuf);
}
while (nsout.DataAvailable)
{
Console.Write("\n Пакет принят от сервера\n");
ibuf = nsout.Read(buf, 0, 2);
temp = (buf[0] + buf[1] * 256) - 2;
Console.WriteLine(temp);
nsin.Write(buf, 0, 2);
ibuf = nsout.Read(buf, 0, temp);
for (int v = 0; v < ibuf; v++)
{
Console.Write(buf[v] + " ");
}
nsin.Write(buf, 0, ibuf);
}
}
// проксифицировать через проксифиер или тп, протокол сокс 5)
Последний раз редактировалось Deadly, 23.02.2013 в 00:45.
Ради интереса попробовал тоже на интерлюди у меня все работает
Зы если это серва с защитой( типо дефо) то там и не будет работать точнее дальше выбора чара вы не пройдете и с пх, тк при нажатие на кнопку принять(выбора чара) идет не форматированный трафик, а то что я скинул он берет 2 байта первых щитает размер и дальше считывает тело пакета, впринципе можно добавить на такой трафик проверку (допустим если выходи за граници 1000)это не сложно, либо поменять буфер на 100000 скажем)))
Добавлено через 22 минуты
Исправленный вариант
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace Прокси_сервер_консоль_ns
{
class Program
{
static void Main(string[] args)
{
////////////////////////////////////////////////////////////////////////////////////////////
Socket outsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] buf = new byte[100000];
int ibuf;
string port;
string ipa = "";
int iport = 0;
int temp;
NetworkStream nsout;
//////////////////////////////////////////////////////////////////////////////////////
Socket ssockclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ssockclient.Bind(new IPEndPoint(IPAddress.Any, 5555));
ssockclient.Listen(100);
Socket ss = ssockclient.Accept();
Console.WriteLine("Запущен 1 поток "+ss.RemoteEndPoint);
NetworkStream nsin = new NetworkStream(ss);
ibuf = nsin.Read(buf, 0, buf.Length);
Console.WriteLine("Принят первый пакет: 1 \n");
if (buf[0] == 5 && buf[1] == 1 && buf[2] == 0)
{
buf[0] = 5;
buf[1] = 0;
nsin.Write(buf, 0, 2);
Console.WriteLine("Отправлен пакет: 1 \n");
ibuf = nsin.Read(buf, 0, buf.Length);
Console.WriteLine("Принят пакет: 2 \n");
if (buf[3] == 1)
{
Console.WriteLine("строка содержит ип адресс \n");
ipa = Convert.ToString(buf[4]);
for (int v = 5; v < 8; v++)
{
ipa = ipa + "." + Convert.ToString(buf[v]);
}
if (buf[8] != 0)
{
port = Convert.ToString(buf[8] * 256 + buf[9]) ;
}
else
{
port = Convert.ToString(buf[9]);
}
Console.WriteLine(ipa);
Console.WriteLine(port);
iport = Convert.ToInt32(port);
}
buf[1] = 0;
nsin.Write(buf, 0, 10);
Console.WriteLine("Отправлен пакет: 2 \n");
}
////////////////////////////////////
outsoc.Connect(new DnsEndPoint(ipa, iport));
nsout = new NetworkStream(outsoc);
int t=0;
while (true)
{
while (nsin.DataAvailable)
{
t++;
Console.Write("\n Пакет принят от клиента\n");
nsin.Read(buf, 0, 2);
temp = (buf[0] + buf[1] * 256)-2;
Console.WriteLine(temp);
nsout.Write(buf, 0, 2);
ibuf = nsin.Read(buf, 0, temp);
for (int v = 0; v < ibuf; v++)
{
Console.Write(buf[v] + " ");
}
Console.Write("\n");
nsout.Write(buf, 0, ibuf);
}
while (nsout.DataAvailable)
{
t++;
Console.Write("\n Пакет принят от сервера\n");
ibuf = nsout.Read(buf, 0, 2);
temp = (buf[0] + buf[1] * 256) - 2;
Console.WriteLine(temp);
nsin.Write(buf, 0, 2);
ibuf = nsout.Read(buf, 0, temp);
for (int v = 0; v < ibuf; v++)
{
Console.Write(buf[v] + " ");
}
nsin.Write(buf, 0, ibuf);
}
}
}
}
}
Зы в твоем релизе все будет работь замчечательно за тем исключением что в 1 прекрасный момент пакеты "склеятся" и ты не сможешь найти где начало где конец
Последний раз редактировалось Deadly, 23.02.2013 в 11:41.
Причина: Добавлено сообщение
Сервер на котором я проверял хукает ws2_32.send и сам коннектится к логин серверу, а коннект к гейм серверу отдает клиенту.
Выходит 2 разных подключения, следовательно должно быть 2 пары сокетов, на логин и гейм серверы.
Brave, тогда как у него работает если ssockclient.Accept() вызывается только 1 раз?
Мой вариант понятно как работает, там ацепт вызывает себя же, но у Дедли все в одном потоке и при этом работает
Последний раз редактировалось Sinn3r, 23.02.2013 в 13:41.