среда, 7 января 2009 г.

Ну конечно же мы умеем это делать

Это перевод Sure, we do that. Автор: Реймонд Чен.
Интерфейс видео драйвера DirectX для Windows 95 имел метод, который реализовывался каждым драйвером, с прототипом типа "function DoesDriverSupport(const guidCapability: TGUID): Bool", куда мы передавали GUID возможности, а драйвер говорил в ответ, поддерживает ли он эту возможность или нет.

Были определены GUID возможностей - такие как GUID_CanStretchAlpha, например, чтобы узнать, поддерживает ли драйвер масштабирование растра с альфа каналом.

Потом нам попался готовый драйвер, который возвращал TRUE, когда вы вызывали DoesDriverSupport(GUID_XYZ), но когда DirectDraw пытался использовать эту возможность, то вызов был неудачным (и с весьма впечатляющими эффектами).

Тогда один из разработчиков DirectDraw позвонил производителю и спросил его: "а ваша карточка поддерживает XYZ?".

Их ответ: "А что ещё такое XYZ?".

Оказалось, что их реализация DoesDriverSupport в драйвере была примерно такой:
function DoesDriverSupport(const guidCapability: TGUID): Bool; stdcall;
begin
Result := True;
end;
Иными словами, когда DirectX спрашивал "а вот это вы умеете делать?", они отвечали "ну конечно же мы умеем это делать" вообще даже без проверки, в чём же заключался вопрос.

(Наверное драйвер писал отдел продаж).

Поэтому ребята из DirectDraw изменили логику вопросов драйверу. Один из разработчиков зашёл в офис своего босса, нашёл там сетевую карту, записал с неё MAC-адрес, а затем разбил карту молотком.

Видите ли, этот последний шаг очень важен: алгоритм генерации GUID основывается на комбинации данных времени и пространства. Когда вы просите CoCreateGuid сгенерировать новый GUID, она кодирует время вашего запроса в первой части GUID, а информацию, которая уникально идентифицирует вашу машину (в том числе MAC-адрес сетевой карты, который глобально уникален благодаря стандартам, которые применяются к сетевым картам) - во вторую.

Разбив карту молотком, разработчик воспрепятствовал повторному использованию этой карты для генерации GUID.
Затем он изменил логику вопросов следующим образом: когда DirectDraw запускался, он генерировал случайный GUID на основе этой сетевой карты (который более не может существовать, т.к. его сетевую карту уничтожили) и передавал её в DoesDriverSupport. Если при этом драйвер отвечал: "да, это мы поддерживаем", то DirectDraw говорил: "Ага! Попался! Я больше не верю ни единому твоему слову.".

3 комментария:

  1. Насколько я знаю, в генерации GUID MAC-адрес больше не используется. Может быть, чтобы не допускать утечки личных данных, может по другой причине. Я уже не помню.

    ОтветитьУдалить
  2. Да, это так. В GUID вписывается "номер поколения". MAC использовался для генерации GUID только в первом варианте алгоритма.

    Можно почитать на вики (как обычно, русскоязычная вики по сравнению с английской - просто отстой).

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.