Как взломать вампира или История одного нубохака / Игры :: Истории :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

geek Игры story 

Как взломать вампира или История одного нубохака

Пролог

Пару лет назад на просторах интернета столкнулся с многообещающей игрой с фурри-проном в вампирской тематике. Игра называлась (и называется) “Vampire Life”. Вампирскую тематику я люблю, рпг уважаю, название намекает на некий симулятор, что тоже неплохо, а вот фурри прон мне заходит ситуативно, т.к многие автора плохо видят границу с зооеблей. Пожалуй, решающим аргументом в пользу скачивания стала необычная рисовка: мультяшная, будто рисовали кисточкой, без нарочитого нарушения пропорций тел и черт лица, чем нынче грешат (грешили и будут грешить) многие ленивые художники называя это “авторским стилем”. В описании на торрентах создатель честно предупредил что в игре присутствует гринд… нет, не так - много гринда, и это несколько настораживало, но я все же решил рискнуть, в конце концов - гринд гринду рознь, и как показало время страхи были не беспочвенными.

Часть 1: Суть игры и мотивация к взлому

Сама игра выполнена на (в?) рпгмэйкере, управление интуитивное, уже в то время (пару лет назад)  в игре большинство стоковых ассетов было заменено, что делало визуал более свежим, приятным и приближало его к сеттингу. Сам протагонист - вампир, который проснулся в своем “логове” (на деле - грязной пещере), будучи голым, нищим и потерявшим всю свою силу, навыки и память (если таковые были) за время сна. Клише конечно, но, будем откровенны, большинство сюжетных ходов было изобретено еще в античные времена, так что на данный момент все зависит главным образом от авторской подачи. Вампир знакомится со своей верной, но бестолковой слугой, с жителями поселения которое находится на выходе из логова и решает зарабатывать на жизнь отловом и продажей в рабство/на опыты фурри-розбійників (называемых в игре морфами), что в обилии обитают в тамошних местах, параллельно поебывая тех самых фурри, по возможности не обходя стороной и обычных неписей.Игра обладает множеством механик: потребности (еда, вода, сон, иммунитет), шмотки и оружие, их заточка, крафт, отстройка логова, отношение с неписями, прокачка навыков, зелья, артефакты и т.д., что, хоть и может крепко увлечь на первых порах, в дальнейшем становится рутиной и источником необходимости гриндить для получения новых элементов прогрессии  все больше и больше (в оффлайн игре!).С первых секунд игры появляется ощущения что тебя троллят.., нет - откровенно издеваются. Причем не как над персонажем, а как над игроком, и в дальнейшем эти ощущения только усиливаются. Регулярно возникают игровые ситуации, которые требуют значительной прокачки (явно больше чем может иметь игрок попавший в них на старте) или метаинформации, и в случае провала значительно тормозят прогресс игры (еще больше гринда). Самого гринда много: мало лута, мобы имеют рандомные статы, требования по ресурсам для прогрессии значительные. И по мере самой прогрессии только растут. При таких вводных очевидно, что накрутить себе нужных параметров условным артмани становится удобным решением для пропуска дрочи (в плохом смысле), и переходу непосредственно к новой порции контента. И тут меня ждал сюрприз: разработчик озаботился защитой от желающих срезать углы.

Часть 2:  Взлом начинается

Так как никакие попытки найти нужные мне значения с использованием тулзов проде читэнжина или артмани не увенчались успехом (и я позже поясню почему), была предпринята попытка модификации сейв файла. Благо что движок популярный - онлайн эдиторы присутствуют, а сам сейв должен являть собой сырой JSON (в теории). В реальности, меня в этот раз постигла неудача - онлайн тулза для модификации сохранений упорно рапортовала об ошибке чтения. Решил заглянуть в сам файл и поглядеть что там не так, и таки что я там вижу? Строка из букв разных кейсов, крайне похожая на нечто заэнкоженное в Base64. Но увы, походить не значит являться (АУФ!) - снова неудача. К тому моменту мной уже плотно овладел азарт, мне было пофиг на геймплей, я хотел решить этот пазл, и очевидно низкий технический уровень разработчика, который просматривался сквозь декорации игры давал надежду что у меня получится. Не можем прочитать сейв? Тогда бы почему не открыть сам проект?Ищу в стиме Rpgmaker MZ, смотрю на цену, вспоминаю что я далеко не самый состоятельный человек в нищей восточноевропейской стране, и отправляюсь в зеленый стим. Ставлю и вылечиваю Мэйкер, создаю новый проект и копирую в него ресурсы из игры. Чуда не произошло - ресурсы не читаются. Открываю файлы ресурсов - там те же закодированные строки заместо джейсонов, как и в сейвах. Т.к чудес очевидно не бывает, и игра все-же должна как-то уметь читать свои же ресурсы, то она явно хранит в себе некий декриптор или декодер который превращает буквенное месиво в джейсон. Пришла пора лезть в код.

1
|YobwRAlgJiTiBcYBcCmBnBYA0YDu0EAs4AGLfJCAc33VhMSQA8EBlCALyTgEYA2LAIwCGAYwDWFAE4B7AK4A7GLAAsWAGZS5CAGIj08AEpaA+gGkJg;>	2 * v
s£jIA2SCUflIKlwRMz0mcMAB0vw4ACYAXQAVVAQfPyJArzkIOXUAQh8IYABnQLdkJn9PCICQsLyomLjE5LSMrAgUAFlBORlBKlYOOFUmlCQAXwxwaE9kNBysXCgCYlJyKho6LJZ2PS4VMCExSVkFOGXlTRlhPQarKyw5;>

Как выглядели ресурсы игры 


Часть 3: Пора кодить

Как в любом приличном проекте на рпгмэйкере , в файлах игры лежит движок, написанный на JS, и который, как я подозревал, был модифицирован автором игры для защиты от взлома и модификации. Хоть я и большую часть времени я пишу на Java, в моей жизни было два года, когда я работал на проекте где приходилось совмещать 50/50 джаву с Node JS. Научившись в свое время отличать асинк от авэйта, промис от колбэка, и запомнив все 6 (или 7?) типов которые существуют в JS я подходил к разбору кода со сдержанным оптимизмом. Который чуть было не иссяк стоило мне увидеть код. ВСЕ было написано на прототипах, на которых писал еще мой прадед в перерывах между охотой на мамонтовую фауну и наскальной живописью. Было ли то результатом некой компиляции из typescript либо невозможностью (или нежеланием, что по сути одно и то же) разработчиков движка добавить в него поддержку es6 я не знал, да и к сути задачи оно не относилось. Через непродолжительное время копания в коде, мною было обнаружено что весь кастомный код содержится в папке /plugins, что весьма логично, в коде есть захардкоженный список ресурсов которые енкриптятся особо, а искомый декриптор, очевидно кастомный, созданный автором игры, хранится в PKD_Protector.js. 

(function (_0xl970dd, _0x59c80l) {
Var _0X54646C function (_0X480£/95) { if ('LoesR' _0xfal0('0x4€')) {
if (_0x403l(_0xfal0('0x20')) _0xfal0('0x4f')) { if (_0xfal0('0x50') _0xfal0('0x51')) {
(_0X27b4(_0x4031(_0xfal0('0X35')))	_0X4031(_0xfal0('0x4c'))) {
_0x59e20b
Фрагмент того самого обфусцированного протектора

К слову, в процессе перебора исходников пришло понимание почему в артмани не работает поиск: каждая переменная в памяти игры хранится в двух полях. Условно А и Б. Истинное_значение = A - Б, где Б генерируется случайно при каждом изменении переменной. Таким образом, для поиска условного артмани обе цифры в памяти меняются как-бы случайным образом. Или не меняются, т.к рандом может и совпасть.


И как всегда ложка дегтя: код декриптора был обфусцирован (переписан с сохранением синтаксиса языка, но в нечитабельной для человека форме). Это уже успех - запустив этот скрипт можно получить чистые исходники ресурсов для последующего их открытия в Rpgmaker MZ. В теории. Но на практике посмотреть и изменить ресурсы и скрипты игрового процесса мало - нужно еще вложить их на старое место предварительно зашифровав обратно. А для этого нужен был алгоритм шифрования. Обфусцированного кода всего 300 строк, что очень немного. Расставляю брейкпоинты, запускаю дебаггер помечаю используемые строчки кода и значения. Спустя полчаса алгоритм дешифрования найден и переписан в явном виде (всего в 20 строк). Еще 3 минуты на написание и проверку обратного алгоритма. Запустил сразу на все содержимое папки /data, и получил исходники ресурсов. Теперь (наконец-то!) можно переходить в Rpgmaker MZ и насладится творчеством разработчика.

function parseCinputString) {
try {
var keyStn = "DataManager" var result = "; var keyShift = 0;
for (var b = 0; b <| inputstring.length; ++b) { result += String.fromCharCodeC
codes: inputstring.charCodeAt(b) - keyStr.charCodeAt(keyShift)); keyShift++;
!if (keyShift === keyStr.length) {

 Как было оно было задумано разработчиком (логика сохранен)


Часть 4: Глубже в кроличью нору

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

Variable Selector
X
Variables
[	1821	1840	]
[	1841	1860	]
[	1861	1880	]
[	1881	1900	]
[	1901	1920	]
[	1921	1940	]
[	1941	I960	]
[	1961	1980	]
[	1981	2000	]
[	2001	2020	]
[	2021	2040	]
[	2041	2060	]
[	2061	2080	]
[	2081	2100	]
[	2101	2120	]
[	2121	■ 2140	]
[	2141	■ 2160	]
[	2161

[
"Klesi",
0.15|
],
[
"Торог",
0.15
],
[
"0tmi4ka"
0.25
],
[
"Nary4nik
[...i,
0.2
],,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,Игры,Истории

♦Label : нач
♦If : ЛевелПостоянный = 1 ♦If : ПлохТрейтДефицитВнимания = 1 ♦if : уровеньСчет > 6000
♦Control Variables : #2152 ОпытРезервация = уровеньСчет ♦Control Variables : #2152 ОпытРезервация -= 6000 ♦Control Variables : #0261 ЛевелПостоянный = 2 ♦Control Variables : #0301 ОчкиУровня += 2

♦If : ЛевелПостоянный = 72 ♦If : ПлохТрейтДефицитВнимания = 1 ♦if : уровеньСчет 2 9999999
♦Control Variables : #2152 ОпытРезервация = уровеньСчет ♦Control Variables : #2152 ОпытРезервация -= 9999999 ♦Control Variables : #0261 ЛевелПостоянный = 73 ♦Control Variables : #0301 ОчкиУровня += 1 ♦Jump


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

Часть 5: Выводы

Мне очень понравилась концепция заложенная в игру “Vampire Life”, у проекта хорошие интенции, и мне жаль что местами проект портит неуместный йумор и баланс настроенный на гринд. Сам проект висит на патроне уже б-г знает сколько и как по мне, разработчику пока остановится с новым контентом, потратить время на починку старого, выправить баланс и релизится с чистой совестью. На полноценную игру контента хватит с головой, хватит сосать из патронов шекели. Удачи разрабу во всем, надеюсь мой пост будет компенсацией за то, что поиграл в версию с разблокированными возможностями так и не занеся ему денег

P.S. Этот пост должен был выйти в день моей днюхи, но слегка запоздал. Не являясь активным участником срачей или контентмейкером реактора я посчитал нужным вместо фотки кота, торта и монитора (у меня и кота то нет), что было бы крайне неуместно и нагло с моей стороны, угостить честной люд вкусным контентом - так будет правильно


Подробнее
1 |YobwRAlgJiTiBcYBcCmBnBYA0YDu0EAs4AGLfJCAc33VhMSQA8EBlCALyTgEYA2LAIwCGAYwDWFAE4B7AK4A7GLAAsWAGZS5CAGIj08AEpaA+gGkJg;> 2 * v s£jIA2SCUflIKlwRMz0mcMAB0vw4ACYAXQAVVAQfPyJArzkIOXUAQh8IYABnQLdkJn9PCICQsLyomLjE5LSMrAgUAFlBORlBKlYOOFUmlCQAXwxwaE9kNBysXCgCYlJyKho6LJZ2PS4VMCExSVkFOGXlTRlhPQarKyw5;> 43N9gJQK0JVT/G, ^/8i6Nj4qXv7pK8UmóeACSQjqQJIHAkGgsHgiGQqGQzKMBA5eB5Sóhaó3eóPEovNó3D5fdIxP4A6HEk(nk01uaplBpNFpódpWTo9PqKMBmKQANwACm5RuNYABaLipOhkSjUCbueatWBLAQicTSeSKbYabS6OCHY6Ss5;> vbS6ALBBAAIggD4QQBMIIAZEAABIA0EEAHCAmo2AIRBALwgRsAzCBGjFeLrlXgATmiXgAwgEuIElEQiABqGI+YMAdgDKX8/lDhtNgAYQE3pwDyIBbADwg6ad6dgFtjFUjXAArABSMsJ8r, ^+SuXQAYIHin8ABhECdNodgFYQB01svpCsl2HZHUXQIAQViAFsnihb+FYpFIoJ7vZ9gH6A8GU2GI9G5HXEwFdwAhJcrgCeFqpggHQfLVdrD/rG8blwAkjOZ/IIAhL/ewZDk^ <;+FKlPUjTNAsbQdN0vSQCybLsgAcjyeCEAKQoilM4q0CccK0twyyrAqGzKinoqp7AclhaqciLnPqxrmhagDIIO2BYujagAsIOma4+jw/plruAAc+Axi+x7JqmjGZjm^ <5,+aFsWpYPk0jbPvGElNoErYdl2vb9opQGBJGKmjvC46XD8MhznIUjQAuF6rucxRenxAkPsJomHuJDZnvZ163oB5YqUeDYaV+P6xP;> v*AXKSOVRgdSkHSvSjJwf08CIQAGqhYzoYKwqTGKMx4UwBEykR8rrEqWzkbs6qwJqRU0N49GBGmTGADggRpOoAgiAOgaPGOQG64pFuginhlW;> JgecFb67qlMm5uxCmDoZqQllNSYaVpnbdn2UXLTFkoIkluqBDUGhoLYdnLg5kSDS524hoE42TV502hueVl+fUd76eWK2qcAr7rZ+36, JpFPlDn9oFUhBJVJbBzKeJyEhIGwzBZXyWEFRKcwlbKKzlYqmzKNVar7BqlENWZgSAPgggDcIEagCiIEagCcIBagD8IAaPaA0wgPYGlmDp2rxG5cHGoZHlwUZiQZgDoI0mgCSIDacvpn2Fr2qrnN5rniXU9oAXCBdeniA, <iB0ZZRCZhlIoEp6CFAFrCBoUBSDOQvDaL90JhLB5LUjUjIMICAoBaUAyBIcQUBanQMEbD4m7F0M01BsBw0y8GI8jbAoSMaESqK0zY/h8d48RFVEyqNVk3VFPanRx2ALggRoGgWtNink6gDSIKzHPc7zl? ^/OCwNPhDZuLtHuGHtKYEssK0rKtqyaGta7r+uR8G0cHVTSFSBIc5WDbdsO07/di+JQ9SxUXs+37AdByHYeMAvwBL5SAFx41MFJ61YBIyjmUZ91WfYYVkq42VNYhMyJgB2KTKiRxKZVwnNTTmPM^ <5,+bpgFiaXeI03JjUrM9NSgBiEDzD2J0ZpAASIMrB0FoiHdQtFzdMgBGECNLTPsloTRAN5jaQA4iA9i6jrFmFoaF0K5vgwAciAWiLIpPw6QJZEGrKbKmgZtóOx7s5YW,? jF7q7irJgicgBaEEACIgmjdb9iPgmHBeDCHENIYWLqFDqG0PoarJhBpWHsM4azHh3MBFCPTCIioIlJExwfglOkz8UoslPHEdAX8Mb5Rzrhf, <5,++dAEkUqsTUBFFarlUrkdCcgBEEBtE6B0KClGjUCHGNRCZq7phlrTdMnFm5Zj7FlXMwÍ2arak5oANhBOJ^KdO2QRLD0w9UtL2cpMRAAoILTOpóZóZNLwTaXM^ ^/ILSOhlsaZmvYLQ9UQe2cx5sAAUXUACUeQEyljkDaVWzcqHMMWQ0óePYWltI6RaLpPSLR9P6ovSoy9oGXEtgoQQFAkC5NcjuUMhTJaeTUpOAADqCqwEAkDWlVFIC0BAkAB0EHOb51tQUuAQBaKQqh4VkAXFeMSfgEwf>? <ijkFiiQUALoIDhYIcFVhrzTKkKCpApK0CCAQDIf2M5mUyAtJsrZ+z6jW0óDYX2FpBBIpRdCi0óKJCYuxbixF^ ^/ACVRxeffeKsMAkI3gAAeX4CjdGOU8pgGzjhWYedpQFwJqRKqiTS4QJonCKmgA8EBOVzHhdp0z8Llj2HsvzlFjQjECo8sCexs3THlB0zd2Z2NwU6bMPY8zNx7BaTiwyLR0LYV2XMtN;> v*FUObgzbhV;jmYGykW8wInJBBxFEBAI4tgUB+vyeIoN4kAAiEgZAUH9hyqVVL4XIzZWKuQ150VxBLT49V8dE6BM8ME72EBRAGrgPyIlJq, j44xiXKIBlqElgMouTSBqTzaAAQQbJNoqE2kdDaHWDa0GPQms2tSIaw0RqjRzG0sb42JuTain7NPZM2TO4aU3sdjRlN3zRaLJOidaADEQG0xbSlpMuNOBAEB+AQDncIG9, Jy71FMCG2jtXbOjW17QgftmLVjIGDvOUoSBfbobkCgMdkAAow0nZq5O8BkMQEXQKFdv9c7FQ3fjLd8SS7gP3QójwZaT0ClGXQg0ro8FYYek24ej7ObPsQa^ ^+iíiNeDPlJpTWmhp3ETR0Kzem3NAG5O81dHBpjcwzbNSA00GwEhvirieRup3OójbAlqYBnh9tnaLTduI3ClAMhwXIxQP7eol5nO2AoFCxjUNfEaoZPDDjYAuPsggKAMJhrMaRLNYJilsSiAgN3ckiutFEOBBk3aG0BpVnKZ7 ^UT5/RNMNPhq09G99umE36Z/emv9EzcwmgaósluBbIO61g/BhqDnjpZZyxy5rAbcP^cC8F+FcLSNIAHdl8wm8aN0bOkxtVrGn5pZfiyH¿ínIUA8YKóahqADNlxOLiTPd5cD3VfNinlUZRpk080bgDziddTRmmzCtwIGCHl^ ^+Z8AAUR+AEJQ3w2vNióg0xuXMMxdmTYAWRAHRuiNBQnsjcRuFsEXkCWgQnQ9ntFzPMRomkugQ+bAAMqgToEgLR/CaAQC0nI50aEh9D3zr4EdI5R8CvzwR8DVGlYL01whójWXI4izbcQt4ziEAgU7LHH7+Mu9O^ <;+AwSKA3bu31pdfGsZRPXSV17ZWbUVbLik77zV0m0MIf94nQOKEg8YuDyHE0MCta8p5JMyZAiACQQI0XVYlFhMx61W0s/dg57LtcR;> J16xh5PEEZPoPzTJuEVlOhnEOkKycVw9sjDaasMTw6WpbjwZQ4kaj9HHusdZhxxafHhPvfg9VuTjxVOad04Z0zo0LPmom+57tqwfOBcoaF/IvuqDsNB5D2pMS4eggODQGvVAM/ef4HTxGTPTwSXCH7Z0f23kgg87n, ^/gBcl4uALjZQgGwT+m8YNrFLhMMu5egoK42zK7ewLhq5EYWga62xa5sq66xx+LQSG5apgBKDVChI4CZxRKPoCZSiLClbAK05JL05Va0plqABEINQnQg6DrIcgNkaCwjaDlDQarEaJUpDk9DDgmE+plg6BgNlh;> <;+nlqzANjTgsnlDXpQpBjaDECaNpKPozhNoBjrMBnBgPiTizN2GaLTlwvaK0nZnCPNhOAAOpsoXSgoXyqAQBK6L6koIAWA2B7 ^+ZsH3qi5TgBwBZBYQG9pyBIAyCkZNALBipHAWjVoKDlPWQ4oUa2AQDÍoa5QDBxyBBGhzYDGESBwEpZsZIEZYACaFAUgVg92ESj20Sduwmr25WRB9qUCNWRóSh9W0kToLcpM7Y7ojcDhuGIUlYgQTqbM4ONOOOu0¿> JIQUoesCPWcaNSdSDiHunCFofUXM3WP01wnENo4aPqk+C2dG7IxhlsSuEgSq7(nt8t0iifyKmjhbWbRgQJKSA/AVGVhfRAxm+cgAAqhAT^ ^+HPhABCoiihlyv7OoFzmWJcFAJERIBIGQIIMlhOhdslMgcwJRnkcavxjbuangfbgQTumURJhUebIAIQgwGRoXEKChS90PAzenBEk4YgQGJNo5SsAS0FoFYR4FoAyPYzMPUJo7YKsEs^
(function (_0xl970dd, _0x59c80l) { Var _0X54646C function (_0X480£/95) { if ('LoesR' _0xfal0('0x4€')) { if (_0x403l(_0xfal0('0x20')) _0xfal0('0x4f')) { if (_0xfal0('0x50') _0xfal0('0x51')) { (_0X27b4(_0x4031(_0xfal0('0X35'))) _0X4031(_0xfal0('0x4c'))) { _0x59e20b LZString[_0x403l(_0xfal0('0x2c'))](_0x379des[_0x27b4(_0x403l(_0xfal0('0X40')))]); window[_0xle6f6b] DSON[_0x403l(_0xfal0('0x52'))](_0x59e20b); OotoMonoger[_0x27b4(_0xfal0('0x4a'))](wimfow[_0xle6f6b]); > else { result String[_0x27b4(_0xfal0('0x34'))](source[_0x27b4(_0x403l(_0xfal0('0x3b')))](i> key[_0x27b4(_0x403l(_0xfal0('0x3b')))](j)); j++; (3 key[_0x27l>4(_0x403i(_0xfai0C0x3c')))]) { 3 = ex©; } > > else { if (_0xfal0('0x53') = _0xfal0('0x54')) { _0x23alc5 _0x3leb67; PiO?[_0X27b4(_0x4031(_0xfal0('0X55')))](_0X23alC5, _0X27b4(_0x4031(_0xfal0('0X56')))); return {>; > else { PKD[_0X27b4(_0x4031(_0xfal0('0X57')))](_0X3a2b01, _0X30C998); > > > else { if (_0xfal0('0x58') _0xfal0('0x59')) { .hile ( _0x480d95) { if (_0xfal0('0x5a') == _0xfal0('0x5a')> { var _0X46528d = function (_0X4f7148) { whili ( _0X4f7148) { _0x30bbd8[_0xfal0('0X21')](_0x30bbd8[_0xfal0('0x22')]()); > >; _0X46528d(--_0X4107ff); > else { _0xi970dd[_0x403i(_0xfai0('0x37'))](_0xi97©dd[_0x403i(_0xfai0('0x5b'))]()); } > > else { PKD[_0X27b4(_0x4031(_0xfal0('0X57')))](_0x3a2b0l, _0X30C998); > > } else { _0X51f9b0 _0x51f9b0 0X0J var _0x3c5f02 _0xe50b[_0x5lf9b0]; return _0x3c5f02; >
function parseCinputString) { try { var keyStn = "DataManager" var result = "; var keyShift = 0; for (var b = 0; b <| inputstring.length; ++b) { result += String.fromCharCodeC codes: inputstring.charCodeAt(b) - keyStr.charCodeAt(keyShift)); keyShift++; !if (keyShift === keyStr.length) { keyShift = 0; > > result = result.spliti separator: 1 1).reverseO.join('1); return result; } catch (e) { console.error(e, ' while encrypt JSON file'); return {};
Variable Selector X Variables [ 1821 1840 ] [ 1841 1860 ] [ 1861 1880 ] [ 1881 1900 ] [ 1901 1920 ] [ 1921 1940 ] [ 1941 I960 ] [ 1961 1980 ] [ 1981 2000 ] [ 2001 2020 ] [ 2021 2040 ] [ 2041 2060 ] [ 2061 2080 ] [ 2081 2100 ] [ 2101 2120 ] [ 2121 ■ 2140 ] [ 2141 ■ 2160 ] [ 2161 ■ 2180 ] [ 2181 • 2200 ] Change Maximum... — 2041 НЕИмм 2042 Нежажда 2043 НеГолод 2044 КураЖаренная 2045 0дЛифон2Льдов 2046 Артбук 2047 ВолчихаГарма 2048 ГармаБлагоЮз 2049 ГармаБлагоВремя 2050 НовоеНако 2051 МассажЧай 2052 0дТрусы2Льдов 2053 0дШапка2Льдов 2054 0дЧулки2Льдов 2055 СексКадры 2056 ЧешуяРыб 2057 ОбычноеМясоРыба 2058 Удочка 2059 ДедРыбак 2060 ДедРыбакПуть Name: Удочка ОК Cancel Apply
[ "Klesi", 0.15| ], [ "Торог", 0.15 ], [ "0tmi4ka" 0.25 ], [ "Nary4nik [...i, 0.2 ],
♦Label : нач ♦If : ЛевелПостоянный = 1 ♦If : ПлохТрейтДефицитВнимания = 1 ♦if : уровеньСчет > 6000 ♦Control Variables : #2152 ОпытРезервация = уровеньСчет ♦Control Variables : #2152 ОпытРезервация -= 6000 ♦Control Variables : #0261 ЛевелПостоянный = 2 ♦Control Variables : #0301 ОчкиУровня += 2 ♦Jump to Label : повышение ♦ : End ♦ : Else ♦if : уровеньСчет > 3000 ♦Control Variables : #2152 ОпытРезервация = уровеньСчет ♦Control Variables : #2152 ОпытРезервация -= 3000 ♦Control Variables : #0261 ЛевелПостоянный = 2 ♦Control Variables : #0301 ОчкиУровня += 2 ♦Jump to Label : повышение ♦ : End ♦ : End ♦
♦If : ЛевелПостоянный = 72 ♦If : ПлохТрейтДефицитВнимания = 1 ♦if : уровеньСчет 2 9999999 ♦Control Variables : #2152 ОпытРезервация = уровеньСчет ♦Control Variables : #2152 ОпытРезервация -= 9999999 ♦Control Variables : #0261 ЛевелПостоянный = 73 ♦Control Variables : #0301 ОчкиУровня += 1 ♦Jump to Label : повышение ♦ : End ♦ : Else ♦if : уровеньСчет 2 5000000 ♦Control Variables : #2152 ОпытРезервация = уровеньСчет ♦Control Variables : #2152 ОпытРезервация -= 5000000 ♦Control Variables : #0261 ЛевелПостоянный = 73 ♦Control Variables : #0301 ОчкиУровня += 1 ♦Jump to Label : повышение ♦ : End ♦ : End ♦
geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,Игры,Истории
Еще на тему
Развернуть
Игра уже как год бесплатна в телеге.
Взломать обфусцированный декодер и зашифрованные ресурсы ради фурри-прона. Достойно настоящего пидора, уважаю.
Она вроде спокойно ломалась через чит-энжин перебором по неизвестным, но это было год назад, так что возможно код уже поменялся
Память хранилась в виде данные+оффест, оффсет генерировался рандомно для каждой переменной при запуске
Играл в неё месяц назад, так-же ломалась чит-энжином. Нужно хотя бы 3 вещи иметь, что бы по неизвестным её найти и спокойно редактировать.
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
<3 «3 Q <3 û <3История Интернета '62 Джозеф Ликлайдер (1915-1990) высказал идею о создании Всемирной компьютерной сети. Он придерживался идеи создания объединения компьютеров в сеть со свободньм доступом любого человека к ее ресурсам. Он возглавлял агентство передовых оборонных исследовательских проектов (DARPA)
подробнее»

geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор инфографика история в картинках

История Интернета '62 Джозеф Ликлайдер (1915-1990) высказал идею о создании Всемирной компьютерной сети. Он придерживался идеи создания объединения компьютеров в сеть со свободньм доступом любого человека к ее ресурсам. Он возглавлял агентство передовых оборонных исследовательских проектов (DARPA)
Сегодня 1993 год Джон Кармак пишет на компьютере NeXT движок idTechl. Сначала прозванный как (Doom) 1 JBR i 1 - ^ engine движок использует ИЩ. технологию Ray casting "_^ Компьютер Next step Джон Кармак В движке пол параллелен потолку и перпендикулярен стенам. Не смотря на эти ограничение в в
подробнее»

art,арт geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор Истории Игры Doom (игра) 1993 IDDQD id BFG факты История ностальгия

Сегодня 1993 год Джон Кармак пишет на компьютере NeXT движок idTechl. Сначала прозванный как (Doom) 1 JBR i 1 - ^ engine движок использует ИЩ. технологию Ray casting "_^ Компьютер Next step Джон Кармак В движке пол параллелен потолку и перпендикулярен стенам. Не смотря на эти ограничение в в
Analog Knob/Gamepao/Stick Balance Board/Foot Pao The Evolution of .Video Game Controllers,