PDA

Просмотр полной версии : C# Lineage 2 Bot (какой старт)


zAvaTARz
24.12.2012, 19:19
Здравствуйте! очень хочу написать бота на сервер, через C#, но не знаю с чего начать, какой сделать старт, лажу по форуму 2-й день, но не могу найти код.

Пытался сделать по этому Топику http://coderx.ru/showthread.php?t=9374&highlight=ProxyConnection

Но нечего не выходит. :o

String = "91.238.84.233"; int = 7777;
Перехватывал пакеты через WPE Pro , Там логин сервер port 2106 а 7777 игровой, но через мой коннект оно пишет что сервер не отвечает.

Может кто знает код на C# Старотового подключения? тоесть подключиться к серверу, и прочитать первый HEX Пакет

=================================================
И ещё думал по ходу начать читать пакеты прогой L2proxy, чтобы потом по кодам сделать себе Бота на спойл, в файле меняю ServerAddr на 127.0.0.1, но нечего не проиходит! тоесть меняя на любой сервер оно все равно будет заходить туда куда надо...

Zergatul
24.12.2012, 20:45
Делаешь враппер с пакетхака например, который все пакеты складывает в пайп или шаред мемори. С процесса си шарпа его читаешь. Самый простой способ.

zAvaTARz
24.12.2012, 21:02
а можно примеры какие?) с примерами более понятно.

И вообще, я думал сделать такую систему, тоесть перенаправлять соединение Линейки на локальный хост, через прогу его ловить и перенаправлять данные туда куда надо, тем самым можно так же ловить пакеты, и их читать, но проблема вся в том, что с кодом не могу содедениться, и вообще читать байты с сервера)

Zergatul
24.12.2012, 21:36
Что бы сделать то, что ты пишешь, тебе придется самому разбираться с шифрованием пакетов.

Когда-то начинал писать радар на c#, который использует распарсенные пакеты программкой winfake.

https://github.com/Zergatul/ulHelper/blob/master/ulHelper/Modules/PacketsReceiveModule.cs

Вот здесь собственно код, который открывает шаред мемори и ждет пока другой процесс запишет туда пакеты.

Кода на делфи, который пишет пакет пакеты туда под рукой нету, но там все аналогично.

zAvaTARz
25.12.2012, 11:40
Спасибо! Тоесть мне нужна прога которая соеденит с сервером запишут в сустем мемори пакеты, этим скриптом их можно читать и просто разбирать, Я вроде так понел.

А скрипта у тебя нету чтобы соедениться с сервером, отправить своб первую комманду и получить ответ, Авторизации?

Zergatul
25.12.2012, 12:32
Что бы оно красиво работало, тебе придется использовать мютексы, ивенты. Как у меня в примере.
А скриптом для пакетхака не особо кошерно (придется много функций импортировать с длл, + скорость работы не особо), когда я свой радар пытался адаптировать под ИЛ, писал плагин для пакетхака, правда пока разобрался со всеми приколами (неработающими функциями, как правильно принять пакет), то забил на это все.

zAvaTARz
25.12.2012, 17:27
Мне не сильно важен перехват, я хосет прочиттаь пакеты как они работают на моем сервере, патом на примере этих пакетов создать бота, которым можно побегать за персонажем и полекать хотябы, но пока для начала меня волнует вопрос просто как соедениться с сервером и прочитать первый пакет. Тоесть Залогиниться патом зайти в саму игру, в которой уже и подйет процесс создания АИ :)

Вот что мне важно) и для начала прошу просто скрипт соедениния с сервером отправки и читания первого пакета)

Zergatul
25.12.2012, 18:24
Так пакетхак читает пакеты и поддерживает скрипты, зачем тебе мучатся писать что-то на c# - непонятно

SeregaZ
25.12.2012, 18:37
во во! и я тоже хочу кой чо написать :) л2пх впринципе для моей идеи подходит - но он сцуко однопоточный.

zAvaTARz
25.12.2012, 18:39
так а разве через пакетхак можно соедениться с сервером и из него сделать бота?

supernewbie
25.12.2012, 19:40
zAvaTARz, работы с логин сервером у него вообще нет

проще всего взять пх + l2emu и написать своего бота на дельфе

zAvaTARz
26.12.2012, 00:31
zAvaTARz, работы с логин сервером у него вообще нет

проще всего взять пх + l2emu и написать своего бота на дельфе

Так а если логин скрипта нету, а как вы тогда своих ботов пишите? :mad:

Warstar
26.12.2012, 03:39
Вы меня конечно извините, но скорее всего нет полного понимания того, что вы хотите.
Я бы на вашем месте начал с понимания основ сетей, пакетной передачи данных. Потом только думайте о боте.

alexteam
26.12.2012, 04:43
Я бы на вашем месте начал с понимания основ сетей
socket(),connect(),send(),recv()
вот и все основы.

supernewbie
26.12.2012, 10:25
zAvaTARz, тырим код из разных программ, в основном из серверов на яве

zAvaTARz
26.12.2012, 17:01
В общем вот мой код :

Пытался сделать соединение с сервером на прямую, тоесть у меня такой план, просто соедениться с ним, патом уже разбирать пакеты.

import System;
import System.IO;
import System.Net;
import System.Text;
import System.Net.Sockets;
import System.Collections;

private var serverIP : String = "91.238.84.233";
private var serverPort : int = 7777;
var _buf : byte[] = new byte[1];

function Start () {
//Создаем соединение
StreamConnect (serverIP,serverPort) ;
}

function StreamConnect(sNetIP , iPORT_NUM) {
try
{
var tcpClient = new TcpClient (sNetIP, iPORT_NUM);

// Uses the GetStream public method to return the NetworkStream.
netStream = tcpClient.GetStream ();

if (netStream.CanRead) {

tcpBufferS = tcpClient.ReceiveBufferSize - 2 ;

_buf = new byte[tcpBufferS];
netStream.Read (_buf, 0, tcpBufferS);

// Returns the data received from the host to the console.
returndata = Encoding.UTF8.GetString (_buf);

tcpClient.Close ();
netStream.Close ();

}

return "Connected" ;
//}
}
catch(ex)
{
return "Server is not active. Please start server and try again." + ex.Message;
}
}

Правдо этот скрипт на JS, но там в приндципе разницы большой нету между C# и JS, кому не понятно могу перевести в C#.

Так вот в чем проблема, при соединении он создаем Банк на 13170 Байтов!

После чег оя пытаюсь их считать в итоге у меня все зависает, и нечего не получаеться.

В чем вся может быть проблема почему столько много байтов, и при использовании комманды Read() оно все тупо зависает.

Zergatul
26.12.2012, 19:21
Странный код какой-то.
Понятно, почему зависает, в буфере просто нету
tcpBufferS = tcpClient.ReceiveBufferSize - 2 ;
такого количества байт, вот он и ждет пока они появляться.

Добавлено через 47 секунд
Копировать код непонятно откуда без понимания - это плохо :)

Warstar
26.12.2012, 19:51
Странный код какой-то.
Понятно, почему зависает, в буфере просто нету
tcpBufferS = tcpClient.ReceiveBufferSize - 2 ;
такого количества байт, вот он и ждет пока они появляться.

Добавлено через 47 секунд
Копировать код непонятно откуда без понимания - это плохо :)
Вот о чем я и говорю... Основы сетей...

zAvaTARz
26.12.2012, 21:54
Странный код какой-то.
Понятно, почему зависает, в буфере просто нету
tcpBufferS = tcpClient.ReceiveBufferSize - 2 ;
такого количества байт, вот он и ждет пока они появляться.

Добавлено через 47 секунд
Копировать код непонятно откуда без понимания - это плохо :)

Нет я копировал функцию, на англ описании) Спасибо!

Вот получил ответ на первый пакет, извините за возможно клоновый вопрос,

Вот преобразовал в HEX вот результат

BA 00 64 46 FA 9B E5 42 01 C0 D2 35 BE 8B B5 6A BA 3E 5E 15 A8 E7 A3 8E 48 7B
C9 BD 53 82 8D 0D 97 6C D2 44 B2 94 3F 0C ED 61 16 C9 9C 07 8B F3 5D 1A 5A 79 EC 86
E0 69 4F 07 EF 5E 7A 07 69 5B A4 E8 83 4E C5 30 3B EC 0E AF 7A C3 1A 06 FA 65 BE E2
C5 77 B1 9A C5 88 96 C3 60 25 C2 BD 3A 63 04 6D FE 23 5E FD B4 99 67 7C AC B2 18 A2
4C 0C 91 A0 27 54 35 C6 C1 7E B7 29 26 01 00 36 EC 6E F4 50 FC AB 19 76 77 95 63 AA
AB 70 85 DB C4 18 BA 70 4E 63 83 68 D1 6D DB DA 8F 3E F5 92 04 D0 1B 3B 1F 77 C5 F3
58 21 C8 E2 C5 8A 4E 85 9D E6 16 25 2C B7 50 69 44 F1 25 37

Всего 187 Байтов

Извините ещё раз, как можно разобрать его? и как все остальные разбираются, все нормально удмал сделать по этой ссылке http://www.la2kings.ru/la2bot/packets.html Но вото капет Инит там совсем другой

Что мне с этим пакетом делать? как мне теперь можно отправить логин и пароль? если можео пример спасибо!

Добавлено через 30 минут
http://coderx.ru/showpost.php?p=13769&postcount=33 вот нашёл, через него авторизуеться!) как бы его так технично перевести то а...

Может кто знает как можно это сделать?

lamo386
27.12.2012, 00:56
http://coderx.ru/showthread.php?t=9377
тут все практически есть, но тебе явно не хватает понимания сетей/конектов/пакетов а дальше там еще и шифрация=)))

zAvaTARz
31.12.2012, 04:41
Вот теперь наткнулся на проблему с шифрацией, в общем как всегда перед приятным процессом, мучался 3 или 4 дня и тут уже дошел до отправки первого пакета, тут проблема:

у меня в конце должно выводиться

2A 00 07 85 1D 5E 6D 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 6A 85 1D 5E 00 00 00 00 00 00 00 00 00 00
1C FC

Потом оно должно идти в BlowFish.Encode, потом записываться в банки отделяться от 2- и 2-х последних символов и отправляться на сервер...

Но вот в чем проблема, на сервер должно отправляться


2A 00 07 85 1D 5E 6D 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 6A 85 1D 5E 00 00 00 00 00 00 00 00
00 00 1C FC с двумя непонятными последними байтами, так вот вопрос откуда они берутся? откуда их брать? я так понимаю это шифрация каких то символов размер чего то там...

А у меня пакет такой

2A 00 07 85 1D 5E 6D 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 6A 85 1D 5E 00 00
00 00 00 00 00 00 00 00 00 00

Я то могу, зашифровать 2 последних символа, через GetByte но ведь дальше то пойут тоже отправки данных, там уже нужны будут 22 00 и.т.д...

Я так понимаю все самое ложное в начале)

Добавлено через 57 минут
да и вообще какойто бред с функцией BlowFish.Encode

создал функцию которая ХЕКС переводит в байты

Отправил эту функцию:
07 AB 98 43 76 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 71 AB
98 43 00 00 00 00 00 00 00 00 00 00 00 00 1C FC

Ответ оказался таким...

68 1C 6E 65 1E EE B7 8F 46 D6 A1 9B 80 85 47 46 46 D6 A1 9B 80 85 47 46 03 DE 2A 41 9D 6D 11 ED 46 D6 A1 9B 80 85 47 46 1C FC
И чето 2 последних знака знакомы очень...

Хотя ответ должен быть таким:
0x0000| 00 00 04 73 C7 45 1A 74 6D 05 DC E2 0F DC B4 32
0x0010| 49 B1 DC E2 0F DC B4 32 49 B1 29 FE 6C 86 44 E4
0x0020| 51 D0 DC E2 0F DC B4 32 49 B1

Проверяю через la2_client_emu.
Уже че и делать не знаю...

lamo386
31.12.2012, 11:13
тему что я давал читал ? там на яве есть все что нужно.
а вообще берешь клиентом со снифером заходишь на нужный сервер и пытаешся повторить пакеты.

zAvaTARz
31.12.2012, 16:38
тему что я давал читал ? там на яве есть все что нужно.
а вообще берешь клиентом со снифером заходишь на нужный сервер и пытаешься повторить пакеты.

Да конечно! я по ней только и делал! Но вот говорю все пакеты которые расшифруються клиентом, у меня правильные, каждый пакет, но вот под конец там где идёт BlowFish.Encode уже проблема! что делать не знаю, все функции переписаны, но вот почему то не то...

Вот пакеты которые идут

START

BA 00 D3 1F 34 69 FA BB 98 91 FB D2 78 94 40 AF
25 BA BC 31 AD C4 A8 5F 5F 08 DD D4 7B 44 17 A7
1E 2D DC C6 DA B6 05 78 2E 7C 6B 7C A1 2A 60 70
42 D4 CC 51 CF F9 19 8D 40 1D 32 F6 0D B9 60 A3
A4 AC 33 F5 A2 3D 18 88 0C 78 53 6E 46 56 7A 7D
7E 99 2C ED FC 53 58 F1 DF F4 28 0C 79 51 B7 54
0F 7B A3 5B A0 30 26 82 6C B8 5B 8E A7 3C 22 42
A5 77 F3 35 81 28 5B 0D 7C 26 C5 11 93 2D 72 84
D1 17 CB 2A 87 1E D5 F3 B7 8E 4C FD 84 B2 C0 55
BD 23 4B E7 19 B2 48 D6 3B BB 82 2F 24 C8 9A FC
84 83 63 8B BF 5F 93 5E E7 F4 4C CD 23 5E 35 3F
5C AF F7 D6 FB F4 ED 49 60 EF

TEMP

D3 1F 34 69 FA BB 98 91 FB D2 78 94 40 AF 25 BA
BC 31 AD C4 A8 5F 5F 08 DD D4 7B 44 17 A7 1E 2D
DC C6 DA B6 05 78 2E 7C 6B 7C A1 2A 60 70 42 D4
CC 51 CF F9 19 8D 40 1D 32 F6 0D B9 60 A3 A4 AC
33 F5 A2 3D 18 88 0C 78 53 6E 46 56 7A 7D 7E 99 2C
ED FC 53 58 F1 DF F4 28 0C 79 51 B7 54 0F 7B A3 5B
A0 30 26 82 6C B8 5B 8E A7 3C 22 42 A5 77 F3 35 81
28 5B 0D 7C 26 C5 11 93 2D 72 84 D1 17 CB 2A 87 1E
D5 F3 B7 8E 4C FD 84 B2 C0 55 BD 23 4B E7 19 B2 48
D6 3B BB 82 2F 24 C8 9A FC 84 83 63 8B BF 5F 93 5E
E7 F4 4C CD 23 5E 35 3F 5C AF F7 D6 FB F4 ED 49 60
EF 00 00

Decode

00 85 1D 5E A2 B8 CE 44 CF E9 18 C4 51 5A 6D 13 92
B8 A0 B0 0E 5A 5C 68 70 BC B1 2D 6D 22 F8 ED 85 92
A5 4C 5D 24 EC 04 C9 85 BF B9 F9 4A 58 E9 A2 EB CC
0D 81 61 A5 52 3C AB 2B F6 39 E7 04 70 D6 84 39 D8
DC 77 D5 29 69 C6 BC 1F 8A 1F 4A 21 54 D2 3E 5D 0A
58 B1 12 24 AA CF 17 FA 86 BA E4 85 A7 61 CB 8D 04
39 FD 7E B9 5B C6 F1 E0 8E 45 B7 79 C9 7D E8 24 D3
B9 D1 78 0E 7C CD 28 E0 3D DD 77 9A 20 52 71 60 81
41 4D 52 43 D9 03 FF A1 10 00 AC BD 69 E0 1B 70 02
E8 0D D2 07 89 77 87 3A 73 12 D3 9B 68 BD BE 5E 61
23 7B 2D A3 B6 CC 6D 86 07 29 CB 2B AE 04 00 00

AntiXor

BA 00 00 85 1D 5E 6D 21 C6 00 00 3C 4A C9 C3 C2 0D
63 60 11 63 E7 BE D9 ED 8B ED 5D 06 77 E8 B0 A5 59
50 49 36 4F E4 A6 BC 73 8E B3 77 61 5B 1E 6C 1C DD
4B 6E DC 8D F6 81 C4 1B 8A D7 39 8B 63 1C D8 1A 88
14 3F 8B 35 7E 37 1F C2 8A C0 DE AD AB 63 A2 95 6F
AF 2E 0E 74 1C D2 2F B5 4C 87 18 E5 DD F6 5C 89 49
AF 7D 6E 3F AF 26 26 03 98 A6 49 50 EF 9D 07 34 59
E3 22 3A 94 5F 2E 7F F6 42 7A DD F3 86 45 A0 13 C4
51 40 86 4E 95 DD 29 FC 9C C3 77 20 B6 AD 97 F7 E0
BD 07 6F 59 AB F1 A5 99 57 A3 2B 97 85 21 08 5C B4
73 00 75 38 40 25 B1 E5 6D 86 07 29 CB 2B AE 04

RSA Key changed : 61 3C 4A C9 C3 C2 0D 63 60 11 63
E7 BE D9 ED 8B ED 5D 06 77 E8 B0 A5 59 50 49 36 4F
E4 A6 BC 73 8E B3 77 61 5B 1E 6C 1C DD 4B 6E DC 8D
F6 81 C4 1B 8A D7 39 8B 63 1C D8 1A 88 14 3F 8B 35
7E 37 1F C2 8A C0 DE AD AB 63 A2 95 6F AF 2E 0E 74
1C D2 2F B5 4C 87 18 E5 DD F6 5C 89 49 AF 7D 6E 3F
AF 26 26 03 98 A6 49 50 EF 9D 07 34 59 E3 22 3A 94
5F 2E 7F F6 42 7A DD F3 86 45 A0 13 C4 51 40

BlowFish key changed :
00 6F 59 AB F1 A5 99 57 A3 2B 97 85 21 08 5C B4

SendPkt :
2A 00 07 85 1D 5E 6D 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 6A 85 1D 5E 00 00
00 00 00 00 00 00 00 00 1C FC

что идёт после неё

//Запись в банк всеми символами их всего 42
Array.Copy(send_buff, 0, temp_buff, 0, Len);
//Декорируем
BlowFish.Encode(temp_buff,Len);
//И записываем где было со второго символа и без последних 2-х...

как в la2_client_emu
Array.Copy(temp_buff, 0, send_buff, 2, Len-2);

//В итоге получаем бред какото...
SEND PTK ENDEND :
2A 00 75 4A FA C4 BA B7 E4 D9 DA 8E BD 99 7A
09 C0 2A DA 8E BD 99 7A 09 C0 2A 04 C7 91 9B
62 11 E6 1A DA 8E BD 99 7A 09 C0 2A

Люди добрые че делать) :o

Добавлено через 4 минуты
Заметил одну такую хрень, что там добавляеться ещё 4 Символа, а по 4 символа ходят только в AddCheckSumme

Тоесть сам банк с данными приходит с этими уже байтами
вот они 1C FC 0C 00 BA 00 больше нету

public static byte[] AddCheckSumm(byte[] Data, int len) {
if(Data.Length < len + 4){
return null;
}

byte[] t = new byte[4];

int chksum = 0;
int ecx = 0;
//string ecx = ";
int i = 0;

while (i < len){
t[0] = Data[i];
t[1] = Data[i+1];
t[2] = Data[i+2];
t[3] = Data[i+3];
try {
Debug.Log("ACS " + BitConverter.ToString(t));
ecx = BitConverter.ToInt32(t,0) ;
chksum ^= ecx;
i += 4;
} catch (Exception ex) {
Debug.Log("Error " + ex.Message);
}
}



Array.Copy(BitConverter.GetBytes(chksum), 0, t, 0, 4);

//Возвращаем
Data[len+1] = t[0];
Data[len+2] = t[1];
Data[len+3] = t[2];
Data[len+4] = t[3];
return Data ;
}

Посмотрите функция правильная? мне только возвращается мои символы, до 40, а дальше пусто, этот код на C#

lamo386
31.12.2012, 19:16
SendPkt :
2A 00 07 85 1D 5E 6D 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 6A 85 1D 5E 00 00
00 00 00 00 00 00 00 00 1C FC
это я так полнимаю ты соснифал у клиента ?

что идёт после неё

//Запись в банк всеми символами их всего 42
Array.Copy(send_buff, 0, temp_buff, 0, Len);
//Декорируем
BlowFish.Encode(temp_buff,Len);
//И записываем где было со второго символа и без последних 2-х...
первые 2 байта это размер пакета они не шифруются именно поэтому Array.Copy(temp_buff, 0, send_buff, 2, Len-2); //пропускаем 2 байта и длинну уменьшаем -2
БФ он блочный поэтому если шифровать "не с того" символа получится не то что надо...

zAvaTARz
31.12.2012, 20:51
это я так полнимаю ты соснифал у клиента ?

первые 2 байта это размер пакета они не шифруются именно поэтому Array.Copy(temp_buff, 0, send_buff, 2, Len-2); //пропускаем 2 байта и длинну уменьшаем -2
БФ он блочный поэтому если шифровать "не с того" символа получится не то что надо...

И весь остальной код, неправельный это из за того что последних 2 символа не те?

Добавлено через 6 минут
так в том то и дело что те символы я отправляю

Добавлено через 17 минут
В чем вопрос откуда берутся этих 2 последних символа?

И откуда их брать мне, потому что сейчас тут уже B8 00

lamo386
31.12.2012, 21:46
SendPkt :
2A 00 07 85 1D 5E 6D 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 6A 85 1D 5E 00 00
00 00 00 00 00 00 00 00 1C FC


этот пакет ты взял из Пх ? так вот это расшифрованный пакет.

из сылки которую постил ты же
RequestGGAuth

Формат:
22 00 // Длина
07 // Тип
XX XX XX XX // ID сессии
23 92 90 4d
18 30 b5 7c
96 61 41 47
05 07 96 fb
00 00 00
f2 12 ba a9 // чексумма
00 00 00 00

если по русски то пакет(42байта) состоит из 2 байта размер, 36 байт дата (1 байт ид пакета, 4 байта сесион ид, 3 по 4 байта это для ГГ, 4 байта ноль), 4байта чек сумма.
сначало собирается пакет потом этот пакет без размера (помни длинна пакета -2) отдается блоуфишу.

zAvaTARz
31.12.2012, 22:34
этот пакет ты взял из Пх ? так вот это расшифрованный пакет.

из сылки которую постил ты же


если по русски то пакет(42байта) состоит из 2 байта размер, 36 байт дата (1 байт ид пакета, 4 байта сесион ид, 3 по 4 байта это для ГГ, 4 байта ноль), 4байта чек сумма.
сначало собирается пакет потом этот пакет без размера (помни длинна пакета -2) отдается блоуфишу.

Этот пакет который должен быть , а это пакет который я собрал

2A 00 07 85 1D 5E 6D 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 6A 85 1D 5E 00 00
00 00 00 00 00 00 00 00 00 00

вся проблема в том что я не знаю где брать последние 2 байта у меня 00 00 а должно быть 1C FC но оно почему то постоянно меняется, я не знаю почему, и откуда брать эти 2 последних байта...

Ты меня не совсем понимаешь) я делаю перевожу с la2_client_emu (Исходник авторизации на Delphi) вся проблема в том что там откуда не возьмись берутся нужные байты...

Во вторых я посылаю на функцию Encode

Вот скрипт функции

public static byte[] Encode(byte[] data, int _len)
{
int i, len;
byte[] DBuff = new byte[8];

len = _len ;

for (i = 0; i < len / 8; i++)
{
Array.Copy(data, i * 8, DBuff, 0, 8);
DBuff = EncodeBlock(DBuff);

//Debug.Log("Encode : " + BitConverter.ToString(DBuff).Replace("-"," ")) ;

Array.Copy(DBuff, 0, data, i * 8, 8);
}

return data;
}

private static byte[] EncodeBlock(byte[] __data)
{
long xrd, xld;

xld = BitConverter.ToInt32(__data, 0);
xrd = BitConverter.ToInt32(__data, 4);

//Debug.Log("xld "+BitConverter.ToString(BitConverter.GetBytes(xld)) + " xrd" + BitConverter.ToString(BitConverter.GetBytes(xrd))) ;

Blowfish_encipher(ref xld, ref xrd);

Array.Copy(BitConverter.GetBytes((Int32)xld), 0, __data, 0, 4);
Array.Copy(BitConverter.GetBytes((Int32)xrd), 0, __data, 4, 4);


return __data;
}

public static void Blowfish_encipher(ref long xl, ref long xr)
{
long xl2, xr2;

xl2 = xl;
xr2 = xr;
xl2 = (xl2 ^ PArray[0]);

RoundMy(ref xr2, ref xl2, 1); RoundMy(ref xl2, ref xr2, 2);
RoundMy(ref xr2, ref xl2, 3); RoundMy(ref xl2, ref xr2, 4);
RoundMy(ref xr2, ref xl2, 5); RoundMy(ref xl2, ref xr2, 6);
RoundMy(ref xr2, ref xl2, 7); RoundMy(ref xl2, ref xr2, 8);
RoundMy(ref xr2, ref xl2, 9); RoundMy(ref xl2, ref xr2, 10);
RoundMy(ref xr2, ref xl2, 11); RoundMy(ref xl2, ref xr2, 12);
RoundMy(ref xr2, ref xl2, 13); RoundMy(ref xl2, ref xr2, 14);
RoundMy(ref xr2, ref xl2, 15); RoundMy(ref xl2, ref xr2, 16);

xr2 = (xr2 ^ PArray[17]);
xr = xl2;
xl = xr2;
}

Вот какое данные отправляю туда данные

1 - й этой мой пакетик готовый

Не трогаем - 2A 00

0x0000| 2A 00 07 93 55 3A 08 00 00 00 00 00 00 00 00 00
0x0010| 00 00 00 00 00 00 00 00 00 00 0F 93 55 3A 00 00
0x0020| 00 00 00 00 00 00 00 00 00 00

что делается дальше

Функция
Move(buff[0],send_buff[2],Len-2);

Как видно что уже на конце опять же B8 00 откуда оно вылезло

07 93 это размер он дается в начале...

Client MSG, Length: 42 (0x2A)
-------------------------------------------------------
0x0000| 07 93 55 3A 08 00 00 00 00 00 00 00 00 00 00 00
0x0010| 00 00 00 00 00 00 00 00 0F 93 55 3A 00 00 00 00
0x0020| 00 00 00 00 00 00 00 00 B8 00

и вот это уже отправляется на расшифрацию.

Ведь это все правильно да?

Далее посылаю в блоуфиш, функцию которую я описал ввыше

Вот ответ

с функцией Move(temp_buff[0],send_buff[2],Len-2);

2A 00 85 DE 5B 3B 36 8F FF EA 1A 02 A4 D3 50 64 C8 50 1A 02 A4 D3 50 64 C8 50 DB 7F 8C 39 34 3D 06 12 1A 02 A4 D3 50 64 C8 50

Он вообще не соответствует тому что я записываю, и вывожу через la2_client_emu

Может быть я ошибаюсь и этот пакет верный я не знаю, но вот я показал что отправляется и что я получаю...

Вся проблема в 2-х последних байтах и наверно не правильном ответе, при дешировке Блоуфиша Encode

Надеюсь я понятно описал))

Добавлено через 7 минут
Сори вот ещё забыл, вот какой должен быть правильный ответ

тут тоже использовалась функция
Move(temp_buff[0],send_buff[2],Len-2);

Но это не сильно важно, даже если и использовать её, много не измениться...


0x0000| 07 93 9B 70 C3 4F B1 0B FC 51 68 D0 7E 60 DA E2
0x0010| 6F B6 68 D0 7E 60 DA E2 6F B6 2D 29 A9 9F 3F A2
0x0020| A9 31 68 D0 7E 60 DA E2 6F B6

SeregaZ
01.01.2013, 01:11
мож я чот не понял, но так он ж написал - чек сумма :) размер и чек сумма это несколько разные вещи. размер - по сути длинна, а чек сумма это что-то типа срс у файла. она нужна на случай повреждения информации. типа пакет пришел, размер совпадает те-же 5 символов к примеру, но к примеру четвертый символ пришел не верный - пришла двойка вместо тройки из-за глюка где-то в сети. вот чек сумма и должна этот момент проверить, типа на случай если пакет битый - то попросить прислать этот пакет еще раз.

zAvaTARz
01.01.2013, 01:22
Может это из-за инцилизации неверной?

Вот скрипт

//Стартовый ключ инцилизации
bf_key = HexToStr("6B60CB5B82CE90B1CC2B6C556C6C6C6C");
//Инцилизируем ключ
BlowFish.Init(bf_key) ;

//Хекс преобразуем в байты, а байты это строки
public string HexToStr (string s) {
int i;

result = "" ;

Debug.Log("hex " + s + " " + s.Length) ;

//for i:=1 to (Length(s) div 2) do begin
for (i=0; i < (s.Length/2); i++) {
//Преобразуем символы
result = result + Convert.ToChar(Convert.ToInt32("" + s[i*2] + s[(i*2)+1],16)) ;
}

//Debug.Log("MyFunc : " + result);
i = 0 ;
return result;

}

public static void Init(string Key1)
{
long i, j;
long data, datal, datar;
long Size;
byte[] Key = new byte[Key1.Length];

//Key = BitConverter.GetBytes(Key1);//(byte[])Funcs.DeepClone(Key1);

//for i:=0 to Size-1 do key[i]:=Ord(key1[i+1]);

Size = Key1.Length;

for (int _i = 0; _i < Size; _i++)
{
Key[_i] = Convert.ToByte(Key1[_i]) ;
}

for (i = 0; i < 18; i++)
PArray[i] = BlowFishConsts.bf_P[i];

for (i = 0; i < 4; i++)
{
for (j = 0; j < 256; j++)
{
SBoxes[i, j] = BlowFishConsts.bf_S[i, j];
}
}

j = 0;
for (i = 0; i < 18; i++)
{
data = ((Key[j] & 0xFF) << 24) | ((Key[(j+1) % Size] & 0xFF) << 16) | ((Key[(j+2) % Size] & 0xFF) << 8) | (Key[(j+3) % Size] & 0xFF);
PArray[i] = PArray[i] ^ data;
j = (j + 4) % Size;
}

datal = 0;
datar = 0;
for (i = 0; i < 9; i++)
{
Blowfish_encipher(ref datal, ref datar);
PArray[i*2] = datal;
PArray[i*2 + 1] = datar;
}

for (i = 0; i < 4; i++)
for (j = 0; j < 128; j++)
{
Blowfish_encipher(ref datal, ref datar);
SBoxes[i, j*2] = datal;
SBoxes[i, j*2 + 1] = datar;
}


}

Не знаю что может такое и быть, не знал что с конечной шифрайцией будут такие проблемы...

Пакет верный, почему не шифрует так как надо, есть у кого скрипты на C#?

lamo386
01.01.2013, 02:07
ни яву ни с шарп не знаю =) разбиратся сейчас лень, но пакет 36 байт дата + 4 байта чек сумма первые 2 байта 2A 00 и не как иначе

alexteam
01.01.2013, 13:50
07 93 это размер он дается в начале...

Client MSG, Length: 42 (0x2A)
эээ...

zAvaTARz
01.01.2013, 16:45
эээ...

Сори не так описал...

2A 00 07 7B D1 70 78 00 00
00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 7F 7B D1 70 00
00 00 00 00 00 00 00 00 00 00 00

2A 00 - Это до

Вот этот пакет, а вот этот я отправляю на Encode

07 7B D1 70 78 00 00 00 00
00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 7F 7B D1
70 00 00 00 00 00 00 00 00
00 00 00 00 00 00

Добавлено через 1 час 51 минуту
Да нашёл, скорее всего проблема с инцилизацией, 2-й

,bf_key[1],16);
bf.Init(bf_key);

не знаю как получить ключ, можно пример ключа в Строчке (string)

Какие данные туда отправлять? У меня такой пакет

58 62 97 00 08 64 97 00 57 17 E5 3B 00 00 00 00

57 17 E5 3B - Ид сессии

Вот мой пакет, то что стоит до этого я не знаю что это, что я делаю дальше, перевожу 16 байтов в Строчку выходит

58629700086497005717E53B00000000

этот код перевожу через функцию HexToStr

и вот с этими данными я пихаю в BlowFish.Init(bf_key) ;, этот код правельный? или я не так вообще делаю

Просто у меня со старта вот такая инцилизация

//Стартовый ключ инцилизации
bf_key = HexToStr("6B60CB5B82CE90B1CC2B6C556C6C6C6C");
//Инцилизируем ключ
BlowFish.Init(bf_key) ;

И она правельная

zAvaTARz
02.01.2013, 18:49
Фу блин вроде разобрался, теперь посылаю на сервер, а сервер вроде молчит, не отключается нечего тупо молчит...

Вот байты которые пришли в самом начале
New packed bytes 186
BA 00 00 B9 36 36 31 21
C6 00 00 36 B4 AB E8 12
A4 99 0F 3A 94 52 65 93
E7 56 85 DD E7 2A C8 36
5A AF D3 3D 8C DE 4D 0E
19 A6 D7 B2 7D 0A F2 E8
13 2C 55 BD 49 52 88 9C
E2 86 C0 29 28 82 F2 CF
A8 FA 4C 37 DA 5D 83 B1
9D 78 47 38 CC F0 40 F9
37 38 7D 58 3A C7 AE C9
73 E0 C2 90 5B 71 82 E4
C7 9F E6 F0 99 67 EE 50
35 33 63 D5 88 70 21 1C
3D 13 F2 E9 28 B5 80 E8
E9 6C 91 ED 25 6D 17 57
12 50 82 3C 0B 44 C4 86
30 09 6E 4E 95 DD 29 FC
9C C3 77 20 B6 AD 97 F7
E0 BD 07 82 CE 9C D8 FC
A1 AA CD 33 C3 F2 35 0C
D2 A2 E8 00 D6 AB F6 14
E2 85 4F 8D 54 2F 2E EB
58 67


А это байты которые я отправляю

Send server bytes, All bytes 42

07 B9 87 FC 56 46 8C 7E
23 70 18 AE 83 8E 5E 22
7F 17 18 AE 83 8E 5E 22
7F 17 28 2E 1F B4 E3 46
CD 73 18 AE 83 8E 5E 22
7F 17

Проверьте пожалста, у себя в декодерах, верно ли я расшифровал мб из за этого...

Или кто может просто проверьте первые байты, потом выложите , а я походу сравню все свои и ваши байты...

Добавлено через 4 минуты
public void SendData ( byte[] write_data, int len ) {

//client.GetStream().Write(data,0,1) ;
//writer = new StreamWriter(client.GetStream());
client.GetStream().Write(write_data,0,len);
client.GetStream().Flush();

}

Да вот ещё команда которой я посылаю байты она на C#

PornoTraktor
16.01.2013, 14:57
Почитал, улыбнуло. :D Если такой адепт C#, то мб начать с просмотра исходников l2.net(л2 бот на C#)?

Eloy
30.01.2013, 15:04
думаю что при написании бота для Л2 вы подошли не с того конца. По мимо сетевых технологий, можно использовать метод иньекций их как минимум 3 нужно только понять принцип зашиты.

Deadly
19.02.2013, 19:58
посмотрел начальный код улыбнуло, забудь про стандартные средства, начинай сразу с сокетов асинхронных, я бы рекомендовал SocketAsyncEventArgs() использовать для них на мой взгляд это самый лучший вариант(да и быстрый) , по поводу хуков... забей используй проксификатор и сокс5 протакол там всего 3 пакета надо в загаловке написать.

Sinn3r
20.02.2013, 07:15
Ну раз тема о шарпе, то и я вопрос задам.
В общем попробовал хукнуть AddNetworkQueue push'ем, хук ставится, отрабатывает и умирает с General protection fault'ом при попытке вызвать оригинальную функцию

Brave
20.02.2013, 15:56
Ну раз тема о шарпе, то и я вопрос задам.
В общем попробовал хукнуть AddNetworkQueue push'ем, хук ставится, отрабатывает и умирает с General protection fault'ом при попытке вызвать оригинальную функцию
Забей на хуки. Используй проксификацию SOCKS 4/5. Всего то нужно написать сервер SOCKS, пропустить трафик через свой собственный сервер.
На собственном сервере, делай всё что хочешь с трафиком. Расшифровывай, подсовывай, отправляй, принимай, изменяй. Сервер можно поставить хоть на другой машине, его ни одна защита не найдет, даже Ереванский Frost.

Протокол SOCKS 5 [RFC1928] (http://www.codenet.ru/webmast/socks51.php)

Zergatul
20.02.2013, 15:58
Ага, расшифровывать трафик потом очень просто.

Brave
20.02.2013, 18:02
Вот в картинке нарисовал.
По синему проводу идет трафик от Сервера->Клиенту
По красному от Клиента->Серверу
По жёлтому ваше творчество.

Мне вот интересно. Если делать отправку только по жёлтому проводу, а клиент игры будет получать только результаты по синему, все ли в порядке будет с клиентом? Не кританёт от того что он получил пакет инвентаря без запроса? Мне кажется что ничего не случится, клиент это же по сути марионетка а сервер кукловод.

Zergatul
20.02.2013, 18:24
Мне вот интересно. Если делать отправку только по жёлтому проводу, а клиент игры будет получать только результаты по синему, все ли в порядке будет с клиентом? Не кританёт от того что он получил пакет инвентаря без запроса? Мне кажется что ничего не случится, клиент это же по сути марионетка а сервер кукловод.
Не кританет

Sinn3r
20.02.2013, 20:59
Brave, пардон, у меня для таких целей как раз почти написан асинхронный сокс прокси, но я отказался от этой затеи именно из за шифрации, неужели расшифровать трафик на столько легко?

Brave
20.02.2013, 21:17
Brave, пардон, у меня для таких целей как раз почти написан асинхронный сокс прокси, но я отказался от этой затеи именно из за шифрации, неужели расшифровать трафик на столько легко?
Шифрацией как раз сейчас сам занимаюсь. Только для AION. BlowFish,XOR,RSA являются открытыми алгоритмами шифрации. Примеров масса. Сейчас систематизирую.

Sinn3r
20.02.2013, 21:38
Brave, с шифрацией особо не разбирался но на сколько я знаю расшифровать RSA не зная приватного ключа практически нереально, что в принципе не особо важно ибо нужен только при авторизации. Что насчет фришек, как обстоят дела с ними? И самый главный вопрос, какие ограничения накладывает клиент, каким образом он определяет как зашифрован пакет?

Brave
20.02.2013, 22:03
Что насчет фришек, как обстоят дела с ними? Смотри исходники Java серверов. Для тестов и ковыряния, я ставлю себе какой нибудь free сервер.
Самый главный вопрос, какие ограничения накладывает клиент, каким образом он определяет как зашифрован пакет? Это определяется версией протокола. О каких либо надстройках над протоколом клиента я не знаю. Может кто подскажет? Я что то не встечал защит, которые бы дополнительно шифровали сетевой поток игры. То есть защищали его от перехвата на прокси. Имеются только некоторые доработки пакетов.

Zergatul
21.02.2013, 02:10
Все нормальные люди уже отказались от шифроебства. Мельчайшие изменения шифрования, и знание
BlowFish,XOR,RSA являются открытыми алгоритмами шифрации. XOR-а тут не поможет :D

Brave
21.02.2013, 10:53
Все нормальные люди уже отказались от шифроебства. Мельчайшие изменения шифрования, и знание
XOR-а тут не поможет :D

Все нормальные люди хукают?
А как же тогда прятаться от руткита Frost? Который молча шуршит по папкам , памяти,ищет ботов, следит за игроком используя веб камеру, и палит, действительно ли человек сидит за компьютером :D

lamo386
22.02.2013, 00:16
О каких либо надстройках над протоколом клиента я не знаю. Может кто подскажет? Я что то не встечал защит, которые бы дополнительно шифровали сетевой поток игры. То есть защищали его от перехвата на прокси. Имеются только некоторые доработки пакетов.
забавно это читать...
допустим фрост заменяет стандартные функцию клиента сендпакет/реквпакет накладывая на трафик доп шифрацию.
так что твой прокси тебе поможет только с "локальным" сервером =)

Brave
22.02.2013, 19:45
забавно это читать...
допустим фрост заменяет стандартные функцию клиента сендпакет/реквпакет накладывая на трафик доп шифрацию.
так что твой прокси тебе поможет только с "локальным" сервером =)

Вот я нуб. Точно. Это же тоже возможно. Тогда согласен с тем, что лучше хукать и прятатся от фроста.

Frost - незаконный руткит!Перекрывает кислород пытливым умам.

Deadly
23.02.2013, 00:42
Нашел у себя в захромах этот код можно использовать как пример) это к слову как расклеивать пакеты на сервере работает с линейкой прекрасно хоть и написан криво(писался давно)) показывает размер пакета и сам пакет(не дешефруя) можете посмотреть как текут пакеты на руофе ну и 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)

Sinn3r
23.02.2013, 06:17
работает с линейкой прекрасно хоть и написан криво(писался давно)
Ну не совсем прекрасно, при попытке подключится к гейм серверу он перестает работать, ибо Accept для нового подключения не вызывается.

Вот мой вариант, правда никак руки не доходят пробросить делегаты для редактирования пакетов
class SocksProxy
{
public int Port;

public SocksProxy(int port)
{
this.Port = port;
}

public void Listen()
{
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Any, Port));
listener.Listen(100);
listener.BeginAccept(listener_Accept, listener);
}

private void listener_Accept(IAsyncResult ar)
{
string remoteIP = string.Empty;
int remotePort = 0;
byte[] buffer = new byte[2048];
Socket temp = (Socket)ar.AsyncState;
temp.BeginAccept(listener_Accept, temp);

Socket _in = temp.EndAccept(ar);
Socket _out = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

_in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (buffer[0] == 5 && buffer[1] == 1 && buffer[2] == 0)
{
buffer[1] = 0;
_in.Send(buffer, 0, 2, SocketFlags.None);
_in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (buffer[3] == 1)
{
remoteIP = buffer[4] + "." + buffer[5] + "." + buffer[6] + "." + buffer[7];
remotePort = buffer[8]*256 + buffer[9];


Console.WriteLine("Socket connected to " + remoteIP + ":" + remotePort);
}
buffer[1] = 0;
_in.Send(buffer, 0, 10, SocketFlags.None);
}
_out.Connect(new IPEndPoint(IPAddress.Parse(remoteIP), remotePort)); // подключаемся к серверу ла2
NetworkState state = new NetworkState(_in, _out, buffer);
_out.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, out_Receive, state);
_in.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, in_Receive, state);
}

private void in_Receive(IAsyncResult ar) //получили пакет от клиента
{
NetworkState state = (NetworkState)ar.AsyncState;
int received = state.In.EndReceive(ar);

if (received > 0)
{
Console.WriteLine("{0} -> {1}", state.In.RemoteEndPoint, state.Out.RemoteEndPoint);
Console.WriteLine(Utils.HexDump(state.Buffer, received));
state.Out.Send(state.Buffer, 0, received, SocketFlags.None); // отправили серверу
state.In.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, in_Receive,
new NetworkState(state.In, state.Out, state.Buffer));
}
else
{
state.In.Shutdown(SocketShutdown.Both);
Console.WriteLine("{0} отключен", state.In.RemoteEndPoint);
}
}

private void out_Receive(IAsyncResult ar) //получили пакет от сервера
{
NetworkState state = (NetworkState)ar.AsyncState;
int received = state.Out.EndReceive(ar);

if (received > 0)
{
Console.WriteLine("{0} -> {1}", state.Out.RemoteEndPoint, state.In.RemoteEndPoint);
Console.WriteLine(Utils.HexDump(state.Buffer, received));
state.In.Send(state.Buffer, 0, received, SocketFlags.None); // отправили проксификатору
state.Out.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, out_Receive,
new NetworkState(state.In, state.Out, state.Buffer));
}
else
{
state.Out.Shutdown(SocketShutdown.Both);
Console.WriteLine("{0} отключен", state.Out.RemoteEndPoint);
}
}
}

class NetworkState
{
public byte[] Buffer;
public Socket In;
public Socket Out;
public NetworkState(Socket sin, Socket sout,byte[] buff)
{
this.Buffer = buff;
this.In = sin;
this.Out = sout;

}
}
http://i.zhyk.ru/images/ulme9.png

Deadly
23.02.2013, 11:35
Ради интереса попробовал тоже на интерлюди у меня все работает
Зы если это серва с защитой( типо дефо) то там и не будет работать точнее дальше выбора чара вы не пройдете и с пх, тк при нажатие на кнопку принять(выбора чара) идет не форматированный трафик, а то что я скинул он берет 2 байта первых щитает размер и дальше считывает тело пакета, впринципе можно добавить на такой трафик проверку (допустим если выходи за граници 1000)это не сложно, либо поменять буфер на 100000 скажем)))
http://s017.radikal.ru/i432/1302/bb/76ea85529dc2.jpg

http://i078.radikal.ru/1302/2f/85db87fa95f7.jpg

http://s48.radikal.ru/i119/1302/1b/dbca1325db0c.jpg

Добавлено через 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 прекрасный момент пакеты "склеятся" и ты не сможешь найти где начало где конец

Sinn3r
23.02.2013, 12:59
Сервер на котором я проверял хукает ws2_32.send и сам коннектится к логин серверу, а коннект к гейм серверу отдает клиенту.
Выходит 2 разных подключения, следовательно должно быть 2 пары сокетов, на логин и гейм серверы.

Brave
23.02.2013, 13:03
Выходит 2 разных подключения, следовательно должно быть 2 пары сокетов, на логин и гейм серверы.
Так всегда же 2 разных подключения.

Sinn3r
23.02.2013, 13:38
Brave, тогда как у него работает если ssockclient.Accept() вызывается только 1 раз?
Мой вариант понятно как работает, там ацепт вызывает себя же, но у Дедли все в одном потоке и при этом работает

Deadly
23.02.2013, 15:50
1 писать приложение подобного типа не через поток ввода вывода - бред.
2 в кратце прога работает так:
1 - ждет подключения от клиента
2- получает подключение от клиента и выводит его в отдельный сокет "ss
3- создает удаленный сокет для работы с удаленным узлом "outsoc"
4- создает для них базовые потоки ввода вывода "networkstream"
dataavaible проверяет есть ли в потоке что прочесть, если есть читает первые 2 байта щитает длинну пакета и читает сам пакет

нужно понимать что поток ввода вывода все время "на приеме" и все пакеты в нем склеившиеся

Добавлено через 4 минуты
Socket ss = ssockclient.Accept();

Метод Accept синхронно извлекает первый ожидающий запрос из очереди запросов на подключение у прослушивающего сокета, а затем создает и возвращает новый объект Socket.Этот возвращенный объект Socket нельзя использовать для приема каких-либо дополнительных подключений из очереди на подключение.Однако можно вызвать метод RemoteEndPoint возвращенного объекта Socket, чтобы идентифицировать сетевой адрес и номер порта удаленного узла.

Sinn3r
23.02.2013, 16:56
я в курсе, что делает Socket.Accept и я знаю что в данной ситуации он должен вызываться 2 раза, первый раз при подключении к логин серверу, а второй раз при подключении к гейм серверу.
А теперь расскажи, как ты поднимаешь 2 соединения на одном сокете?