Y
Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
Так что, по идее, приложение должно быть всегда готовым к приёму (непрошенных) пакетов с сервера. Можно уже писать здоровый switch для обработки команд с сервераВзаимодействие с сервером происходит поверх постоянно установленного tcp-соединения посредством асинхронного обмена командами. Инициатором установления соединения может быть только клиент, команды могут посылаться как клиентом, так и сервером.
Или не влияет,что данные не все еще приняты и идет отправка?
В заголовке указан размер данных в 80 байт.Пакет: Информация о пользователе
Имя пакета: MRIM_CS_USER_INFO
Тип пакета: sc
Параметры:
LPS, LPS, ... ##name1, value1, name2, value2, ... ## дополнительная информация о пользователе, имя параметра, значение параметра, имя параметра, значение параметра, ... На данный момент определены MESSAGES.TOTAL - количество писем в ящике, MESSAGES.UNREAD - количество непрочитанных писем в ящике, MRIM.NICKNAME - ник пользователя
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);
cout << bufSize << endl;
Интересно, а на что это число похоже, если его перевести в hex? :angry:3735928559
#define CS_MAGIC 0xDEADBEEF // Клиентский Magic ( C <-> S )
Пакет: Смена статуса другого пользователя
Имя пакета: MRIM_CS_USER_STATUS
Тип пакета: sc
Параметры:
UL ## status ## новый статус пользователя ##
STATUS_OFFLINE ## Пользователь отключен от сети Агента
STATUS_ONLINE ## Пользователь находится в сети
STATUS_AWAY ## Пользователь в сети, но отошел от компьютера
STATUS_UNDETERMINATED ## Настройки пользователя запрещают показывать его статус
STATUS_FLAG_INVISIBLE ## Пользователь находится в сети, но невидим для всех, кроме привилегированных пользователей из его списка видимости.
LPS ## user ## email сменившего свой статус пользователя
Описание: Это сообщение отправляется сервером при смене статуса пользователям всем тем, у кого он находится в контакт-листе (за исключением группы "Жду Авторизации" и тех, кого он включил в список игнорируемых или невидящих). Данное сообщение может быть доставлено клиенту ДО получения им контакт-листа. В такой ситуации оно должно игнорироваться.
iResult=recv(mySock,(char*)&packFrom,sizeof(packFrom),0); //Пришел пакет
if(iResult>0 && packFrom.msg == MRIM_CS_USER_INFO)
{
int sizeData=packFrom.dlen; //записываю скока байт обещают
int realSizeData=0; //в переменную будет дописываться размер принятых данных
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0); //в bufSize записываем длину следующей строки.
char msgTotal[4096];
iResult=recv(mySock,msgTotal,bufSize,0); //в переменной msgTotal будет строка "MESSAGES.TOTAL"
realSizeData+=iResult;
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0); //в bufSize записываем длину следующей строки.
char numMsgTotal[4096];
iResult=recv(mySock,numMsgTotal,bufSize,0); //приходит кол-во MESSAGES.TOTAL в виде строки.В моем случае это 81
realSizeData+=iResult;
printf("%s = %s\n",msgTotal,numMsgTotal);
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0);
char msgUnread[4096];
iResult=recv(mySock,msgUnread,bufSize,0); //строка "MESSAGES.UNREAD"
realSizeData+=iResult;
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0); //Количетсво непрочтенных писем
char numMsgUnread[4096];
iResult=recv(mySock,numMsgUnread,bufSize,0); //приходит кол-во MESSAGES.UNREAD в виде строки.В моем случае это 1
realSizeData+=iResult;
printf("%s = %s\n",msgUnread,numMsgUnread);
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0); //получаем строку "MRIM.NICKNAME
char nickName[4096];
iResult=recv(mySock,nickName,bufSize,0);
realSizeData+=iResult;
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0); //ну и получаем сам ник
char nick[4096];
iResult=recv(mySock,nick,bufSize,0);
realSizeData+=iResult;
printf("%s = %s \n",nickName,nick);
printf("Ожидаемый размер данных= %d \n Размер полученных данных = %d \n",sizeData,realSizeData); // чтобы сразу было видно.
}
в результате получаем
MESSAGES.TOTAL = 81
MESSAGES.UNREAD = 1
MRIM.NICKNAME = ***********
Ожидаемый размер данных= 80
Размер полученных данных = 56
iResult=recv(mySock,(char*)&bufSize,sizeof(bufSize),0); //в bufSize записываем длину следующей строки.
realSizeData+=iResult; //<--- Добавить это. И так шесть раз. 6*4 = 24 "потерянных" байта
char msgTotal[4096];
iResult=recv(mySock,msgTotal,bufSize,0); //в переменной msgTotal будет строка "MESSAGES.TOTAL"
realSizeData+=iResult;
char* msgTotal = (char*)malloc(bufSize+1);
msgTotal[bufSize]='\0';
слушай, привет, это, помоги мне тут с авторизацией) а то я вижу ты уже это сделал) а у меня тугова-то чё-т......посылаю всё как надо, но ничего в ответ :angry: ....а если послать MRIM_CS_HELLO хоть тысячу раз, он стоолько же раз вернёт MRIM_CS_HELLO_ACK(значит заголовок рабочий)ыыы,авторизировался B) )))
щас буду пробовать таймер установить.
Потоки=темный лес для меня пока что.
зы.
как синхронизировать все это,чтобы косяков не было? :wacko:
ап.
Таймер использовать не получилось,так как он сразу убивается у меня.
Всмысле запускаю таймер,выполняется только первый раз при запуске,
а потом программа завершается,и абсолютно пофиг,что там таймер запущен.
ну а поток создать у меня тем более не получается.
ошибок вылезает хз скока.
Мне надо передать в функцию потока сокет и интервал пинга.
А если учитывать то,что про потоки я прочитал несколько часов назад,
для меня эта задача вообще невыполнимая h34r:
void AuthMe(SOCKET RemoteSocket)
{
mrim_packet_header_t LoginPacket;
LoginPacket.dlen=0;
LoginPacket.from=0;
LoginPacket.fromport=5050;
LoginPacket.magic=CS_MAGIC;
LoginPacket.msg=MRIM_CS_LOGIN2;
LoginPacket.proto=PROTO_VERSION;
LoginPacket.seq=21;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);
LoginPacket.dlen=20;
LoginPacket.seq=22;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);
send(RemoteSocket, "kiber_shurik@mail.ru", 20, NULL);
LoginPacket.dlen=16;
LoginPacket.seq=23;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);
send(RemoteSocket, "****************", 16, NULL);
LoginPacket.dlen=sizeof(STATUS_FLAG_INVISIBLE);
LoginPacket.seq=24;
send(RemoteSocket, (char*)STATUS_FLAG_INVISIBLE, sizeof(STATUS_FLAG_INVISIBLE), NULL);
send(RemoteSocket, "****************", 16, NULL);
LoginPacket.dlen=15;
LoginPacket.seq=25;
send(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL);
send(RemoteSocket, "ABC, Матрёшкин©", 15, NULL);
ZeroMemory(&LoginPacket, sizeof(LoginPacket));
for(int i=0; i<INFINITE; i++)
{
Sleep(100);
if(recv(RemoteSocket, (char*)&LoginPacket, sizeof(LoginPacket), NULL)>0)
{
MessageBox(NULL, _T("Incoming data!"), NULL, NULL);
}
}
}
Обучение наступательной кибербезопасности в игровой форме. Начать игру!