Программинг Форум для тем связанных с программированием
19.11.2014, 17:09
#11
Новичок
Регистрация: 12.11.2014
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
Люди помогите!!!
(( никак не получается с этим пакетом Init... Вроде бы всё верно делаю, но клиент Interlude никак не реагирует на такой пакет... А Ertheia вообще критует..
PHP код:
static void XorInitPacket ( unsigned char * raw , int size , int key ) { int i = 0 ; int key2 = key ; for( i = 6 ; i < size - 4 ; i += 4 ) { int temp = (*( raw + i + 3 ) << 24 ) & 0xFF000000 | (*( raw + i + 2 ) << 16 ) & 0xFF0000 | (*( raw + i + 1 ) << 8 ) & 0xFF00 | *( raw + i ) & 0xFF ; key2 += temp ; int temp2 = key2 ^ temp ; raw [ i ] = temp2 & 0xFF ; raw [ i + 1 ] = temp2 >> 8 & 0xFF ; raw [ i + 2 ] = temp2 >> 16 & 0xFF ; raw [ i + 3 ] = temp2 >> 24 & 0xFF ; } raw [ i ] = key2 & 0xFF ; raw [ i + 1 ] = key2 >> 8 & 0xFF ; raw [ i + 2 ] = key2 >> 16 & 0xFF ; raw [ i + 3 ] = key2 >> 24 & 0xFF ; }; void CUserSocket :: OnCreate () { m_pAuthUser = new CAuthUser ; m_pAuthUser -> Init (); srand ( time ( NULL )); *( int *)( m_bwKey ) = rand (); *( int *)( m_bwKey + 4 ) = rand (); *( int *)( m_bwKey + 8 ) = rand (); *( int *)( m_bwKey + 0xc ) = rand (); m_pCrypt = new CBlowFish ( g_bfStaticKey , sizeof ( g_bfStaticKey )); CIOBuffer * pBuffer = CIOBuffer :: Alloc (); int nLen = Assemble ( pBuffer -> m_Buffer + 2 , IOBUFFER_SIZE , "cddbddddbc" , 0 , 1234567 , // Session ID 0x0000c621 , // protocol version sizeof ( m_pAuthUser -> m_RSA ), & m_pAuthUser -> m_RSA , // public key 0x29DD954E , 0x77C39CFC , 0x97ADB620 , 0x07BDE0F7 , sizeof ( m_bwKey ), m_bwKey , // new BlowFish Key 0 ); nLen += 8 ; // xor key nLen = ( nLen + 7 ) & 0xfffffff8 ; // aligment for blowfish XorInitPacket ( pBuffer -> m_Buffer , nLen , rand ()); m_pCrypt -> Encrypt ( pBuffer -> m_Buffer + 2 , nLen ); // blowfish encrypt nLen += 2 ; // packet total size Read ( 0 ); // WSARead() IOCP early call *( short *)( pBuffer -> m_Buffer ) = nLen ; // set first bytes to length of packet pBuffer -> m_dwSize = nLen // for WSASend Write ( pBuffer ); // Write! delete m_pCrypt ; // change blowfish key m_pCrypt = new CBlowFish ( m_bwKey , sizeof ( m_bwKey )); }
Улетает клиенту вот такое
Код:
00000000: ba 00 e7 22 01 4f 2b 42 68 b1 b9 06 e8 a2 ac a4
00000010: 17 97 94 2f 4b da 02 02 36 bb 65 02 33 77 fb b4
00000020: c7 64 23 cf eb b1 c2 fb 97 11 d3 85 19 1e 42 5e
00000030: 46 f8 fc aa 4f 34 eb cc 39 b0 02 98 fd e0 21 9d
00000040: dc 5c d3 dd e3 b5 4d fa 38 46 6f 02 d4 4c 9d ce
00000050: e8 46 9b 88 1b 01 4f cc 69 52 7d ae b5 5e e1 92
00000060: 3a 6e 92 43 7a c3 82 17 06 2e d2 27 53 1c 25 98
00000070: 53 ca 27 56 60 e3 9f 14 f6 54 9f bf 9f 48 c8 ed
00000080: d8 28 e9 93 96 d3 16 7a c9 81 b4 52 c2 d9 8b dd
00000090: 42 3f 59 cf 1a 11 a3 fa 0c 9b 46 94 e3 0f 91 fb
000000a0: a7 9f 0a f0 42 ec f2 07 66 ae 86 10 6d 62 cf 12
000000b0: 01 3b e2 0b ec 99 3d 8b 23 b0
оно же до ксора и шифрования (но с ксор ключом в конце пакета)
Код:
00000000: ba 00 00 87 d6 12 00 21 c6 00 00 6e 12 32 ab a3
00000010: 1a ee 4c eb 97 09 25 f8 e5 25 ad db d7 80 e1 20
00000020: 4c 72 d7 1d b4 fb fb c0 7e e9 3d d0 b8 87 3f b1
00000030: 1c fe ad 5d 17 08 2c 18 9b 26 ec 61 6e 32 95 73
00000040: 95 7e 37 3d 03 d4 14 be 43 b8 92 3b b2 d1 76 e3
00000050: a3 0e 87 7d a5 ee ed 69 56 59 57 5f ee c6 17 35
00000060: 81 10 f7 43 74 32 03 c4 46 c9 e3 a5 d6 29 a6 a6
00000070: a5 3d c8 e6 af dc 35 19 43 21 0a 2e d8 12 a7 6c
00000080: 11 d1 a5 ab b1 d6 85 44 72 fb 93 4e 95 dd 29 fc
00000090: 9c c3 77 20 b6 ad 97 f7 e0 bd 07 27 1d 6e 6e e0
000000a0: 09 a9 14 24 7c a1 10 0f 0b 06 6a 00 cc cc cc cc
000000b0: cc cc cc cc cc cc d2 ab 71 63
что у меня может быть не так? Нигде не могу найти точного примера ксора инит пакета
Последний раз редактировалось r00tk1d, 19.11.2014 в 17:30 .
23.11.2014, 04:51
#12
Местный
Регистрация: 04.11.2009
Адрес: Где-то в жопе европы
Сообщений: 316
Сказал Спасибо: 32
Имеет 42 спасибок в 39 сообщенях
void scrambleMod( char *n )
{
typedef unsigned char byte;
int i;
for( i=0; i<4; i++ ) {
byte temp = n[0x00 + i];
n[0x00 + i] = n[0x4d + i];
n[0x4d + i] = temp;
};
// step 2 xor first 0x40 bytes with last 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[i] = (byte)(n[i] ^ n[0x40 + i]);
};
// step 3 xor bytes 0x0d-0x10 with bytes 0x34-0x38
for( i=0; i<4; i++ ) {
n[0x0d + i] = (byte)(n[0x0d + i] ^ n[0x34 + i]);
};
// step 4 xor last 0x40 bytes with first 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[0x40 + i] = (byte)(n[0x40 + i] ^ n[i]);
};
};
Не ужели так трудно?
24.11.2014, 15:52
#13
Новичок
Регистрация: 12.11.2014
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
Шутка в том, что не трудно. в начале функци CUserSocket::OnCreate
PHP код:
m_pAuthUser = new CAuthUser ;
m_pAuthUser -> Init ();
где
PHP код:
R_RANDOM_STRUCT * CAuthUser :: InitRandomStruct ( void )
{
static unsigned char seedByte = 0 ;
unsigned int bytesNeeded ;
static R_RANDOM_STRUCT randomStruct ;
R_RandomInit (& randomStruct );
srand (( unsigned ) time ( NULL ));
while ( 1 ) {
seedByte = rand ();
R_GetRandomBytesNeeded (& bytesNeeded , & randomStruct );
if( bytesNeeded == 0 )
break;
R_RandomUpdate (& randomStruct , & seedByte , 1 );
}
return(& randomStruct );
}
void CAuthUser :: scrambleModulus ()
{
unsigned char * scrambledMod = m_RSA , temp ;
memcpy ( m_RSA , m_rsaPubKey . modulus , 0x80 );
// step 1 : 0x4d-0x50 <-> 0x00-0x04
for ( int i = 0 ; i < 4 ; i ++)
{
temp = scrambledMod [ 0x00 + i ];
scrambledMod [ 0x00 + i ] = scrambledMod [ 0x4d + i ];
scrambledMod [ 0x4d + i ] = temp ;
}
// step 2 : xor first 0x40 bytes with last 0x40 bytes
for ( int i = 0 ; i < 0x40 ; i ++)
{
scrambledMod [ i ] = ( scrambledMod [ i ] ^ scrambledMod [ 0x40 + i ]);
}
// step 3 : xor bytes 0x0d-0x10 with bytes 0x34-0x38
for ( int i = 0 ; i < 4 ; i ++)
{
scrambledMod [ 0x0d + i ] = ( scrambledMod [ 0x0d + i ] ^ scrambledMod [ 0x34 + i ]);
}
// step 4 : xor last 0x40 bytes with first 0x40 bytes
for ( int i = 0 ; i < 0x40 ; i ++)
{
scrambledMod [ 0x40 + i ] = ( scrambledMod [ 0x40 + i ] ^ scrambledMod [ i ]);
}
}
void CAuthUser :: Init ()
{
R_RANDOM_STRUCT * randomStruct ;
R_RSA_PROTO_KEY protoKey ;
randomStruct = InitRandomStruct ();
protoKey . bits = 1024 ;
protoKey . useFermat4 = 1 ;
if( R_GeneratePEMKeys (& m_rsaPubKey , & m_rsaPrivKey , & protoKey , randomStruct )) {
MessageBox ( NULL , L "ERROR" , L "Error" , MB_OK || MB_ICONSTOP );
return;
}
scrambleModulus ();
}
24.11.2014, 17:48
#14
Новичок
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
Если кто-нибудь "из старших товарищей" заглядывает сюда, то может поделится чейндж-логом, как меняется протокол от хроник к хроникам ? Я хочу сделать мульти хронико-троно-протокольный Android L2Chat ) и данная информация была бы очень полезна.
31.12.2014, 11:47
#15
Новичок
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
Я не могу разобраться с асинхронными сокетами, прошу посильной помощи от вас.
Задача следующая :
1. Есть некий сервер (но мы то знаем.. что это L2), который после подключения клиента может в любой момент прислать данные, и клииент должен успеть их принять.
2. Если пришедший пакет требует ответа, то ответить не медля.
3. В случае некоторого евента ( например нажатия кнопки ) отправляем пакет.
Я позолил себе набросать небольшую схему, как я это вижу.
Архитектура приложения с асинхронными сокетами
Receive - в цикле, Send - c кнопки и\или ответом. Чего не хватает ?
Чего я не понимаю:
1) как определить что в сокет пришли данные ?
2) можно ли не гонять цикл, а ждать некоторого interrupt , который оповестит о готовности некоторого обьема данных ?
3) ???
Очень надеюсь на вашу помощь. С наступающим новым годом и рождеством !!
Последний раз редактировалось i_am_kisly, 31.12.2014 в 14:44 .
Причина: исправил картинко
01.01.2015, 05:37
#16
Пользователь
Регистрация: 11.02.2009
Сообщений: 95
Сказал Спасибо: 36
Имеет 6 спасибок в 6 сообщенях
Цитата:
Сообщение от
i_am_kisly
Если кто-нибудь "из старших товарищей" заглядывает сюда, то может поделится чейндж-логом, как меняется протокол от хроник к хроникам ? Я хочу сделать мульти хронико-троно-протокольный Android L2Chat ) и данная информация была бы очень полезна.
Большинство пакетов одинаковые. В частности логин сервер и say2.
За это сообщение xixi нажился спасибкой от:
01.01.2015, 22:09
#17
Новичок
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
написал тут :
Код:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace l2packet
{
class SocketAsyncClient
{
public Socket client;
public byte[] in_data = new byte[0xFFFF];
public byte[] out_data = new byte[0xFFFF];
public SocketAsyncClient()
{
this.connect (ref client);
while (true) {
this.s_read ();
}
client.Shutdown (SocketShutdown.Both);
client.Close ();
}
public void connect(ref Socket sock)
{
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
Console.WriteLine("Сокет успешно создан");
client.Connect("127.0.0.1", 2106);
Console.WriteLine("Соединение успешно установлено");
}
catch (SocketException ex)
{
Console.WriteLine("Ошибка при работе с сокетами: " + ex.Message);
}
}
public int s_read()
{
byte[] data = new byte[1024];
// … заполнение массива data опущено
SocketAsyncEventArgs async_e = new SocketAsyncEventArgs();
async_e.SetBuffer(data, 0, 1024);
async_e.Completed += SocketAsyncCompleted;
client.ReceiveAsync(async_e);
Console.WriteLine("Нажмите любую клавишу");
Console.ReadKey();
Console.WriteLine ("Приняты байты : {0} {1}", data [0], data [1]);
return 0;
}
public int s_send()
{
byte[] data = new byte[1024];
// … заполнение массива data опущено
SocketAsyncEventArgs async_e = new SocketAsyncEventArgs();
async_e.SetBuffer(data, 0, 1024);
async_e.Completed += SocketAsyncCompleted;
client.SendAsync(async_e);
return 0;
}
void SocketAsyncCompleted(object o, SocketAsyncEventArgs e)
{
if(e.LastOperation == SocketAsyncOperation.Send)
{
if(e.SocketError == SocketError.Success)
Console.WriteLine("Передача выполнена успешна");
else
Console.WriteLine("При передаче произошла ошибка");
}
if(e.LastOperation == SocketAsyncOperation.Receive)
{
if(e.SocketError == SocketError.Success)
Console.WriteLine("Прием выполнен успешно");
else
Console.WriteLine("При приеме произошла ошибка");
}
}
}
}
обьясните, почему если нет задержки, обусловленной Console.ReadKey();, то код возвращает пустой массив. как этого избежать ?
Добавлено через 2 часа 46 минут
догнал до подправил до :
Код:
Код:
public int s_read()
{
byte[] data = new byte[1024];
// … заполнение массива data опущено
SocketAsyncEventArgs async_e = new SocketAsyncEventArgs();
async_e.SetBuffer(data, 0, 1024);
async_e.Completed += SocketAsyncCompleted;
while (true) {
if (client.Available > 0) {
client.ReceiveAsync (async_e);
Console.WriteLine ("Приняты байты : {0} {1}", data [0], data [1]);
break;
}
}
return 0;
}
не слишком убого ?
Последний раз редактировалось i_am_kisly, 01.01.2015 в 22:09 .
Причина: Добавлено сообщение
02.01.2015, 12:47
#18
Местный
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Товарищи объясните, а зачем вы это делаете? Идея ООГ бота для мобильного устройства интересна и меня тоже посещала. Но где это будет работать? Сейчас 100% популярных L2 серверов имеют доп шифрацию и это все там работать не будет.
__________________
Продажа чистых аккаунтов 4G, L2 EU, AARu, AA EU, Aion EU, Tera RU, Tera EU (ICQ 594297609)
Продажа VK авторег аккаунтов (ICQ 594297609)
02.01.2015, 17:33
#19
Новичок
Регистрация: 13.11.2014
Сообщений: 20
Сказал Спасибо: 2
Имеет 1 спасибку в 1 сообщении
just for fun )))
может кто поможет и поделится сетевым модулем ?
06.01.2015, 00:36
#20
Новичок
Регистрация: 31.12.2014
Сообщений: 14
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
А по L2 Classic есть информация?
У меня от сервера пакет Init приходит размером 194 байта, что с ними делать?
Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
Часовой пояс GMT +4, время: 21:59 .
vBulletin style designed by
MSC Team .
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод:
zCarot
Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!