ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это только для информационных целей. Цель этой статьи не в том, чтобы вы взломали игру. Уважайте игру и других людей. Кроме того, если OnePlus в любое время захочет, чтобы я удалил эту статью или сценарий, я был бы рад это сделать.

И да, я достиг вершины!

Давайте начнем с самого начала.

В одну прекрасную ночь, когда я собирался спать около 2 часов ночи, я проверил свой телефон, как и любой другой нормальный человек. Я видел этот пост от OnePlus об игре. Игра, в которой вы должны нажать на свой телефон. Несколько раз для вас, чтобы выиграть его. Я попробовал, и мне быстро наскучило все это постукивание. Я думаю, что сделал более 1000 нажатий, прежде чем подумал, что это чертовски скучно.

Что не было скучным, так это сценарий, который мог сделать это за меня. Так веб-разработчик во мне подумал, давайте сделаем это! Было бы неплохо проснуться и увидеть свое имя в верхней части списка.

Запускать его на телефоне было неинтересно. Телефоны предназначены только для проверки социальных сетей, когда вам скучно. И иногда болтать с мамой. Но была проблема. Когда я открыл игру в браузере своего компьютера, она показала что-то вроде этого.

Запустить его на ПК было довольно просто. Пожалуйста, проверьте этот репозиторий для подробного руководства. Просто запуск приложения в мобильном окне просмотра с помощью инструментов отладчика сделал это за меня.

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

Поэтому они использовали веб-сокеты для связи с внутренним сервером. И Бог! было много трафика. Большая часть этого была для рангового списка лучших 10 человек. Но наверху творилось кое-что интересное. Первым, что мой браузер отправил через соединение через веб-сокет, был вызов аутентификации. Тогда для каждого тапа были отдельные вызовы с отправкой данных о тапах.

Вызов аутентификации отправляет следующие данные через веб-сокеты

{
    count: '0',
    username: "YOUR_USERNAME",
    token: "YOUR_TOKEN",
    squad: "",
    locale: "en-gb",
    csrf: "YOUR_CSRF_TOKEN"
}

Вы можете получить эти значения из сообщения аутентификации веб-сокета. См. изображение ниже.

Теперь давайте подойдем к следующей части. При каждом нажатии, которое я делал, приложение отправляло что-то подобное на серверную часть.

{
    username: "YOUR_USERNAME",
    timestamp: 1540514670833,
    touchX: 456,
    touchY: 1256
}

Это был объект, который содержит координаты X и Y прикосновения, а также отметку времени, когда были сделаны прикосновения. Единственным мотивом для захвата координат X и Y каждого касания должно быть поиск ботов и их блокировка.

Но, честно говоря, боту было проще нажимать на случайные точки экрана, чем настоящему человеку. И это действительно происходило! Людей блокировали. Настоящие люди. Которые целыми днями тыкали в свои экраны. Только чтобы понять, что они были заблокированы.

Для бота генерировать случайные числа было легко. По крайней мере, это было для моего бота благодаря этой функции, которую я сделал. Это возвращает случайное число между целым числом min и max.

function RandomBetween(min, max)
{
    return Math.floor(Math.random() * (max - min + 1) + min);
}

Мы воспользуемся этой функцией позже.

Итак, как мы можем использовать этот анализ для отправки нажатий с помощью терминала? Есть очень крутая библиотека под названием socket.io. Это позволяет вам подключаться к конечной точке веб-сокетов с помощью браузера или node.js.

Как и все хорошее в мире, давайте начнем наш проект с npm init. И установить socket.io-client .

npm install socket.io-client

Теперь создайте новый файл с именем oneplus-hack.js или как хотите. Импортируйте библиотеку socket-io, которую мы только что установили, а затем давайте воспользуемся ею для подключения к серверной части и отправки нескольких нажатий через терминал.

const socket = require('socket.io-client')
    ('socket-unlock.oneplus.com', {
        transports: ['websocket'],
        upgrade: false
    });
socket.on('connect', async () => {
    // Authenticate user on socket
    socket.emit('authenticate user',
        {
            count: '0',
            username: "YOUR_USERNAME",
            token: "YOUR_TOKEN",
            squad: "",
            locale: "en-gb",
            csrf: "YOUR_CSRF"
        },
        (error, data) => {
            if (error) {
                console.log('Could not authenticate', error);
            }
            else {
                console.log("Authenticated!");
                run();
            }
        }
    );
});

Это кажется прямым. Кроме одного, что это за загадочная функция run()? Ну, можно сказать, это мозг сценария.

emmited = 0;
async function run() {
    while (true) {
        await sleep(RandomBetween(20, 100));
        EmitTap();
        emmited += 1;
        if (emmited % 100 === 0) {
            console.log("emited: " + emmited);
        }
    }
}
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

Здесь мы ждем до вечности, а затем используем самодельную волшебную функцию ES6 sleep() для случайного засыпания от 20 до 100 мс. Это своего рода подражание поведению обычного человека, выстукивающего дерьмо из своего телефона.

Также есть еще одна функция Emitap(). Да, вы правильно поняли, он посылает сигнал!

function EmitTap() {
    socket.emit(
        'tap_logs',
        {
            username: "anandamritraj",
            timestamp: Date.now(),
            touchX: RandomBetween(30, 1900),
            touchY: RandomBetween(50,1000)
        },
        error => {
            if (error) {
                console.error(error);
                emmited = 0;
            }
        }
    );
}

Вы можете проверить весь код здесь на моем github. Теперь время для некоторых результатов! Я использовал две учетные записи с именами пользователей anandamritraj и anamritraj и запустил по 4 экземпляра каждой на своем компьютере.

Посмотрим, как я поступил в реальном мире.

У меня нет скринов того времени, когда я был до 17-го места. Но это тоже весело. Как видите, у меня два аккаунта в топ-10. Один на девятом anandamritraj и один на шестом anamritraj .

Больше скриншотов!

Если вы посмотрите на последний скриншот, anamritraj будет вверху! Это я!

Давайте посмотрим милую гифку со мной вверху. Почему бы и нет!

На этом я закончу этот длинный пост. Кроме того, это мой первый пост на Medium, так что вот краткое введение. Кроме того, я не несу ответственности за то, что вы в конечном итоге сделаете с этим скриптом. Спасибо за чтение.

Напишите мне в твиттере, если вам нравится то, что вы видите: анамритрадж.

Ссылка на Github для получения кода: https://github.com/anamritraj/oneplus-unlock-your-speed-hack