Как взломать веб-браузерные игры/Canvas

Sbenny.com доверяют 1,327,112 XNUMX XNUMX счастливых пользователей с 2014 года.
Зарегистрируйтесь

ТДСтюарт

Начинающий Уровень 1️⃣
Участник 6 лет
Как взломать браузерные игры
Я рекомендую изучить javascript / иметь некоторые знания в области программирования.
Примечание. Это не полное руководство по взлому браузерных игр, хотя оно должно помочь вам на пути к взлому веб-игр. Кроме того, я не эксперт и говорю о большинстве этих вещей по памяти, поэтому, если что-то не так, пожалуйста, поправьте меня!


Начнем с основ, JavaScript.

Что такое javascript и как он связан со взломом игр?
Большинство игр, написанных для вашего браузера, написаны на JavaScript, в отличие от большинства языков программирования, на которых написаны игры, JavaScript не компилируется перед выполнением. Ну и зачем нам это? Ну, это означает, что ваши традиционные методы взлома памяти не будут очень полезны. Это связано с тем, что javascript компилируется во время выполнения, поэтому вы не можете просто редактировать ассемблерный код, например, для инъекции. Не говоря уже о том, что ваш браузер не выделяет память программе javascript каждый раз в одном и том же месте, поэтому указатели на самом деле не существуют. Хотя вы можете заставить чит-движок работать с javascript-играми, это не тот инструмент, который вам действительно нужен.

Итак, как вы взламываете javascript-игры, спросите вы. Что ж, поскольку javascript не скомпилирован, он имеет гораздо более удобочитаемый формат, вы также можете легко внести изменения в код, и браузер запустит его. Итак, давайте рассмотрим пример функции для javascript-игры, которая имеет дело со здоровьем игрока.

JavaScript:
function damagePlayer(playerObject, damageValue){
    updatePlayerHealth(playerObject, (playerObject.health - damageValue) );
}

function updatePlayerHealth(playerObject, healthValue){
    playerObject.health = healthValue;
    Game.overlay.gui.healthText.value = playerObject.health;
    Game.overlay.gui.healthBar.value = playerObject.health;
}
В приведенном выше коде мы видим функцию с именем updatePlayerHealth, которая применяет изменения к здоровью нашего игрока и обновляет графический интерфейс. Ну, если вы используете чит-движок для обычной игры, вы найдете playerObject.health = healthValue; строка будет строкой, которая записывает значение здоровья игрока. Вы можете просто перезаписать это значением 100 вместо нового healthValue. Таким образом, у вас всегда будет 100 единиц здоровья. Ну, в javascript вы делаете то же самое! Ваш код для функции updatePlayerHealth будет выглядеть так:

JavaScript:
function updatePlayerHealth(playerObject, healthValue){
    playerObject.health = 100;
    Game.overlay.gui.healthText.value = playerObject.health;
    Game.overlay.gui.healthBar.value = playerObject.health;
}
Как редактировать и внедрять JavaScript!
Итак, редактировать javascript довольно просто, так как же начать редактировать javascript целевой игры, чтобы он делал то, что вы хотите? Ну, во-первых, возьмите копию кода игры. Вы можете сделать это, открыв инструменты разработчика в своем браузере (например, Chrome Dev Tools) и перейдя на вкладку источников, чтобы найти код игры. Обычно он помечен как таковой и представляет собой довольно большой файл. Затем вы можете загрузить его и открыть в текстовом редакторе (код выглядит странно/компактным? Ну, код может быть минимизирован или запутан, продолжайте читать, чтобы понять, как вы с этим справляетесь!). Теперь, когда он у вас есть в текстовом редакторе, вы можете найти код, который хотите отредактировать, и переписать его. (Обратите внимание, что в большинстве онлайн-игр есть проверки сервера, поэтому подумайте об этом, прежде чем пробовать режим бога в онлайн-шутере. Позже я расскажу об отладке кода javascript, чтобы найти то, что вы хотите отредактировать!) Хорошо, теперь, когда вы внесли изменения в code, как заставить его загружаться при переходе на сайт. Что ж, это подводит нас к инъекции.

Есть довольно много инструментов, которые вы можете использовать для внедрения javascript: расширения chrome и tampermonkey. Начнем с расширений для хрома. Расширения Chrome позволяют нам загружать код в браузер. Мы можем использовать расширения Chrome, чтобы заблокировать исходный файл кода игры, а затем загрузить наш пользовательский код игры со сценариями контента (погуглите, как это сделать!). Вы также можете использовать tampermonkey, чтобы заблокировать исходный код и загрузить наш собственный код. Лучший способ загрузить пользовательский код — через веб-сайт, поэтому загрузите файл в что-то вроде Dropbox. (если вы используете Dropbox, вам нужно будет использовать dl.dropboxusercontent.com вместо dropbox.com для URL-адреса вашего файла!). Затем вы можете использовать свой URL-адрес в теге сценария HTML для загрузки кода javascript.


Не редактируй, Крюк!
Не хотите вручную редактировать и повторно загружать код javascript только для того, чтобы беспокоиться о том, чтобы добавить его обратно в игру? Что ж, тогда вы можете просто подключить функции javascript! Так что же такое перехват функций javascript? Ну, сначала позвольте мне объяснить основы областей видимости javascript. Глобальная область доступна любому коду, и вы можете использовать объект окна, чтобы ссылаться на него напрямую. Локальные области являются областями функций и содержат переменные, определенные в функции. К локальным областям нельзя получить доступ с помощью кода, который не находится в области, если свойство не задано кодом, который находится в области. Давайте посмотрим на пример!

JavaScript:
function myFunction(){ // myFunction is defined in the Global Scope.
    let myPrivateArray = []; // myPrivateArray is defined in the Local Scope.
    myPrivateArray.push("Secret Value LOL");
    console.log(myPrivateArray); // Logs : ["Secret Value LOL"]
}

myFunction(); // Runs the function.

console.log(myPrivateArray); // myPrivateArray is undefined and throws an error.
Итак, здесь мы видим, что у нас есть локальная переменная myPrivateArray. Давайте представим, что это какой-то код игры, к которому мы хотим получить доступ. К сожалению, без прямого редактирования кода мы не можем... или можем? Вот тут-то и появляются ловушки. Основная концепция заключается в том, что вы перехватываете глобальную функцию, которой передается некоторая локальная переменная, к которой вы хотите получить доступ. В таком случае Array.prototype.push и console.log обе глобальные функции, которые мы можем перехватить. Итак, давайте посмотрим на крючок.

JavaScript:
// Make an Array.prototype.push hook!
const oldArrayPush = Array.prototype.push; // Grab original function
Array.prototype.push = function(){ // Redefine the function
    if (arguments[0] == "Secret Value LOL"){ // arguments is an array with arguments passed to the function!
        arguments[0] = "Hooked the array push!"; // Edit the argument
    }
    oldArrayPush.apply(this, arguments); // Use .apply to continue as normal

}

// Make a console.log hook!
const oldConsoleLog = console.log;
console.log = function(){
    if ( Array.isArray(arguments[0]) ){ // Check if argument is array
        arguments[0].push("Modified the array with a hooked console.log!"); // Modify argument!
    }
    oldConsoleLog.apply(this, arguments)
}
И давайте посмотрим на вывод исходного кода, а затем на вывод после того, как у нас есть хук.

JavaScript:
// Output of myFunction() before hook :
-> ["Secret Value LOL"]

// Output of myFunction() after hook :
-> (2) ["Hooked the array push!", "Modified the array with a hooked console.log!"]
Итак, мы перехватили и изменили переменные в локальной области видимости, к которым у нас не было доступа! При взломе реальных игр вам нужно тщательно искать хорошие ловушки, помните, что вы можете перехватывать ЛЮБЫЕ глобальные функции, а не только стандартные вызовы API браузера. Следите за любыми модификаторами Array, так как они могут отображать не только переменную, представленную в аргументах, но вы также можете захватить и изменить весь массив, используя this ключевое слово (модификаторы объекта также могут быть полезны, хотя и реже).

Помните, что найти хуки может быть сложно, и это может быть более болезненно, чем переписывание кода, но вам не придется беспокоиться об обновлении измененного кода клиента или загрузке кода. Вы также можете просто добавить его в сценарий tampermonkey, и он должен работать как шарм.


Краткое примечание об отладке JavaScript
Если вам трудно отлаживать javascript, попробуйте посмотреть, как игра получает входные данные. Это довольно стандартизированный процесс, и вы сможете найти его довольно быстро. Еще одна вещь, которую вы можете сделать, это зацепить Array.prototype.push и надеюсь, что нужное значение будет помещено в массив. Вы также можете попробовать выяснить, какой движок рендеринга использует игра, и попытаться выяснить, когда игра вызывает функции рендеринга. Вы можете использовать это, например, чтобы узнать, когда игра рендерит игрока. Chrome DevTools удобен при отладке javascript и дает вам удобный доступ для просмотра стека вызовов и доступа к области, в которой был вызван код.

WASM и почему это заставляет меня плакать
WASM расшифровывается как Web Assembly и, к сожалению, используется в некоторых браузерных играх. Подождите минутку, это звучит потрясающе, позвольте мне вытащить чит-движок и Ida Pro, и мы приступим к взлому! Ну, черт возьми, я бы хотел, чтобы это было так просто. WASM — это не ассемблер, и он имеет все проблемы с модификацией памяти, которые есть в JavaScript (хотя в чит-движке проще искать значения, но указатели бесполезны). WASM обладает всеми неудобочитаемостью обычного ассемблера, но это как-то смущает меня еще больше, хотя кажется, что его должно быть легче читать. Позвольте мне быть честным, я действительно не знаю, как программировать в WASM, но даже если бы я знал, это не имело бы большого значения, поскольку большинство игр WASM включают игровой движок в код WASM, а это означает, что код может быть примерно таким. 11 миллионов строк (для одной игры на основе Unity, в которую я играл).

WASM гораздо хуже взломать, чем javascript или даже обычные игры, скомпилированные на ассемблере. Это по 3 причинам: 1 это действительно трудно читать, 2 адреса памяти меняются/нет указателей и 3 практически отсутствуют инструменты отладки. Это чрезвычайно усложняет работу с 11 миллионами строк кода.

К счастью, есть спаситель, Cetus. Cetus — это ОЧЕНЬ урезанная версия чит-движка для wasm. Он работает в браузере как расширение для Google Chrome. Он позволяет искать в памяти любые программы wasm, работающие в браузере. Вы можете переписывать значения, «блокировать» значения, узнавать, что читает/пишет, и исправлять код. Cetus также имеет форму скоростного хака, который может работать во многих играх. Как только вы найдете код, который изменяет значение с Cetus, вы можете отредактировать его и сделать патч. При следующем обновлении патч будет применен, и исполняемый код будет изменен.

Проблемы возникают, когда вы хотите пропустить использование Cetus для загрузки модификаций кода (Cetus вызвал замедление работы одной игры, но это может быть связано с ошибкой). Проблема двоякая: во-первых, найти правильный код для модификации, а во-вторых, заменить исходный wasm. Код, отображаемый в Cetus, на самом деле не WASM (wasm в двоичном формате, а не текст), а на самом деле WAST (wast — это текстовая версия wasm). Проблема заключается в том, что некоторые программы wasm to wast интерпретируют wasm по-разному и могут переименовывать переменные и тому подобное, чтобы попытаться помочь вам, что может затруднить поиск точного кода. Цетус дает номер функции, который должен быть одинаковым для всех пустошей, хотя я видел, что Цетус был на 2-3 числа выше, чем то, что я нашел в пустошах, но это все равно должно вам значительно помочь. Еще одна проблема с ручным редактированием отходов заключается в том, что файлы очень большие. Большинство текстовых редакторов испытывают значительные затруднения, а некоторые отказываются открываться (я использовал VSCode). Компиляция wast в wasm также может быть проблемой. После того, как вы изменили wast и превратили его обратно в wasm, вы должны загрузить его, чтобы ваша игра могла его загрузить и запустить. Проблема в том, что теперь вам нужно немного взломать javascript, чтобы заставить загрузчик javascript wasm загрузить ваш код wasm.

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

К сожалению, в играх с javascript используется еще одна техника, называемая запутыванием. Когда все сделано правильно, это может быть довольно эффективно, но если вы потратите немного времени на то, чтобы определить, какие функции должны выполняться, и проследите за стеком вызовов, вы все равно сможете получить хорошее представление о том, что делает код. я также рекомендую этой это веб-сайт, на котором запущен проект под названием de4js, который пытается деобфусцировать javascript. Он может делать довольно хорошую работу, и это должно быть вашим первым шагом при работе с обфусцированным javascript.
Код также минимизируется, если код просто минимизирован, простой js-beautifier поможет очистить код. Google Chromes Code Beautifier отлично справляется со своей задачей.

Еще один метод борьбы с читерством, о котором я расскажу, — это игры, использующие .toString() метод для проверки того, была ли изменена функция (в частности, проверка того, была ли функция перехвачена). Вы можете обойти это вручную, установив .toString() к оригиналу .toString().

Если вы хотите посмотреть на более продвинутые методы борьбы с читами, я рекомендую посмотреть эта страница на гитхабе рассказывая об игровом кранкере и методах борьбы с читами, которые они использовали (в конце концов, игра перевела всю свою игру на WASM, который очень сложно отменить, как упоминалось выше). Krunker — самый продвинутый античит, который я видел, и не является эталоном, а с тех пор, как игра обновилась, у меня не хватило личного опыта, чтобы уверенно их покрыть. Я бы предпочел, чтобы вы зашли на эту страницу github или погуглили о методах защиты от читов krunker.


Хорошо, вот и все, это руководство по взлому браузерных игр. Если вас что-то смутило... GOOGLE IT! Многие из вещей, о которых я говорил, вы можете найти в Google и найти помощь. Я знаю, что здесь, вероятно, не так уж много людей, заинтересованных в взломе браузерных игр, но если это может привлечь тысячи просмотров на yt, я подумал, что, возможно, кому-то это будет интересно. Есть и другие вещи, которые вы можете сделать заранее, и я очень рекомендую ознакомиться со статьей Krunker о борьбе с мошенничеством, так как она написана людьми, которым действительно пришлось много потрудиться, чтобы обойти анти-чит и найти хорошие способы внедрения и редактирования кода. К сожалению, если ваша игра находится в WASM и вы пытаетесь сделать голбота, это будет сложно для вас, и в этот момент я рекомендую вам взглянуть на более традиционные средства взлома игр и попытаться найти значения игроков в чит-движок, затем найдите код чтения/записи с помощью Cetus, имейте в виду, что вы, вероятно, захотите перехватить и экспортировать эти переменные в javascript для выполнения традиционных кодов/вычислений аимбота.
 
Топовое