По сравнению с предыдущей статьёй (которая, судя по изменениям моей кармы, не всем пришлась по нраву) эта совсем безобидная.
Можно ли доверять цитатам из Skype? Казалось бы, их нельзя редактировать, а после недавнего отключения поддержки html тэгов (в windows версиях), это должно быть невозможным. Ответ на вопрос на скриншоте ниже:

Ответ – целостности и авторству цитат из Skype доверять нельзя. Наверняка многие наслышаны о защищённости протокола и в целом этой программы. Но как обычно, ошибки находятся в мелочах. Нигде и не утверждается, что цитаты подписаны цифровой подписью и им можно свято верить (ну или я не нашёл такого утверждения), но во всяком случае на практике это не так.
Предположим, что при копировании цитаты, Skype также дописывает в буфер обмена и информацию об авторе, дате и т.п., это наиболее простой путь, по которому, как оказалось позже, и пошли разработчики. Для дальнейшего изучения нам не понадобится дизассемблировать Skype, просто напишем свою программу (в лучших традициях Smart UI паттерна – это там где весь код в кнопках), которая «ковыряет» буфер обмена. По привычке, я буду использовать c#, в качестве UI для быстроты выберу win forms (да простят меня ненавистники этих технологий).
Итак, вот формочка с аскетичным дизайном:

По одной кнопке все данные из буфера обмена будут писаться в richEdit, по другой, будет происходить обратная операция. Начнём же изучение.Судя по всему для работы с буфером обмена тут подойдёт класс «System.Windows.Forms.Clipboard». В нём есть подходящий метод GetDataObject, который возвращает объект, реализующий интерфейс IDataObject (смотрим msdn). Метод GetData принимающий в качестве параметра Type нам не подходит, т.к. структуру объекта сохраняемого в буфер обмена законными способами узнать не получится, зато есть его перегрузка строку с «форматом». Это очень кстати, учитывая, что есть ещё и метод GetFormats. Итак, вот он, первый шаг к изучению того, что же Skype сохранил в буфер обмена:
Пишем «test text» в skype, копируем свою цитату, вставляем в окошко скайпа, чтобы убедиться, что цитата скопировалась, и выполняем код.Посмотрим прямо в дебаге, что же сохранилось в clipboardData.

Не знаю как вас, а меня очень заинтересовало значение с ключом SkypeMessageFragment, может быть потому, что оно MemoryStream, хотя в остальных просто нет ничего интересного. Итак посмотрим что же лежит в этом стриме:
Запустив это, в richedit можно увидеть вот что:

Честно говоря, я подумал, что на этом моё исследование закончилось провалом. Да, тут есть автор, время отправление в unix формате, сам текст цитаты, но кроме того тут есть значение guid, где хранится какой-то хэш. Увидев этот хэш, я понял, что это, скорее всего, что-то типа hmac. В любом случае, система цитат должна работать как-то так: Skype от всех данных цитаты считает хэш по своему супер секретному алгоритму (возможно используя суперсекретный ключ) и пишет получившийся хэш в буфер обмена, а когда человек вставляет цитату в окошко и отправляет её в чат, скайп проверяет верность подписи. Теория это хорошо, но давайте проверим, а так ли это, и сделаем сохранение richEdit обратно в буфер обмена:
При записи в stream я намеренно не использовал конструкцию using (вызов метода Dispose у streamWriter портит мой MemoryStream)Итак, запускаем программу, копируем цитату из скайпа, правим её в нашем «редакторе», жмём Save и вставляем цитату обратно в Skype.

Честно говоря, я сильно удивился, что это сработало. Нет, я, конечно, искренне надеялся, что это сработает, но удивился я очень сильно. Хотя бы из-за моей теории с hash’ом, зачем тогда этот гуид, непонятно.
Настоящая цель этой статьи – предупредить общественность, что цитатам из skype доверять нельзя. Ведь это очень мощный инструмент, которым можно оклеветать/обмануть другого человека. В общем, это новое оружие в социальной инженерии, так что будьте бдительны, и не ленитесь проверять теорию практикой.
P.S. в последней секции «code» находятся все исходники, поэтому загружать на git не стал.P.P.S. прошу прощение за чрезмерное количество отступов в коде, при включении опции «Отключить автоматические переносы строк и создание ссылок.» та же ерунда. (подсвечивал код вот этим http://highlight.hohli.com/ там всё выглядело нормально)
Можно ли доверять цитатам из Skype? Казалось бы, их нельзя редактировать, а после недавнего отключения поддержки html тэгов (в windows версиях), это должно быть невозможным. Ответ на вопрос на скриншоте ниже:

Ответ – целостности и авторству цитат из Skype доверять нельзя. Наверняка многие наслышаны о защищённости протокола и в целом этой программы. Но как обычно, ошибки находятся в мелочах. Нигде и не утверждается, что цитаты подписаны цифровой подписью и им можно свято верить (ну или я не нашёл такого утверждения), но во всяком случае на практике это не так.
Предположим, что при копировании цитаты, Skype также дописывает в буфер обмена и информацию об авторе, дате и т.п., это наиболее простой путь, по которому, как оказалось позже, и пошли разработчики. Для дальнейшего изучения нам не понадобится дизассемблировать Skype, просто напишем свою программу (в лучших традициях Smart UI паттерна – это там где весь код в кнопках), которая «ковыряет» буфер обмена. По привычке, я буду использовать c#, в качестве UI для быстроты выберу win forms (да простят меня ненавистники этих технологий).
Итак, вот формочка с аскетичным дизайном:

По одной кнопке все данные из буфера обмена будут писаться в richEdit, по другой, будет происходить обратная операция. Начнём же изучение.Судя по всему для работы с буфером обмена тут подойдёт класс «System.Windows.Forms.Clipboard». В нём есть подходящий метод GetDataObject, который возвращает объект, реализующий интерфейс IDataObject (смотрим msdn). Метод GetData принимающий в качестве параметра Type нам не подходит, т.к. структуру объекта сохраняемого в буфер обмена законными способами узнать не получится, зато есть его перегрузка строку с «форматом». Это очень кстати, учитывая, что есть ещё и метод GetFormats. Итак, вот он, первый шаг к изучению того, что же Skype сохранил в буфер обмена:
private const string DataKey = "SkypeMessageFragment"; private Dictionary<string, object> clipboadData = new Dictionary<string, object>(); private string message; private void buttonLoad_Click(object sender, EventArgs e) { IDataObject iData = Clipboard.GetDataObject(); foreach (var format in iData.GetFormats()) { clipboadData[format] = iData.GetData(format); } using (StreamReader streamReader = new StreamReader(clipboadData[DataKey] as MemoryStream)) { message = streamReader.ReadToEnd(); (clipboadData[DataKey] as MemoryStream).Seek(0, SeekOrigin.Begin); } richTextBoxQuote.Text = message; }
Пишем «test text» в skype, копируем свою цитату, вставляем в окошко скайпа, чтобы убедиться, что цитата скопировалась, и выполняем код.Посмотрим прямо в дебаге, что же сохранилось в clipboardData.

Не знаю как вас, а меня очень заинтересовало значение с ключом SkypeMessageFragment, может быть потому, что оно MemoryStream, хотя в остальных просто нет ничего интересного. Итак посмотрим что же лежит в этом стриме:
private Dictionary<string, object> clipboadData = new Dictionary<string, object>(); private void buttonLoad_Click(object sender, EventArgs e) { IDataObject iData = Clipboard.GetDataObject(); foreach (var format in iData.GetFormats()) { clipboadData[format] = iData.GetData(format); } }
Запустив это, в richedit можно увидеть вот что:

Честно говоря, я подумал, что на этом моё исследование закончилось провалом. Да, тут есть автор, время отправление в unix формате, сам текст цитаты, но кроме того тут есть значение guid, где хранится какой-то хэш. Увидев этот хэш, я понял, что это, скорее всего, что-то типа hmac. В любом случае, система цитат должна работать как-то так: Skype от всех данных цитаты считает хэш по своему супер секретному алгоритму (возможно используя суперсекретный ключ) и пишет получившийся хэш в буфер обмена, а когда человек вставляет цитату в окошко и отправляет её в чат, скайп проверяет верность подписи. Теория это хорошо, но давайте проверим, а так ли это, и сделаем сохранение richEdit обратно в буфер обмена:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace SkypeQuote { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private const string DataKey = "SkypeMessageFragment"; private Dictionary<string, object> clipboadData = new Dictionary<string, object>(); private string message; private void buttonLoad_Click(object sender, EventArgs e) { IDataObject iData = Clipboard.GetDataObject(); foreach (var format in iData.GetFormats()) { clipboadData[format] = iData.GetData(format); } using (StreamReader streamReader = new StreamReader(clipboadData[DataKey] as MemoryStream)) { message = streamReader.ReadToEnd(); (clipboadData[DataKey] as MemoryStream).Seek(0, SeekOrigin.Begin); } richTextBoxQuote.Text = message; } private void buttonSave_Click(object sender, EventArgs e) { message = richTextBoxQuote.Text; MemoryStream memoryStream = new MemoryStream(); StreamWriter streamWriter = new StreamWriter(memoryStream); streamWriter.Write(message); streamWriter.Flush(); memoryStream.Seek(0, SeekOrigin.Begin); clipboadData[DataKey] = memoryStream; IDataObject iData = new DataObject(); foreach (var item in clipboadData) { iData.SetData(item.Key, item.Value); } Clipboard.SetDataObject(iData, true); } } }
При записи в stream я намеренно не использовал конструкцию using (вызов метода Dispose у streamWriter портит мой MemoryStream)Итак, запускаем программу, копируем цитату из скайпа, правим её в нашем «редакторе», жмём Save и вставляем цитату обратно в Skype.

Честно говоря, я сильно удивился, что это сработало. Нет, я, конечно, искренне надеялся, что это сработает, но удивился я очень сильно. Хотя бы из-за моей теории с hash’ом, зачем тогда этот гуид, непонятно.
Настоящая цель этой статьи – предупредить общественность, что цитатам из skype доверять нельзя. Ведь это очень мощный инструмент, которым можно оклеветать/обмануть другого человека. В общем, это новое оружие в социальной инженерии, так что будьте бдительны, и не ленитесь проверять теорию практикой.
P.S. в последней секции «code» находятся все исходники, поэтому загружать на git не стал.P.P.S. прошу прощение за чрезмерное количество отступов в коде, при включении опции «Отключить автоматические переносы строк и создание ссылок.» та же ерунда. (подсвечивал код вот этим http://highlight.hohli.com/ там всё выглядело нормально)
