
Пользователи игрового форума 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. Возможно, водяные знаки там отсутствуют.
