Разработка
Я взломал HQ Trivia (но вот как можно меня остановить)
HQ Trivia ежедневно разыгрывает тысячи долларов, но, как оказалось, она недостаточно защищена от взлома. Стефен Когнетта, бывший продукт менеджер Google, в этой статье описывает способ обхитрить викторину, который срабатывает в 70–80% случаев.
Одно из самых популярных приложений 2017 года, HQ Trivia, переизобретает игровые шоу. В HQ вы каждый день можете подключаться к трансляции, отвечать на вопросы и выигрывать денежные призы.
Однако приложение несет в себе значительный риск. Хакеры при помощи программ могут гуглить ответы на вопросы. Если они со своими скриптами добьются успеха, то это может разрушить игру для честных игроков.
Чтобы исследовать простоту взлома HQ, я написал скрипт, который выигрывает большинство игр. В этом посте я объясню принцип его работы и расскажу, как можно защитить приложение от подобных атак.
Этот скрипт работает по такому простому алгоритму:
- Отображает экран телефона на экране компьютера.
- Переводит изображение экрана в читаемый компьютером текст.
- Использует Google, чтобы найти ответ.
Обратите внимание: в моем примере использованы видеозаписи игры с YouTube. Использовать скрипты в самой игре запрещено.
Выделение текста
Сначала скрипт должен извлечь текст из приложения. Я подключил телефон к ноутбуку, используя встроенную функцию QuickTime и кабель Apple Lightning:
После этого я создал Python-скрипт, чтобы делать автоматические скриншоты в определенных координатах, используя команду screencapture. Затем скрипт использует Tesseract OCR library для распознавания символов и преобразует изображение в читаемый для компьютера текст.
Когда скрипт выделяет текст для вопроса и вариантов ответа, я применяю три разных подхода, которые работают с точностью от 50 до 80%. Мой финальный скрипт поддерживает все три подхода, поэтому я могу рассмотреть все варианты для принятия финального решения.
Подход 1: загуглить вопрос
Это самый интуитивный подход. Это можно сделать при помощи одной строки в Python:
В половине случаев этот подход показывает страницу результатов с готовым ответом. Но зачастую бывает сложно разобрать этот текст самостоятельно, и этот вариант не подходит для вопросов по типу «Который из этих…». Например, для подобного вопроса:
Подход 2: посчитать ответы на странице результатов
Что если мы автоматически просканируем страницу в поисках вариантов ответа? Это может быть намного быстрее. Google предоставляет Custom Search API, который позволит скрипту получить доступ к поиску Google без необходимости открывать браузер. Скрипт использует API для поиска вопроса и считает количество каждого варианта ответа, который появляется в запросе.
Иногда здесь может возникнуть недопонимание. Ответом на этот вопрос будет Мауна Кеа, но на странице несколько раз появляется Эверест. Так что тут необходимо точно понимать смысл вопроса.
Подход 3: посчитать количество результатов поиска
Последний подход использует API, чтобы искать вопрос три раза для каждого варианта ответа. Затем скрипт сравнивает количество результатов поиска, которые вы можете видеть под строкой:
Подход 3 более эффективен, но он может потерпеть неудачу. Например, взгляните на этот вопрос:
Правильным ответом будет «Сталь», но этот подход показывает «Технологии» как ответ с наибольшим количеством результатов поиска, так как эта тема популярна и чаще отображается рядом со словами «лучшие» и «акции».
Ни один из этих подходов не идеален, но использование всех трех позволили мне ответить на все 12 вопросов в 70–80% игры на YouTube. Это довольно большой показатель для приложения, разыгрывающего тысячи долларов каждый день.
Советы HQ
Вот как вы можете остановить людей, вроде меня, от взлома игры.
1. Изменить UI, чтобы предотвратить автоматическое распознавание символов
Сейчас в игре есть два формата интерфейса страницы с вопросами — до исключения игрока и после:
Видите разницу? Правый интерфейс усложняет процесс для движка Tesseract OCR, так как цвета различаются меньше. Мой скрипт обрабатывает изображение и повышает контрастность изображения. Если бы в игре было 7–10 разных форматов до исключения из игры, смогли бы ли скрипты просто повышать контрастность, чтобы улучшить распознавание? С форматами интерфейса, представленными ниже, для скрипта было бы практически невозможно извлечь текст (но, конечно, HQ нужно думать об удобстве для пользователей).
2. Вопросы, которые сложно загуглить
HQ могли бы просто усложнить вопросы, но это негативно скажется на игре. Вместо этого в каждую игру стоит включать 3–4 вопроса, которые будет сложно загуглить. Это подобные типы вопросов:
- Который из этих…
- <Число> из топ-<число> объектов…
- Насколько близко <понятие> к <понятие>
- Что это? <изображение>
- Сколько раз…
- Почему произошло…
Эти вопросы сложны, потому что требуют несколько запросов Google и несколько секунд человеческого труда по поиску ответа.
3. Скрипт для классификации вопросов
Я уверен, что HQ уже создали определенный показатель для +сложности вопросов. Помимо этого, стоит создать и запустить скрипт, подобный моему, чтобы определить, насколько легко вопрос можно взломать или загуглить. Если в каждую игру будет включаться 3–4 сложных для взлома вопроса, она будет защищена от хакеров.