Subnautica Взлом кода двери
-
@Iniar К сожалению у меня нету времени из-за подготовки к ЕГЭ, но ты можешь в ютубе написать Reversing unity games и там будут гайды на эту тему.
-
@__fastcall Понял, спасибо за наводку, попробую порыть. Но моя задача всё же остаётся открытой. Возможно ли это реализовать в CE? А попутно пока буду пробовать освоить тему с реверсом в предложенных тобой приложениях.
-
@Iniar Можно конечно в СЕ реализовать, там скорее всего где-то есть метод, который просто сравнивает пароли, его и по названию можно попробовать отыскать. А там уже через патч кода делать, как угодно.
-
@__fastcall Конечно я понимаю, что там обязательно должен присутствовать метод сравнивания, а так же в каком-то виде где-то лежит так называемый мастер-пароль с которым идёт сравнение. Но вот выйти на данный метод конкретно в Subnautica у меня пока не вышло и раз это скорей всего можно сделать через CE, то я прошу знающих людей помочь мне в поиске пути к этому методу сравнения, а там уже думаю, что увижу что с чем сравнивается и смогу выуживать при вводе неверного рандомного пароля типа 1234 уже верный пароль с которым сравниваются эти 1234.
-
@__fastcall Если появится некоторое время, можешь тоже подключиться к процессу? Сохранение игры у панели замка двери могу предоставить для экономии времени в игре.
-
@Iniar Скинь assembly c sharp.dll. Ща попробую поискать.
-
@__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 }