Пользователь
30,2
рейтинг
12 сентября 2012 в 01:21

Разработка → В скриншотах игры WoW обнаружены цифровые водяные знаки (userID, time, realm)



Пользователи игрового форума OwnedCore обнаружили скрытые водяные знаки, которые автоматически внедряются в JPG-файлы, если вы делаете скриншот в игре World of Warcraft. Если сделать скриншот чистой области, открыть файл в IrfanView или каком-нибудь редакторе, увеличить резкость с максимальной настройкой фильтра, повторить процедуру несколько раз, то заметен явный паттерн, который многократно повторяется.

Пользователи уже написали программку, которая автоматически извлекает информацию из водяных знаков. Это незашифрованный текст ASCII, содержащий имя пользователя, время снятия скриншота с точностью до минуты и IP-адрес реалма, включая приватные сервера.

Таким образом, если к вам попал оригинальный скриншот из игры WoW, то вы можете восстановить имя пользователя, который его сделал, время снятия скриншота и координаты (реалм). Вероятно, это нужно компании Blizzard для расследования всяких инцидентов, связанных с нелегальной торговлей цифровыми товарами, продажей аккаунтов и другими нарушениями правил.

Программа для декодирования графических файлов: ImageToBinary.exe

Ещё одна программа на C# (требует .NET 4.5): WatermarkTool.rar



Программа на Java для извлечения цифровой метки
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.*;

public class ReadWatermark 
{
    static final int pWidth=352; // Pattern width
    static final int pHeight=240; // Pattern height
    
    static final int pxWidth=4; // Bit width
    static final int pxHeight=5; // Bit height    

    static final int bWidth=88; // Bits table width
    static final int bHeight=48; // Bits table height

    static final int Black=0xFF000000; // Black = 0
    static final int White=0xFFFFFFFF; // White = 1
    
    static final String filenameSrc = "pattern.bmp"; // Stores the filename
    
    
    public static byte[][] getPatternBits(BufferedImage image)
    {
            byte barcode[][] = new byte[bWidth][bHeight]; // Stores the bits

                for (int y=0, i=0; y<pWidth; y+=pxWidth, i++)
                    for (int x=0, j=0; x<pHeight; x+=pxHeight, j++)
                        if (image.getRGB(y+1,x)==Black)
                        // we check y+1 to target correctly (see pattern)
                                barcode[i][j]=0; // got black
                        else
                                barcode[i][j]=1; // got white
            return barcode;		
    }
    
    
    public static BufferedImage readImage(File file)
    {
            try
            {
                return (ImageIO.read(file));
            }
            catch (IOException e) 
            {
                return (null);
            }   		
    }
    
    
    public static void main(String[] args)
    {
        byte barcode[][]; // Stores the bits

        File fileSrc = new File(filenameSrc); // Create file reference

        BufferedImage imageSrc=readImage(fileSrc); // Read file

        if (imageSrc==null)
            System.exit(1); // no file found
        
        barcode=getPatternBits(imageSrc); // Get bits

        for (int i=bWidth-1; i>=0; i--)
        { // Print the pattern (1 row here is 1 column there, right to left)
            for (int j=bHeight-1; j>=0; j--)
                System.out.print(barcode[i][j]);
            System.out.println();
        }
    }
}

Как видим, среди игроков WoW есть много грамотных ребят. Они исследовали свои архивы и обнаружили, что скрытый код внедряется в скриншоты как минимум с 2008 года (Patch 3+), когда компания Blizzard была куплена Activision.

Посмотреть на код в своих скриншотах вы можете, сделав скриншот с качеством меньше 1-9, и запустив одну из вышеуказанных программ.

/console SET screenshotQuality "9"

Пока что не удалось сделать инструмент, который извлекает водяные знаки из скриншотов с качеством 10, а также из скриншотов в формате сжатия без потерь TGA. Возможно, водяные знаки там отсутствуют.
Анатолий Ализар @alizar
карма
749,5
рейтинг 30,2
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (67)

  • +4
    Я правильно понимаю, что можно ведь и удалить такой скрытый код со скриншота, а зная структуру кода — и подделать его?
    • +13
      Удалить очевидно можно.
      Подделать — не факт, могут добавлять контрольную сумму по неизвестному алгоритму.

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

      Но тут все-таки перебор, одно дело внедрять идентификационную информацию, по которой можно отследить безобразящего юзера. Другое дело вшивать в открытом виде данные о юзере, даже просто ник, не говоря уже о времени скрина и ИП юзера.
      • +7
        IP реалма (сервера), а не юзера.
        • –11
          Ник + время + сервер = ip пользователя.
          • НЛО прилетело и опубликовало эту надпись здесь
          • +3
            Каким образом?
      • +4
        Даешь закон о защите персональных данных чаров! :)
      • 0
        В открытом виде? С 2008-го года используют и только обнаружили.
  • +5
    Мне понравилась идея. С выявлением считай разобрались. А как такой знак в свои фото добавить?
    • +7
      Есть такая штука DigiMarc (есть и как плагин фотошопа) — добавляет полностью прозрачный водяной знак.
      Держится даже после рекомпрессии с пониженым качеством и размером.
  • +29
    Еще один пункт к списку «за что я уважаю команду, работающую над WoW».
    p.s. Хоть сам в нее не играю, но уже не первый раз удивляюсь этой игре и профессионализму команды.
  • +1
    Интересно, в связи с чем и каким путём были обнаружены скрытые знаки. Не на авось же кого-то прошибло: «а не выкрутить ли мне контрастность, и не повторить ли мне это несколько раз?»
    • +2
      Если человек уверен в чистоте монитора, то смотря на картинку с равномерно залитой областью может и заметить подобный шум. Ну а дальше уже подключается любознательность :)
    • 0
      Как вариант — хотели увидеть НЕЧТО, что было в тёмной области скриншота. Вместе с желаемым объектом всплыл и водяной знак.
      • 0
        Наоборот, надо снижать контрастность, чтобы прочитать тени.
        Вообще непонятно, откуда взялся контраст, когда в источнике говориться про резкость
        • +1
          Алгоритм повышения резкости может быть построен на изменении микроконтрастов локальных зон.
        • 0
          Я, как и среднестатистический анонимус, попробовал бы именно подсветить скриншот.
    • 0
      Как сказал первооткрыватель, он случайно их увидел когда заскриншотил что-то очень яркое.
  • +3
    А есть ли об этом упоминание в EULA?
    По сути ведь можно собрать некую информацию из таких картинок.
    Одно дело когда это остается внутри компании, а тут получается игрок не подозревая выкладывает эту информацию в сеть.
    Интересно будут ли иски от игроков…
    • +2
      Может быть это:
      Лицензионное соглашение с конечным пользователем World of Warcraft:
      1. <...> Любое использование Игры регулируется данным Лицензионным соглашением, Пользовательским соглашением Battle.net, а также Условиями пользования WoW, каждое из которых нужно принять до того, как вы сможете получить доступ к Услуге посредством использования учетной записи Battle.net®. <...>

      Пользовательское соглашение Battle.net:
      11.5 Сбор данных, не считающихся личными. Компания Blizzard имеет право без какого-либо уведомления собирать «не являющиеся личными» данные в отношении вашего подключения к Службе с целью определенного демографического анализа в отношении пользователей Службы.
      • +1
        собирать — не публиковать
        • +7
          И то верно. Но надо сказать, что данные-то они не публикуют.
          • +3
            и даже не собирают — данные то на скриншотах, которые вы у себя на компе храните, им на сервер вроде эти скрины не отправляются (если вы сами не зальете конечно)
            • 0
              ну, собирают они их уже по форумам, где люди демонстрируют найденные читы :-)
    • 0
      На скринах нет личных данных, даже айди внутренний.
  • –4
    Респект! Пусть яблоко учится, у братьев, дабы наказывать виновников утечек.
    • +2
      Такие методики в Apple (да и не только в Apple, собственно) применяются уже много лет.

      Например, когда первых разработчиков допустили к прототипу айпада, их предупредили, что столы, на которых лежат устройства, имеют уникальный рисунок на столешнице и поэтому легко опознаются на фотографиях, даже по частям. Это к тому, чтобы тайком фотографии не делали.
      • +18
        Специально предупредили, чтоб те газету подложили?
        • +1
          Это если только сказали правду, причём всю.
        • 0
          Именно поэтому российские разработчики к прототипам допущены не были )
      • +2
        Точно, вырезать в фотошопе то невозможно :)
        • 0
          Освещение комнаты тоже можно сделать уникальным :) (если вы параноик, то это не значит что за вами не следят)
  • –1
    У них игрушка сама создает jpeg'и? А то иначе непонятно, как такой код можно разместить в формат, сохраняющий данные с потерей информации.
    • 0
      Нет движок подсовывает постоянно. Я так понимаю. Просто невооруж глазом не видно.
    • 0
      Да, во многих играх по нажатию PrintScreen игра сохраняет скриншот в определенную папку.
      • 0
        Я обычно пользуюсь Alt-PrtScr — запуск Paint — вставить, кадрировать — сохранить как JPEG. Интересно, сохранились бы «водяные знаки» при этой процедуре.
        • +1
          Вы о чём? Во всех современных 3D-играх изображение формирует видеокарта, по этому если каким-то чудом принт-скрин и захватит средствами Windows изображение — это будет чёрный экран, но не сам скриншот. В современных же играх, это нажатие перехватывается и либо изображение сохраняется игрой в папке, либо игра в буфер обмена самостоятельно помещает скриншот (в который может быть прописано всё что угодно).
          • 0
            Я в современные 3D-игры не играю, поэтому проверить не на чем :( А скриншот, помещенный в буфер обмена, все равно будет преобразован при сохранении файла. И водяные знаки благополучно превратятся в JPEG-артефакты.
            Потом, насколько я понимаю, при использовании DirectX или OpenGL изображение тоже формирует видеокарта. Но в использующих их программах Alt-Printscreen прекрасно работает безо всяких специальных ухищрений в коде.
          • +2
            Ну а что мешает использовать стороннюю программу для снятия скриншотов в играх? К примеру HyperSnap или тот же Fraps.
            • 0
              Ни что не мешает, речь чисто про PrintScreen.
            • 0
              Один мой знакомый читер говорил, что при снятии скриншота вызывается определенная фунция DirectX, и перехватив ее, он подсовывал абсолютно чистые скриншоты
            • 0
              А теперь ещё раз прочитайте строчку, но главное, внимательно:
              В современных же играх, это нажатие перехватывается и либо изображение сохраняется игрой в папке, либо игра в буфер обмена самостоятельно помещает скриншот.

              Кроме этого, такой трюк может удаться в случае если используется программный рендеринг, что в современных 3D-играх (в частности, WoW) — нонсенс.
              • 0
                Я специально использовал TF2 ибо Source создает скриншот своими средствами при нажатии на F5, а не на print screen. Я склонен считать что средства windows для получения скриншота всё-таки просто выдирают значение из видеопамяти, а не получают изображения со всех окон после чего их компонуют.
                • 0
                  Не буду загадывать, но на XP из видеопамяти ничего не выдиралось, как в 7 дела обстоят — не в курсе.
                  • 0
                    UPD: В курсе. Точно также. Killing Floor, результат — чёрный экран.
              • +1
                Собственно, чтоб представляли как оно работает:
                В современных играх процессор больше не занимается такими вещами как отрисовка графики, просчёт моделей, их движения, поворота и т. п., по скольку это очень ресурсоёмкая задача. На себя эту задачу берёт видеокарта. Да-да, именно по этому последние 15 лет видеокарта стала не просто средством отображения картинки, именно по этому сейчас идут такие мощные видеокарты. Сама Windows в DirectX-приложениях понятия не имеет что там нарисовано, картинка сразу поступает с видеокарты на монитор, она видит просто «чёрный квадрат», т.е. область отображения данных, но не сами данные. Если нужно получить скриншот — средствами DirectX возможно получить данные с видеокарты в оперативную память, но эта задача достаточно ресурсоёмкая, по этому выполняется исключительно «по запросу» (для этого и перехватывается PrintScreen). В кругах разработчиков игр как бы вообще считается дурным тоном программирования возвращать данные с видеокарты и скриншот — это пожалуй, единственное исключение.
                В некоторых играх, в частности на стареньком движке HL (Counter-Strike 1.6 и т.п.), помимо DirectX есть возможность программного рендеринга, но обычно им не пользуются в силу большой загрузки процессора и низкого выдаваемого FPS, но там можно снимать скриншоты просто снимком экрана средствами Windows.
    • 0
      Да, по нажатию PrintScreen в определенном каталоге появляется скриншот.
    • 0
      Размещают как-то. Вон в уроках от CMIVfx код после пережатий и фильтров остается, как говорят люди, пробовавшие его затирать
  • 0
    интересно… надо будет поиграться со скринами.
  • –1
    Обмани систему printscr->run mspaint->ctrl+V, ну или fraps :)
    • 0
      Да легко.
      1. Перехватываем нажатие на PrintScreen, отправляем в буфер скорректированное изображение
      2. Генерируем водяные знаки прямо на мониторе пользователя. Обманываем вообще все, даже Fraps. Чтобы не было заметно артефактов изображения, сгенерируем эти знаки на каком нибудь разрисованном элементе интерфейса.
  • +2
    Офтопик: пришли те времена, когда крохотная утилитка для такой примитивной задачи требует каркаса на >9000 Мб. Печально, сэры!
    • +2
      Просто для разработки утилиты использован «бульдозер» с реактивными двигателями, ракетницами и защитными полями.
      На С++ вполне можно сделать бинарник размером порядка 1 МиБ при полном отсутствии несистемных зависимостей. А если вообще не пользовать фреймворки, то это будет вообще что-то около 200 КиБ, не больше.
      • 0
        Так ото ж! И я про что. Расслабили нас широкие каналы связи и готовые «кирпчики»
        • 0
          Why not, если предполагается, что этот самый каркас установлен на большинстве компьютеров?
          • +1
            Сам то я сейчас на системе, в которой этого в принципе нет (как, впрочем, и нет возможности запустить WoW), однако «предпологается» и «большинство» когда-то для себя вылечил. Был в гостях у отаку. Стоит обычный комп и куча внешних накопителей. Надо было что-то зафиксировать и распечатать. И тут я впервые увидел в своей жизни виндоуз ХР без офисного пакета. Человек открыл вордпад и сделал что надо. Я посмотрел что у него установлено и открыл для себя, что очень много программ «предположительно установленных у большинства» по сути не нужны, если ты не в учреждении работаешь. Ему просто обработка документов не нужна для просомтра аниме и работы с сабами. Было это давно и с тех пор немного шире смотрю на «естьу всех».

            К тому же, зачем делать .exe с .NET если можно запилить на флеше, там тоже можно это сделать. А флеш на большем количестве устройств поддерживается ;-)

            Понятное дело, что в данном случае что человек умеет, что под рукой то и сделал. Но печальная тенденция разработки мелких штучек объёмами передовых игр 98 года напрягает любого, кто когда-то делал (даже в паскале) утилитки на дискету, чтобы еще и ДОС влез.
      • +1
        А когда я был маленьким, я делал экзешники в 1 или 2 килобайта вроде :) Относительно функциональные приложения укладывались в десятки килобайтов. И то недоумевал, что там пишется, это же НЕСКОЛЬКО ТЫСЯЧ БАЙТОВ! Поэтому мне очень нравились .com приложения, в которых не было ничего лишнего. Есть в этом своя эстетика.
  • –1
    Чётко придумали.
  • –2
    круто
  • 0
    61 комментарий и ещё никто не написал про белорусские метки на скриншотах World of Tanks? Исправляем :)

    Они там таки есть, примерно по тому же принципу. С их помощью, в частности, ловили за руку недопросовестных супертестеров, подписавших NDA, а потом сливавших скриншоты :)
  • 0
    Там ID аккаунта, не имя пользователя. Чтобы сопоставить одно с другим нужно иметь доступ к базам Близзарда.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.