Subnautica Взлом кода двери
-
@__fastcall В RVA адрес на начало процедуры?
-
@Iniar Assembly-CSharp.dll + RVA = Адрес метода. Вроде так.
-
@__fastcall Хорошо. Посмотрел в CE в редакторе памяти список подгруженных библиотек. Но там не нашёл эту длл-ку. Этот адрес можно получить как то через CE или в чём-то другом?
-
@Iniar Вообщем, я забыл, как это делать через dnspy, сделай просто через CE -> Mono dissector. Там можно через поиск будет найти метод этот.
-
Помнится был у меня заказец на подобно.(открыть заблокированные двери)Игра Гедония и тож на юнити.
Я поступил гораздо проще. А именно так. Давайте будем рассуждать логически. Возьмём любую отрывающуюся дверь. Сделаем допущение. Если дверь в открытом состоянии то это флаг равный 1 (единица) а если закрыта то это = 0. Следовательно. Я могу воспользоваться сканером. Обычно флаги хранятся как 1 байт. Найдя этот флаг я могу уже от чего-то оттолкнуться. Не так ли?
Причём флаг может быть не только 1-0 а допустим 144=открыто 72=закрыто. И всё наоборот. Всё что угодно разрабу в голову придёт.
Ну та вот найдя инструкции работающие не с одной конкретной дверью а с видимыми (как минимум)И кстати за счёт того что СЕ парсит структуры мне удалось найти в структуре двери значение Lock = 0 или =1
Упешно написал скрипт который открывает все двери.
И да если не удаётся найти флаг. Всегда можно поискать угол открытия двери или чего угодно
Гедония. Не помню какая версия.
Открытие всех дверей.[ENABLE] {$lua} if (LaunchMonoDataCollector()==0) then error('Failed to Activate Mono Features') end {$asm} aobscanregion(UnDoor,Door:Interact+230, Door:Interact+293, 0F 84 ? ? ? ? 66) registersymbol(UnDoor) UnDoor: db E9 6D 01 00 00 90 [DISABLE] UnDoor: db 0F 84 6C 01 00 00 unregistersymbol(UnDoor) { // ORIGINAL CODE - INJECTION POINT: Door:Interact+25e Door:Interact+230: 4C 8B 8D 40 FF FF FF - mov r9,[rbp-000000C0] Door:Interact+237: 4C 89 8D 50 FF FF FF - mov [rbp-000000B0],r9 Door:Interact+23e: 4D 8D 00 - lea r8,[r8] Door:Interact+241: 83 38 00 - cmp dword ptr [rax],00 Door:Interact+244: 66 90 - nop 2 Door:Interact+246: 49 BB 2E E9 4F 12 BF 02 00 00 - mov r11,000002BF124FE92E Door:Interact+250: 41 FF D3 - call r11 Door:Interact+253: E9 CB 04 00 00 - jmp Door:Interact+723 Door:Interact+258: 0F B6 46 35 - movzx eax,byte ptr [rsi+35] Door:Interact+25c: 85 C0 - test eax,eax // ---------- INJECTING HERE ---------- Door:Interact+25e: 0F 84 6C 01 00 00 - je Door:Interact+3d0 // ---------- DONE INJECTING ---------- Door:Interact+264: 66 90 - nop 2 Door:Interact+266: 49 BB 70 A0 82 0A 6E 02 00 00 - mov r11,0000026E0A82A070 Door:Interact+270: 41 FF D3 - call r11 Door:Interact+273: 48 8B C8 - mov rcx,rax Door:Interact+276: 48 BA 30 EF 2F CD BE 02 00 00 - mov rdx,000002BECD2FEF30 Door:Interact+280: 48 8D 64 24 00 - lea rsp,[rsp+00] Door:Interact+285: 90 - nop Door:Interact+286: 49 BB C0 65 5A DD BD 02 00 00 - mov r11,System.String:op_Equality Door:Interact+290: 41 FF D3 - call r11 Door:Interact+293: 85 C0 - test eax,eax }
-
Ещё бывают такие игры как дай лайт 2.
В которых что-бы открыть замок нужна отмычка.
Бывает такое что в соседнем регисре хранится "правильное число".
И его нужно всего лишь подменить!(регистр)[ENABLE] aobscanmodule(EeasyOpenLock,gamedll_ph_x64_rwdi.dll,F3 ? ? ? ? ? ? ? 33 ? 0F 2F ? 73 ? 89 ? ? ? ? ? 0F 57) registersymbol(EeasyOpenLock) EeasyOpenLock: movss [rcx+00000138],xmm4 //F3 0F 11 A1 38 01 00 00 [DISABLE] EeasyOpenLock: db F3 0F 11 89 38 01 00 00 unregistersymbol(EeasyOpenLock) { // ORIGINAL CODE - INJECTION POINT: gamedll_ph_x64_rwdi.dll+F44F92 gamedll_ph_x64_rwdi.dll+F44F5D: F3 0F 5D C8 - minss xmm1,xmm0 gamedll_ph_x64_rwdi.dll+F44F61: 80 B9 40 01 00 00 00 - cmp byte ptr [rcx+00000140],00 gamedll_ph_x64_rwdi.dll+F44F68: F3 0F 11 89 3C 01 00 00 - movss [rcx+0000013C],xmm1 gamedll_ph_x64_rwdi.dll+F44F70: 74 09 - je gamedll_ph_x64_rwdi.dll+F44F7B gamedll_ph_x64_rwdi.dll+F44F72: 80 7A 1C 00 - cmp byte ptr [rdx+1C],00 gamedll_ph_x64_rwdi.dll+F44F76: 74 03 - je gamedll_ph_x64_rwdi.dll+F44F7B gamedll_ph_x64_rwdi.dll+F44F78: 0F 57 C9 - xorps xmm1,xmm1 gamedll_ph_x64_rwdi.dll+F44F7B: F3 0F 58 89 38 01 00 00 - addss xmm1,[rcx+00000138] gamedll_ph_x64_rwdi.dll+F44F83: F3 0F 10 25 45 34 0E 01 - movss xmm4,[gamedll_ph_x64_rwdi.dll+20283D0] gamedll_ph_x64_rwdi.dll+F44F8B: C6 81 40 01 00 00 00 - mov byte ptr [rcx+00000140],00 // ---------- INJECTING HERE ---------- gamedll_ph_x64_rwdi.dll+F44F92: F3 0F 11 89 38 01 00 00 - movss [rcx+00000138],xmm1 // ---------- DONE INJECTING ---------- gamedll_ph_x64_rwdi.dll+F44F9A: 33 C9 - xor ecx,ecx gamedll_ph_x64_rwdi.dll+F44F9C: 0F 2F CB - comiss xmm1,xmm3 gamedll_ph_x64_rwdi.dll+F44F9F: 73 0B - jae gamedll_ph_x64_rwdi.dll+F44FAC gamedll_ph_x64_rwdi.dll+F44FA1: 89 8E 38 01 00 00 - mov [rsi+00000138],ecx gamedll_ph_x64_rwdi.dll+F44FA7: 0F 57 C9 - xorps xmm1,xmm1 gamedll_ph_x64_rwdi.dll+F44FAA: EB 12 - jmp gamedll_ph_x64_rwdi.dll+F44FBE gamedll_ph_x64_rwdi.dll+F44FAC: 0F 2F CC - comiss xmm1,xmm4 gamedll_ph_x64_rwdi.dll+F44FAF: 76 0D - jna gamedll_ph_x64_rwdi.dll+F44FBE gamedll_ph_x64_rwdi.dll+F44FB1: C7 86 38 01 00 00 00 00 B4 42 - mov [rsi+00000138],42B40000 gamedll_ph_x64_rwdi.dll+F44FBB: 0F 28 CC - movaps xmm1,xmm4 }
-
@Iniar Скинь сейвы перед дверью с паролем. И желательно что-бы была рядышком дверь разлоченая.
-
@Partizan1078 Привет, очень интересные варианты предложил. Да, я тоже стараюсь думать логически и эти варианты почти все прошёл. Дело в том, что именно у Subnautica поиск флага в 1 - 0 у меня падает в ошибку. Потому что число найденных адресов переваливает за 10000000......... и видимо CE не хватает памяти или ещё чего, хотя место на диске вроде как есть ещё для файла БД поиска. И ищет это всё по минут 40-50. Но не суть, главное, что просто в конце выходит ошибка при втором отсеивании к примеру и всё насмарку. Далее, про флаг открыто/закрыто отличный от 1-0, согласен, бывает и такое и этот флаг ещё нужно поймать. Можно пробовать поиском неизвестного значения, но опять же неизвестно ведь как он обрабатывается. Уменьшается при открытии двери или увеличивается. Получается приходится опять пользоваться неопределённым поиском типа Изменилось/не изменилось значение, а это опять тутуева куча результатов поиска. Я пробовал искать прогресс исследования рецепта при сканировании нового предмета сканером (к слову эта задумка тоже не поддалась мне в том виде в котором я хотел бы, а именно я хотел чтоб сканируешь какой нибудь новый предмет и попадаешь на общую инструкцию которая проверяет полностью все или хотя бы начатые рецепты в дереве чертежей, а там уже меняешь все рецепты на выполненные и по завершению сканирования любого нового предмета простого у тебя открываются и сложные рецепты с несколькими стадиями изучения. У меня остался сейв и для этой задумки, рядом несколько костюмов КРАБ и их достаточно для полного открытия рецепта. Или поймать статус рецепта опять же флагом - изучен/не изучен и общую инструкцию проверяющую все рецепты, чтоб вместе изучаемым открыть сразу все остальные рецепты, но это тоже не удалось поймать. Могу и на эту идею скинуть сейв для исследований, если интересно. Мне удалось добиться лишь попадания на стадию исследования. Допустим у меня уже открыт рецепт КРАБа 1/4, я нашёл, что стадии в 2 байта и максимум стадии в 2 байта. И общую инструкцию которая все начатые рецепты проверяет. Меняю максимум у всех на 1 и изучаю очередной КРАБ. Должно по нормальному быть Краб 2/4, но после моих действий КРАБ открывается и все начатые рецепты как будто открываются, становятся цветными вместо серых, но после открытия краба я вижу ингредиенты для его создания, а мнимо открытые рецепты остаются без ингредиентов как будто не открыты. Пока отложил эту идею, потому как неделю с ней возился и чуть устал). Эти поиски усложняются тем, что в Subnautica необычайно много всякого мусора ищет и результаты поиска вылазят за миллиарды и триллиарды. В других играх я намного проще искал флаги, но тут это просто жуть. И кстати после того как например ищешь флаг рецепта и при этом его надо найти за 3-4 шага всего, что почти нереально, а при достижении открытия рецепта его уже откатить назад не получается, приходится перезагружать сейв и после этого адреса все меняются. С дверью чуть проще, там бесконечное число попыток подбора кода без перезапуска сейва, но дело в поиске флага убивается ошибкой при отсеивании.
По поводу сейва рядом с дверью, как раз я нашёл удачное место где есть две двери рядом. От одной я точно знаю пароль и её можно разблочить и открыть, а от второй пароль не нашёл. Они буквально в одном коридоре. Сегодня после работы скину архив тебе. Если интересно, на поиск рецептов тоже могу скинуть. Сейчас пока идеи с стадиями рецептов и дверями иссякли, пробую сделать бесплатный крафт. Пока получилось сделать требования к крафту зелёными вместо красных при нехватке ресурсов, но создаваться пока не хочет предмет. Там беда в том, что ресурсы не стаковые, а поодиночно валяются в инвентаре. Буду ещё исследовать дальше.
-
Пользователь @__fastcall написал в Subnautica Взлом кода двери:
Mono dissector
Очень и очень интересная наводка, спасибо. Честно говоря, раньше мельком слышал о Mono dissector в CE, но не углублялся, а оказывается это очень даже мощная штука. По твоей наводке посмотрел ангоязычный туториал, и попутно наткнулся на туториал от Геймхаклаб как раз по Subnautica. А я всегда задавался вопросом, как так у людей в анализе структур вся структура по классам выставлена и прописаны имена. Теперь это для меня стало понятно. В туториале от Геймхаклаб рассказано про то как кислород найти через Моно, но я этого не знал и нашёл кислород, воду, голод обычными методами поиска и тоже сделал скрипты. А ещё на бесконечный огнетушитель и заряд батарей в приборах. Ещё у огнетушителя нашёл параметры силы тушения и множитель траты содержимого. Если увеличить параметр силы тушения, то любой огонь тушится с первого клика мышки. Но с Моно я теперь смогу дома порыться более углублёно. И возможно выйду на классы крафта и рецептов. -
@__fastcall Но кстати жаль, что данный анализ работает только для игр в Uniti. А есть ли парсер для игр в других движках? Моно в CE конечно весьма облегчает жизнь, но привыкнув к нему потом очень лениво становится в других движках рыться с поиском опять.))
-
Пользователь @Iniar написал в Subnautica Взлом кода двери:
но привыкнув к нему потом очень лениво становится в других движках рыться с поиском опять
Тут всё на оборот... Когда всё показано и рассказано, нет не какого интереса, смотреть подобные игры. Хотя когда то давно, году так в -2005- я бессмертие сделал на фар край 1 - радости не было предела
-
@LIRW Кстати да, помню и я свой восторг когда тоже самое бессмертие там же сделал))) Видимо мы один опыт пережили. Напомнил мне о тех временах.)) А по поводу не интересно смотреть на игры из видео, ну не скажи... К примеру я в видео увидел какой-то метод новый, принял его для себя и уже пользуясь им пробую расковырять что-то свою. А для закрепления опыта из видео можно повторить пару раз те же действия, чтоб как говориться сформировалась мышечная память. Ведь мы не редко смотрим в инете как построить дом или выложить печку в бане и после видео ведь не теряем интерес к тому, что надо выложить печь в бане, а пользуемся полученным опытом и идём и выкладываем печь без тех ошибок которые могли бы совершить без видео. Согласись?
-
@Iniar есть подобные вещи для unity, unreal engine, source1/2 и это как минимум. А вообще по сути в каждом движке игры можно найти что-то, что облегчает создание читов.
А способ работает только на mono играх, если игра ill2cpp, то там будет по-другому. -
@__fastcall Хорошо, а для unreal и source такие приспособы уже есть в CE или их надо плагинами ставить? И по поводу ill2cpp - верно понял, что моно там не будет отрабатывать? Как тогда запустив игру можно понять в ill2cpp она или нет? Вот как, говориться визуально это получится сделать?
-
@Iniar я не знаю, есть ли такое на СЕ, я все же на с++ читы делаю и поэтому я не искал. Моно и ил2спп как-то по файлам различаться должны вроде, это надо посмотреть, ибо я уже давно игры на юнити не трогал. Кстати, попробуй в моно дисекторе через поиск найти accescode или как он там на фото.
-
@Iniar Вроде у ил2спп файл game assembly есть, тогда надо илл2спп дампер использовать, гайды на эту тему тоже есть в Ютубе.
-
@__fastcall Ну вот да, я уже сейчас об этом думал, раз через моно я получаю выход на функции, а главное на их начала, то можно попробовать поискать ещё и таким способом. Но это уже только дома после работы.
По ил2спп, начало понял, что дамп делаешь и потом уже с ним работаешь получается? Похожий принцип я делал когда проходил курс Рикардо Нарвахи по Оледбг. Там тоже на некоторые кряки надо было дамп делать после снятия защиты. Тут похожий принцип? Получается для игр илл2спп процесс взлома идёт не онлайн, а с оффлайн дампом чтоли?
-
@Iniar тебе никто не запрещает и в рантайме их реверсить, просто дамп даст тебе какие-то функции из игры. Да и определённую информацию будешь получать как обычно - реверсом.
-
@__fastcall С этим понятно. Дамп просто статичное положение допустим игры где можно посмотреть структуры кода, функций и т.д. плюс адреса функций допустим, а в CE уже с ними что-то делать.
-
Пользователь @Iniar написал в Subnautica Взлом кода двери:
С этим понятно.
А мне если сохранение перед дверью дать я тоже хочу посмотреть.. заинтересовала подобная функция.