html текст
All interests
  • All interests
  • Design
  • Food
  • Gadgets
  • Humor
  • News
  • Photo
  • Travel
  • Video
Click to see the next recommended page
Like it
Don't like
Add to Favorites

Изучая Skype — редактируем цитаты

По сравнению с предыдущей статьёй (которая, судя по изменениям моей кармы, не всем пришлась по нраву) эта совсем безобидная.

Можно ли доверять цитатам из 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/ там всё выглядело нормально)
Читать дальше
Twitter
Одноклассники
Мой Мир

материал с habrahabr.ru

10

      Add

      You can create thematic collections and keep, for instance, all recipes in one place so you will never lose them.

      No images found
      Previous Next 0 / 0
      500
      • Advertisement
      • Animals
      • Architecture
      • Art
      • Auto
      • Aviation
      • Books
      • Cartoons
      • Celebrities
      • Children
      • Culture
      • Design
      • Economics
      • Education
      • Entertainment
      • Fashion
      • Fitness
      • Food
      • Gadgets
      • Games
      • Health
      • History
      • Hobby
      • Humor
      • Interior
      • Moto
      • Movies
      • Music
      • Nature
      • News
      • Photo
      • Pictures
      • Politics
      • Psychology
      • Science
      • Society
      • Sport
      • Technology
      • Travel
      • Video
      • Weapons
      • Web
      • Work
        Submit
        Valid formats are JPG, PNG, GIF.
        Not more than 5 Мb, please.
        30
        surfingbird.ru/site/
        RSS format guidelines
        500
        • Advertisement
        • Animals
        • Architecture
        • Art
        • Auto
        • Aviation
        • Books
        • Cartoons
        • Celebrities
        • Children
        • Culture
        • Design
        • Economics
        • Education
        • Entertainment
        • Fashion
        • Fitness
        • Food
        • Gadgets
        • Games
        • Health
        • History
        • Hobby
        • Humor
        • Interior
        • Moto
        • Movies
        • Music
        • Nature
        • News
        • Photo
        • Pictures
        • Politics
        • Psychology
        • Science
        • Society
        • Sport
        • Technology
        • Travel
        • Video
        • Weapons
        • Web
        • Work

          Submit

          Thank you! Wait for moderation.

          Тебе это не нравится?

          You can block the domain, tag, user or channel, and we'll stop recommend it to you. You can always unblock them in your settings.

          • Raz0rU
          • домен habrahabr.ru

          Get a link

          Спасибо, твоя жалоба принята.

          Log on to Surfingbird

          Recover
          Sign up

          or

          Welcome to Surfingbird.com!

          You'll find thousands of interesting pages, photos, and videos inside.
          Join!

          • Personal
            recommendations

          • Stash
            interesting and useful stuff

          • Anywhere,
            anytime

          Do we already know you? Login or restore the password.

          Close

          Add to collection

             

            Facebook

            Ваш профиль на рассмотрении, обновите страницу через несколько секунд

            Facebook

            К сожалению, вы не попадаете под условия акции