Архитектура Skype изнутри и транспортные протоколы

Архитектура Skype изнутри и транспортные протоколы

707

Короткое замечание. Я знаком со всеми отчетами по анализу Скайп протокол. д. Знаю о skypeopensource, знаю о француз FakeSkype т.
Подходы мне не понравилось.
Некие данные
Никаких результатов
Где-то что-то
Для отправки и получения
Это не мой путь
Так что я не буду ни отрицать, ни подтвердить схожую информацию из остальных источников. В статье, начальный код и это не полное описание протокола. Для меня обратный инжиниринг-это конкретный ответ на вопросец, а не гадание какое-или из значений либо исследование сетевых пакетов. Для себя я мог на сто процентов разобрать слоя транспортной сети Skype и криптографии, но я не буду публиковать на соответственных суждений. Расскажу как я прошел ее с самого начала. Потому предлагаем другую точку зрения и анализа.
Итак, ваш реверс-инжиниринга я начал с загрузки крайней версии Skype в дизассемблер либо отладчик, и с поиском и исследованием его первых версий и истории сотворения. Используя web.archve.org поглядите на веб-сайте skype.com в прошедшем удалось скачать 1-ый и чрезвычайно около старенькой версии 0.9.х. скайп, в следствие для исследования были скачаны все доступные версии для всех платформ в интернет-архиве. Не запамятовывайте про skypekit SDK для окна/Linux, для которой поделились добрые люди, начиная от старенького 2.0 версии, включая последнюю доступную.
Ну, а набрав адресок в web.arhive.org исследовала и загрузить из раздела загрузки. Он просто ищется в гугле и скачал его. Существует также открытый плагин клиенту подарок-Ускоренный сети Kazaa, его так далековато ~2000 удалось сделать энтузиасты, используя обратный инжиниринг. А вот история ребята, кто сделал Скайп, произнес, что один из их первым продуктом была программа с Kazaa, который дозволял обмениваться файлами в P2P сети. При исследовании истории Skype нередко упоминается компания joltid ООО.
Он был онлайн, P2P телевидение, которая не снискала популярности и закончила существовать. Но меня не интересует его история, и, естественно, программного обеспечения. Используя web.arhive.org и Google отыскал некие программы плагин для Win и macosx. Также в поле зрения попал один из проектов скайпу муравейник, в следствие pereimenovaniya в joost.
Не обошли вниманием и модули СФА(в Skype для Asterisk).
Ну, вся собранная информация будет проанализирована.
Знаю, что Skype-это кропотливо зашифрованное свою продукцию. Через дампер памяти, легкосъемная защита. Для начала я не собираюсь, но для статического анализа в IDA довольно.
В эволюции их шифровать двоичные файлы скайп поменялся некординально, а конкретно раз где-то до 2-ой версии Skype была монотонной КСОР рекурсивный проход, позже через секунду добавил, и упаковка.
Оставила информацию в текст сообщения отладки также существенно упрощает весь процесс реверс-инжиниринга. Естественно, текстовые строчки, содержащиеся в програмках. Это позволило выстроить дела отдельных модулей по их наименованию. Да, ядро скайп написан полностью на C++. Дальше осмотр перебежал в hex-просмотрщике. Но в старенькых версиях benaroch проявили не лишь чистую линию, но не отключается библиотеку rtti инфы о C++ классы. Что вы сможете выяснить, спросите Вы? В неких современных скайпу клиентов запутанный даже они.
Изучая версию за версией benaroch скайп, я желал отыскать таковой бинарный модуль, где оптимизатор работал менее, даже интегрированных функций, использованных в начальном коде, не оборачиваясь. Такие двоичные файлы были найдены, и не один.
Так, вся архитектура Skype-это модули, функции которых выполняются в основном потоке класса позвоночника. Сам класс наследует от магистральной нитки класс. В базу заявленного интерфейс модуля класса, который имеет десяток обработчиков для обработки рассылок каких-или данных.
В конце концов, эта архитектура строится, покажет чрезвычайно упрощенно.

пустота registerModule(позвоночник *);
пустота unregisterModule();

addCallbackFunction недействительным(жалким (модуль::*)());

};

перечень<модуль*> ModuleList;

пустота AddModule(модуля *м) { ModuleList.добавить(м); }

Notify_1 недействительным(жалким *эВ) { для (я=0;я<ModuleList.Размер();++I) по ModuleList[я].handler_1(эВ); }
Notify_2 недействительным(жалким *эВ) { для (я=0;я<ModuleList.Размер();++I) по ModuleList[я].handler_2(эВ); }
Notify_3 недействительным(жалким *эВ) { для (я=0;я<ModuleList.Размер();++I) по ModuleList[я].handler_3(эВ); }
Notify_4 недействительным(жалким *эВ) { для (я=0;я<ModuleList.Размер();++I) по ModuleList[я].handler_4(эВ); }
… }
}
}; запустить недействительными()
{
пока(!Прекращенный)
{
//цикл функции обратного вызова всех модулей в перечне

//объединение сети системы, получая данные в буферы сокетов,
// отправка данных из буфера в сокет. псевдокодкласса thread
{
виртуальная пустота выполнить() = 0;
};

костяк класса : публичные нить
{
класс модуля
{
виртуальный handler_1 недействительным(жалким *эВ) {};
виртуальный handler_2 недействительным(жалким *эВ) {};
виртуальный handler_3 недействительным(жалким *эВ) {};
виртуальный handler_4 недействительным(жалким *эВ) {};
….
Муравейник проекта(Йост) папа Joltid изготовлено на наиболее высочайшем уровне. Исследование текстовых строк в Skype и остальных проектов показал, что имя папа Joltid впрямую отображается в проекте Skype, но некие остальные файлы, которые выносятся «за скобки».
«c:slave1win-productionanthilljoltidgigeneralbackboneInternetConnection.hpp»
«c:slave1win-productionanthillanthilltransceiver/transceiver.hpp»
«c:slave1win-productionanthillanthill..joltidGIGeneralBackbone/Backbone.hpp»
Так, сделать предположение, что существует всераспространенная разработка, которая употребляется исследуемых товаров. И наследование классов в Skype и муравейник выходит из класса позвоночника.
В конструкторе класса позвоночника можно найти много модулей, которые являются зарегистрированными.

};

класс InternetConnection : публичные позвоночника::модуль
{
… };

Костяк::Магистральная()
{
AddModule(новейший APIEventManager);
AddModule(новейший роутер);
AddModule(новейший InternetConnection);
AddModule(новейший FallbackConnManager);
AddModule(новейший RelayConnectionManager);

… д. псевдокод класса APIEventManager : публичные позвоночника::модуль
{
… и т. };

класс FallbackConnManager : публичные позвоночника::модуль
{
… весь перечень не буду публиковать
}; };

маршрутизатор класса : публичные позвоночника::модуль
{
… };

класс RelayConnectionManager : публичные позвоночника::модуль
{

Похоже, что модули в конструктор и сделать технологию Joltid, которая дозволяет выстроить распределенную сеть р2р для передачи всех видов цифровой инфы. И наследование позвоночника, вы сможете развивать любые продукты, которые употребляют P2P сети.
Логически, Скайп больше функциональности, авторизация, чат, передача файлов и др. Но я был заинтересован в саму базу скайпу, его взаимодействие с сетью и криптографией. SkyBackbone около 10-ка модулей. Который видимо отвечает за передачи и приема медиа-данных. Но в новейших версиях Skype, и почти все другое. Муравейник проект в первой версии в вложенном классе добавляется лишь один модуль передатчика. Но в проекте Skype в классе-наследнике.
Изучая в hex редактор все проекты разглядывать модуль CommLayer, его сообщения совместно с главными словами TCP и udp был более.
«CommLayer: удаление пакета #%04x»
«CommLayer: доказательство (ACK) к #%04x»
«CommLayer: отправка юзеру пакета #%ед через TCP #%у. лен=%Ю»
«CommLayer: %отправка пакета #%04x к %S с внедрением протокола TCP»
«CommLayer: %отправка пакета #%04x на %s используя udp»

Так, этот модуль как-то реагирует либо взаимодействует с сетью.
Анализируя наследие классы оставили в библиотеку rtti, есть структура:
класс CommLayer
{
класс ConnectionListener;
класс CommandListener;
класс транспорта;
класс TCPConnection;
класс UDPTransport;
};

В библиотеку rtti классов были найдены для сетей класса класса Connection UDPConnection, что при исследовании наследования представил, что наследниками являются лишь два класса.
1-ый-это CommLayer. Ну, поглядите в rtti и: И 2-ой FELayer, который, кстати, не включенные в модуль позвоночника. Итак, скайп-это P2P сети, но тем не наименее то, что нам необходимо.
класс FELayer
{
класс PacketListener;
класс ConnectionListener;
класс Конн;
};

Итак, есть по последней мере два класса для работы с сетевой частью. Осталось разобраться с ними, какие данные они передают, которые я принимаю. И где, в конце концов, применять все известные криптографии шифрования RC4/AES и RSA в/ЦТ.
Грузим в IDA попеременно различные bananarchy Skype и ее товаров и исследования. Найти известными методами MD5/SHA1 для/метод sha2/аес, выберите Функции. Но ОГА не видно, но это не беда, ЮАР базируется на bignum. Пристальный анализ
и вы сможете просто найти, bignum, а с ним и остальное ОГА. Скайп есть своя реализация bignum/АСР.
Как оказалось, Диффи-Хеллмана в первых версиях скайпа не было, он был добавлен позднее, где-то опосля 1.3.х версию Skype.
Случайная так случайная. Как эти константы были найдены в подарок-Ускоренный. Анализируя бинарные нередко встречается число 69069 (0x10dcd), с помощью Google отыскать случайны, но смещение «+17009» (0x4271) незначительно необычный, но не неувязка.
статические seed_step без знака int (целое без знака семян) {
возвращение 0x10dcd * семя + 0x4271;
}

Вы сможете огласить, что это случайное неповторимое для всех товаров Skype ( joltid ?)
Особенное внимание обращается на странноватый пакет числа. В исследовании была найдена в skypekit SDK для.
BinProtocolClientDecoder.java:
публичный инт decodeUint() кидает ioexception {
инт сдвиг = 0;
int итог = 0;
в то время как (правда) {
int значение = mTransport.readByte() & значение 0xff;
итог = итог | ((value и за 0x7f) << сдвиг);
сдвиг = сдвиг + 7;
раз ((значение & от 0x80) == 0)
перерыва;
}
возврат итог;
}

BinProtocolClientEncoder.java:
общественная кодировки encodeUint(окончательное значение int) кидает ioexception {
инт с V = значение;
пока (с V кодами > 0x7f) {
транспорт.writeByte((б)(от 0x80|(в&0x7f, а)));
с V = с V >> 7;
}
транспорт.writeByte((б)в);
возвращение этого;
}

в тот же пакет SDK похож на C++SidProtocolBinCommon.cpp
Статус BinCommon::wr_value(CommandInitiator* нить, как const uint с& Валь)
{
//функции printf(«кодирование %Д %хн», Валь, Валь);
значение uint = знач;
инт СЗ = 0;
Тип char buf с[(32+7)/7];
для(;значение кодами>0x7f;значение>>=7)
буфер buf[СЗ++] = (char с)((значение&0x7f, а)|0x80, в);
буфер buf[СЗ++]=(Тип char)значение;
возвращение (Статус) m_transport->bl_write_bytes(резьба, СЗ, &буфер buf[0]);
}

Статус BinCommon::rd_value(CommandInitiator* резьба, Тип uint64 и вал)
{
знач=0;
учар с;
сдвиг не uint=0;
делать {
раз (rd_uchar(нить с) != ОК) вернуть ERR_DECODE;
в val|=((Тип uint64) (C и за 0x7f)<<сдвиг;
сдвиг+=7;
// нужны? раз (сдвиг > 64 && с&с кодами 0xfe) возвращение ERR_DECODE;
} пока(с&0x80, в);
возвращение «ОК»;
}

Как чрезвычайно нередко номер 40503 и 2654418637 (0x9e3736cd) с помощью xor и смещения *4.

код из Идыkey2index инт(инт А1, А2, int у) { возвращение (40503 * ((*А2 >> 16) ^ *А2)) >> 8; }

синт hash_remove(Тип int это int значение)
{
инт р0; // ра@1
Тип int п; // в EAX@1
подписан int итог; // в EAX@4
инт версии V5; // экх@6

р0 = это
+ 4
* ((беззнаковое __int16 в)(40503
* (((без знака int)(*(_DWORD *)(значение + 4) ^ *(_DWORD *)(значение + 8)) >> 16)
^ *(_WORD *)(значение + 4) ^ *(_WORD *)(значение+ 8))) >> 8);
р = *(_DWORD *)р0;
раз ( *(_DWORD *)р0 )
{
а ( р != значение )
{
р0 = р;
р = *(_DWORD *)р;
раз ( !р )
гото _return_0_loc_81D47CC;
}
—*(_DWORD *)(это + 0x400);
у5 = *(_DWORD *)р;
итог = 1;
*(_DWORD *)р0 = у5;
}
еще
{
_return_0_loc_81D47CC:
итог = 0;
}
возврат итог;
}

не uint __usercall sub_find<в EAX>(инт *А1<в EAX>, инт А2<ра>)
{
инт версии v2; // еуи@1
инт В3; // эод@1
итог не uint; // в EAX@1
я типа int; // экх@1

версия v2 = *(_DWORD *)(А2 + 48);
В3 = *А1;
итог = (uint с)(2654418637 * *А1) >> *(_DWORD *)(А2 + 36);
для ( я = *(_DWORD *)(версии 2 + 4 * итог); я != -1, я = *(_DWORD *)(версии 2 + 4 * итог) )
{
раз ( *(_DWORD *)(*(_DWORD *)(А2 + 16) + 12 * я) == В3 )
перерыва;
раз ( (подпись инт)++итог >= *(_DWORD *)(А2 + 32) )
итог = 0;
}
возврат итог;
}

Судя по Google поиск, числа являются частью алгоритмов построения хэш-таблиц:
/* 16-разрядный указатель */
определение типа недлинного целого без знака инт HashIndexType;
статические константные HashIndexType к = 40503;
/* 32-разрядный указатель */
псевдоним типа беззнаковый Long int в HashIndexType;
статические константные HashIndexType к = 2654435769 (0x9e3779b9);

32 бит индекса незначительно различается от той, которая употребляется в Skype, но заострять свое внимание на этом я не стала.
Незначительно пропускать процессе предстоящего анализа двоичных файлов, перейдем к результату.
И есть контейнер для хранения перечня атрибутов. Сам атрибут может представлять
один из обычных типов. Рассмотрев все логические функции транспортного уровня и чуток выше, похоже, что Skype употребляет снутри примитива именуется атрибут.
Большая часть целых чисел упакованы/распакованы в упаковке метод чисел, обрисованных выше encodeUint/decodeUint. перечисление
{
e_Integer, // = 0 32 битное число
e_Integer64, // = 1 64 бит огромное число
e_Address, // = 2 32 Количество IP-адресок +номер порта 16
e_String, // = 3 строчки N количество б, оканчивающуюся нулем
e_Rawdata, // = 4 двоичных данных
e_Container, // = 5 вложенных контейнеров
e_IntegerArray, // = 6 массив 32-битных целых чисел
};

В контейнере заместо сериализации/десериализации атрибутов. Другие данные копируются как есть.
Этот Тип контейнера был видимо занят большой размер на выходе опосля сериализации и опосля 0.9 версии Skype уже в 1.0.x версии был добавлен режим упаковки атрибуты сериализации заместо. Где метод копируется один в один по ссылке, за исключением того, что частоту энкодера забиты статически в Skype. Упаковка обычная range_coder арифметического кодировки.

encoderRenormalize, код от Иданедействительными encoderRenormalize(range_coder *это)
{
без знака int _valfield_4; // эдр@2
без знака int _infield_8; // экх@7
чара countv3; // ЦФ@9

раз ( это->спектра <= 0x800000 )
{
делать
{
_valfield_4 = это->низкая;
раз ( _valfield_4 > ~0x80800000 )
{
раз ( (подпись инт)_valfield_4 >= 0 )
{
++это->Справка;
гото LABEL_7;
}
это->vtbl->выход(эта, этот->буфер + 1);
раз ( это->Справка )
{
делать
{
это->vtbl->выход(это, 0);
countv3 = это->Справка— == 1;
}
пока ( !countv3 );
}
}
еще
{
раз ( это->Запуск )
это->Запуск = 0;
еще
это->vtbl->выход(эта, этот->буфер);
раз ( это->Справка )
{
делать
{
это->vtbl->выход(это, 255u);
countv3 = это->Справка— == 1;
}
пока ( !countv3 );
}
}
_valfield_4 = это->низкая;
это->буфер = это->маленький >> 23;
LABEL_7:
_infield_8 = это->Спектр;
это->маленький = (_valfield_4 << 8) & ~0x80000000;
_infield_8 <<= 8;
это->Спектр = _infield_8;
}
пока ( _infield_8 <= 0x800000 );
}
}

decoderRenormalize, код от Иданедействительными decoderRenormalize(range_roder *это)
{
_range_roder_vtbl *В1; // в EAX@3
неподписанные __int8 значение; // ал@3
int без знака В3; // эдр@3

раз ( это->спектра <= 0x800000 )
{
делать
{
В1 = в->vtbl;
это->маленький = (без знака __int8)(это->буфер << 7) | (эта->низкая << 8);
значение = В1->ввод((инт)в этом);
это->буфер = значение;
это->низкая |= значение >> 1;
В3 = это->Спектр << 8;
это->Спектр = В3;
}
пока ( В3 <= 0x800000 );
}
}
Парсинг FELayer показал, что этот слой лишь употребляет TCP для связи. Одной целью данного модуля является обеспечение транспортного уровня:
— при регистрации либо входа через Skype;
вызовы (выполняет сигнализации, а также протокол SIP либо h323 для VoIP);
— передача файла;
и в первых версиях Skype передача аудио по протоколу TCP?
Формат данных таковой:
структура fe_header
{
б типа;
б v_hi; // постоянно = 3
б v_lo; // постоянно = 1
слово лен;
};

fe_header + доп serializedvalue атрибутами: + дополнительно пользовательские данные.
Слой пробует притвориться какой-то протокол SSL, хотя это естественно не так. Данные, отмеченные по желанию, по желанию топ-шифруются с AES и RC4.
«FELayer: протокол TCP: %S не получен пакет с неизвестным версии SSL (%ед.%у)п»

Обмен ключами RSA, AES с солью + Доборная информация передается в атрибуты, которые помечены как optional. Это типа=20, Тип=21, Тип=22 & типа=23. В анализе обнаружены четыре типа пакетов для данного слоя-это.
типа=20 является userpacket с aes256, измеряющий, устарела, наиболее не употребляется. Тип=21-это userpacket без aes256, измеряющий, устаревшим, в 1-ый версиях Skype была применена для RTP передачи.
Невзирая на то, что пакеты этого типа не употребляются, функциональность получения и разбора этих типов осталось в обработчике FELayer.
Тип=22
как пинг с 1-го лишь заголовка, нет данных
и как с handsnake — добавлены атрибуты(8,9,11,12), которые содержат данные rsapub ключи
соли и доборная информация
и как datapacket — раз в для себя не содержит данных, в котором данные модули верхних уровней. Тип=23
в качестве неизменных заголовков без данных.
Исходная TCP-соединение с обмена ключей по Диффи-Хеллмана. В предстоящем ключ будет употребляться метод шифрования RC4.
Есть ситуации, когда обмен Диффи-Хеллмана ключи могут потерпеть неудачу, в этом случае, метод RC4 для шифрования не употребляется. Не переживайте, есть еще АЭС.
Сам аес практически обычное обычное aes256, измеряющий хтр/см, где индекс-это тип uint64 бит.

код из Идынедействительными userpacket_crypto_encrypt(userpacket_crypto *это, учар *для ptr, uint с леном, Тип uint64 индекс, uint, не nullkey, uint с солью)
{
граф не uint; // еуи@3
учар *аргумент pdata; // ebx@5
_j_ не uint; // эод@7
uint с послед; // [СП+18ч] [ВР-134h]@6
учар *aesks; // [СП+1 канал] [ВР-130в]@1
uint с блока[4]; // [СП+20ч] [ВР-12С]@7
учар zerov11[32]; // [СП+30ч] [ВР-11Ch]@2
учар keyv15[240]; // [СП+50н] [ВР-ЗСО]@2

aesks = это->ключ;
раз (nullkey)
{
функции memset(zerov11, 0, значение sizeof(zerov11));
rijndaelKeySched(zerov11, keyv15);
соль = 0;
aesks = keyv15;
}

граф = лен;
раз (лен > 1048576)
граф = 1048576;
аргумент pdata = ПТР;
раз (счетчик)
{
сл = 0;
_loop2_aes_loc:
блок[0] = соль;
блок[1] = соль;
блок[2] = индекс >> 16;
блок[3] = ((_DWORD)индекс << 16) + сл;
rijndaelEncrypt((инт *)блок, (инт *)aesks);
_j_ = 0;
пока (_j_ != граф)
{
аргумент pdata[_j_] ^= блок[_j_>> 2] >> (24 — 8 * (_j_ & 3));
раз (++_j_ > 15)
{
++сл;
граф -= 16;
аргумент pdata += 16;
гото _loop2_aes_loc;
}
}
}
}
В конце данных опосля шифрования добавляется слово(слова) в 2-ух б. индекс. Которая является результатом xor 2-ух слов(слово) проверка CRC32(данные)^.

код из Идынедействительными userpacket_crypto_finish(Тип uint64 индекс, типа char *ptr запись, интервал Len)
{
инт РЭС; // Р4@1
инт контрольную сумму CRC32; // [СП+4ч] [ВР-20ч]@1

проверка CRC32 = -1;
Проверка CRC32(&контрольную сумму CRC32, ПТР, лен);
рез = (индекс ^ проверка CRC32) & 0xFFFF;
ПТР[лен] = рес & 0xffff;
ПТР[Елена + 1] = рес >> 8;
}
Вот как? Я удивляюсь, как индекс восстанавливается на приемной стороне? Маленькое расследование алго, понятно, что индекса на передающей стороне имеет ширину Тип uint64, но возрастает до 48 битов, индекс & 0xffffffffffff.

код из ИдыТип uint64 userpacket_crypto_get_send_index(userpacket_crypto *это)
{
Тип uint64 РЭС; // р8@1

рез = это->SendIndex;
это->SendIndex = res и 0xFFFFFFFFFFFFLL;
возврат рез;
}
Но это лишь нижняя часть 16-бит 0xffff, исходя из их функций userpacket_crypt_finish.
«метод 1». Выходит, что на приемной стороне индекс восстанавливается опять к Тип uint64 с известным методом, используемым в протокол srtp — см.
Код взят из листинга Иды, разумеется, работал оптимизатор компилятора.

0 : HiIndex+1;
LoIndex = in_index;

возвращение in_index + (HiIndex<<16);
}

раз (in_index <= LoIndex || (in_index — LoIndex) <= 32768)
{
раз (LoIndex < in_index) LoIndex = in_index;
возвращение in_index + (HiIndex << 16);
}

возвращение in_index + (( (HiIV-1)>>32|(HiIV-1) )<<16);
} код из ИдыТип uint64 userpacket_crypto_recv_index(беззнаковое короткое in_index)
{
раз (LoIndex & 32768)
{
раз ((LoIndex — 32768) <= in_index && LoIndex >= in_index)
возвращение in_index + (HiIndex<<16);

HiIndex= (HiIndex >= -1)?
Она также включает в себя функцию генерации ключа, и некие остальные функции для криптографии. Все класс объекта для работы с aes256 именуется userpacket_crypto.
на RC4 обфускатора! Как оказалось, опосля разбора данной Лере работает через TCP и через udp. В TCP-транспорта на шаге подключения, как он FELayer употребляет метод Диффи-Хеллмана, ключи от которого будут применены в… Сейчас разглядим CommLayer.
Но о этом позднее.
Встречи на CommLayer несколько:
— обмен командами;
— обмен userpacket_crypto;
— обмен сырых данных udp обойти все CommLayer.
Также CommLayer имеет на уровне транзакций. Выслать, принять пакет.
CommLayer один, но употребляется почти всеми модулями. Команды могут быть с уведомлением о вручении. Команда CommLayer несколько мини заголовка с пары б. Без подтверждений, запросов и др. В котором закодирован Тип команды + SeqNum необязательно, тогда команда дополняется serializedvalue атрибуты из контейнера.
И большая часть модулей, которые употребляют глаголы, которые чрезвычайно почти все — Localnode, Брандмауэр, replay_manager_t, BroadcastChannelManager т. Это отдельный процесс регистрации команд для каждого модуля. Как определяются команды, где хоть какому модулю? Да, каждый модуль может зарегистрировать собственных игроков в общем CommLayer, и выставляя SeqNum отправлено в команде могут эмулировать некие сделки режиме. д.
Лишь что выслал в команде в CommLayer в очереди доставки, вы сможете:
— установите время ожидания;
— сетевой адресок;
— Тип транспортного протокола TCP либо udp;
— подписать собственный ReplyListener класс обратного вызова, которая будет работать, раз команда ожидает ответа. И так дальше.
Что регистрация делает CommanListener, он лишь ждет прием команд и сможете ответить, и ReplyListener получает ответы на свои запросы. Вроде разобрались. Какая разница ReplyListener от регистрации команды в CommLayer?
Обмен userpacket_crypto это все же считается aes256, измеряющий хтр/см C Тип uint64 индекс. Идет стройку реле подключение, обмен сообщениями(чат) и др. Он употребляется в session_manager_t выслать свои команды, которые также имеют свои собственные слоем упаковки и сделок.
В первых версиях, когда не было видео, но был звук, который был передан в RTP userpacket_crypto, добавив заглавие CommLayer для идентификации пакетов. Крайняя модификация этого метода и RTP Аудио/Видео принимаются и передаются сходу в udp-сокет. Так что РТП может также передаваться через FELayer по протоколу TCP. Видимо, это создавало накладных в чрезвычайно большой поток данных, отслеживание и сделок CommLayer. И в наиболее поздних версиях был добавлен протокол RTP для ТЭК. Да, еще зашифрованные в userpacket_crypto, но не добавил CommLayer заголовка. Для обмена протокол RTP аудио/видео, в отличие от первой версии, Скайп изменил метод.
Главные виды упаковок в CommLayer ПТС, session_header, АСК, end_session, неизменных, req_obfuscation udp транспорта приблизительно такое же, как TCP, за исключением того, что там не с помощью метода Диффи-Хеллмана и добавлена возможность отправлять огромные пакеты фрагментов. Также CommLayer возможность поменять «на лету» режим обфускации. Раз Вы не получаете один из фрагментов, протокол будет запрашивать потерянные пакеты вновь.
Обфускации Skype-это обычный метод RC4, но замусорен Shift, до этого чем установить его в RC4.

код из Идынедействительными Obfuscator_Init(int данной, семя не uint, uint с режимом, учар *keystr, uint с keylen)
{
я не uint; // экх@9
uint с движком V8; // дл@11
uint с В9; // ал@11
учар ключ[80]; // [СП+14ч] [ВР-64h]@4
инт в11; // [СП+64h] [ВР-14ч]@5
инт В12; // [СП+68 час] [ВР-10ч]@5

раз (!режим)
режим = 1;
я = 0;
делать
*&ключ[4 * я++] = семя;
тогда как (I != 20);

раз (mode_& 1) Obf_0(ключ, семян);
раз (режим & 2) Obf_1(ключ, семян);

для (я = 0; ; ключ[я — 1] ^= keystr[я-1])
{
V8 с = я <= 79;
В9 = я++ < keylen;
раз (!(движок V8 & В9))
перерыва;
}
ARC4::SetKey(это, ключ, 80);
}
Сами функции являются побитовые сдвиги, xor (исключающее либо S и в различных вариациях. Их код раз можно наиболее запутанно, что нереально разобрать даже с помощью реверс-инжиниринга. Обфускатор в функции Obf_0, Obf_1.
Главные данные для запутывания-это семя, режим и ключом, приобретенным от Диффи-Хеллмана. На практике наиболее чем в 2 режимах не употребляется. Поддержка обфускации в протоколе CommLayer на лево двойное слово 0xffffffff значение, каждый бит которого представляет один из режимов. Общественная обфускация дозволяет без конфигурации скайпу протокола до 32 режимов в различных вариациях смешивания.
Он 0xf б, но в большинстве это 0х3 значение. Т. В скайпе некие модули удалось найти 4 режима обфускации. Каждый из пиров посылает SupportedMode и RequiredMode. Опосля инициализации протокола CommLayer праздничков обмена запрос-ответы, договориться в каком режиме обфускации будет обмен. не наиболее 2-х режимах. е.
В современном скайпе ли компилятор оптимизатор озорной, будь то неизменные подмены найти SupportedMode, тем самым став обыденным номером в
в дизассемблере. Соответственно SupportedMode указывает, сколько затемнять составлен обфускатор. Отыскать все ссылки не так просто, раз не знать всех местах. SupportedMode описывает константы, которые употребляются в Skype были статическую переменную и просто было ссылку на дизассемблер, в котором функция употребляет эту константу.
В конце концов, сделал модуль BareBackbone в которых обрабатывающие модули. Поменялся сам костяк, обработка модулей передаются взад и вперед. С 2003 года почти все поменялось, но транспорта FELayer и CommLayer оставался практически таковым же, как до этого. Из основного потока позвоночника он был выражен, по-видимому, задержка основного потока, который также является частью сети занимается. Почти все модули не поменялись, но мутация кода возросла, есть много абстрактных интерфейсов, которые породила множество виртуальных функций. Эволюция скайп
Временами заглянуть вовнутрь Скайп. Оптимизированные AES и RC4 и/bignum алгоритмов.
Собственные bignum реализации, ЮАР, обфускация алгоритмов RC4, транспортный уровень сети, хэши, списки и др. Изучая отысканные клиенты Kazaa и загруженных модулей с веб-сайта Joltid, удалось осознать и узреть очами перепроектировать как же Скайп. Все чрезвычайно комфортно и компактно. На данный момент нет таковых программ, множество буст, стл, в openssl, программы стают
в чудовищ.
Также ребята из Ускоренный удалось retraversing 4 режима обфускации. Раз ассоциировать современные bignum из Skype сильно заросшем оптимизации для разных платформ. Изучая подарок-FastTracker, выяснилось, что ребята лихие 2000 могли retraversing ЮАР-bignum из с Kazaa (употребляется в Skype), но в данном случае это было проще и они не имеют Арсенал современной Ида+hexrays.
Вывод
Я думаю, что раз убрать две транспортного уровня, Скайп больше не будет смотреться как Skype. Потому, как минимум, на уровне сети делает Skype таковым неповторимым, как и он. Наиболее скучноватой для исследования сохранности, меньше criptografice.
Все было изготовлено методом статического анализа для IDA+hexrays. habrahabr.ru Я никогда не бегали Skype для отладки и не сняты дампы пакетов для анализа. Когда обратный инжиниринг не был применен отладчик. И это в отличие от наиболее ранешних анализов скайп-протокол, который, я считаю, дает больше инфы для осознания того, как сетевой части.