Subnautica Взлом кода двери
-
@__fastcall Это нужно взять в dnspy? Скажу, что развиваю навыки в CE и имеется который уровень программирования (логику программирования понимаю на среднем уровне), а так же на среднем уровне понимаю assembler. Но твой запрос не понял. Опиши краткий алгоритм действий пожалуйста. Я попытаюсь разобраться. Может это для меня будет легко, просто я эти действия другими словами понимаю.
-
@Iniar Я просто хотел, чтобы ты мне скинул из папки с игрой файл assemblyCSharp.dll, т.к мне лень игру скачивать. Т.к пароли статичные, то возможно их можно найти по строкам.
-
@__fastcall Понял теперь, сейчас на работе, после работы скину в личку или сюда. Подумал, что надо где-то уже код игры выгрузить и тебе прислать, что пока было бы не особо быстро, пока разобрался бы. Если не сложно, можешь потом пояснялку пожалуйста небольшую сделать по своим исследованиям файла. Если время и желание есть. Хотелось бы по мимо результата всё же какой-то опыт на практике конкретной ещё получить. Пароли сами как таковые мне не нужны. Мне больше интересен разбор игры через CE, так как я пока в ней больше понимаю как можно докуда-то добраться, чем например через dnspy, но пояснялки будут полезны для понимания. Заранее спасибо.
-
@__fastcall
архив с ассембли сишарп как обещалПо другому увы не нашёл как скинуть архив. После конвертации в картинку тут ошибку пишет при загрузке, а в ЛС у меня ещё нет прав отправлять файлы.
-
@Iniar
Ну по коду вроде похоже на то. -
@__fastcall Вроде как да, этот самый код. И зелёный цвет ниже присутствует в параметре колор. Это вроде, если верно понял код, то когда на клавиши нажимаешь и когда код верно вводишь появляется зелёный замок открытый. Сейчас вопрос, как исходя их этого можно в CE выйти на то место где коды сравнивает? И можно ли обращая внимание на этот скрин кода?
-
@__fastcall И кстати вопрос сразу же.Из кода видно, что есть переменная accessCode. Можно ли её в CE найти по данному названию и попасть в эту самую процедуру?
-
@Iniar я поэтому и скинул скрин с RVA.
-
@__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 Кстати да, помню и я свой восторг когда тоже самое бессмертие там же сделал))) Видимо мы один опыт пережили. Напомнил мне о тех временах.)) А по поводу не интересно смотреть на игры из видео, ну не скажи... К примеру я в видео увидел какой-то метод новый, принял его для себя и уже пользуясь им пробую расковырять что-то свою. А для закрепления опыта из видео можно повторить пару раз те же действия, чтоб как говориться сформировалась мышечная память. Ведь мы не редко смотрим в инете как построить дом или выложить печку в бане и после видео ведь не теряем интерес к тому, что надо выложить печь в бане, а пользуемся полученным опытом и идём и выкладываем печь без тех ошибок которые могли бы совершить без видео. Согласись?