Чиним баги(добавляем фичи) с помощью чит энджина. / починил :: баги :: ассемблер :: Игры

ассемблер Игры баги починил 

Чиним баги(добавляем фичи) с помощью чит энджина.

В общем суть. Есть одна визуальная новелла Steins;Gate Elite. К ней вышел руссификатор полусырой, разработчики на него забили, и где нужно не проставили перенос строки. По итогу получаем мы в результате вот такое:

& Бгетз^аге ЕЩЕ
Несколько автоматов с игрушками в к; ны с надписью “Родина японского ПК”.
[Ез] АНТОНЕ «К1Р)
□
X,ассемблер,Игры,баги,починил

Не знаю как вас, но я когда вижу такие переносы у меня внутри всё бурлит и читать становится невыносимо. Что делать? Ну раз разработчики движка не добавили перенос текста по словам, так-как в японии это нахуй не нужно, там иероглифы, добавлять будем мы.
Итак с чего начать? Ну начать следует с того, чтобы найти строку текста отображаемую на экране в оперативке. В зависимости от движка текст может быть и разбросанным по символам, а не целой строкой. Для поиска текста открываем чит энджин, подрубаемся к нашей игре. Далее сканирование -> новое сканирование выбираем тип строка, пишем искомую строку. В конкретно данном случае получаем залупу за воротник, так-как текст не ищется ни в одной нормальной кодировке.

Что делать дальше? А дальше думать, если искомый текст не находится, то есть вероятность, что игрой используется кастомная кодировка. Мы слепы как кроты, но не стоит отчаиваться, нужно просто немного схитрить. Мы не знаем как выглядит текст в кастомной кодировке, но есть кое-что, что нам известно. Например количество символов в строке. Ну и понеслась. Новое сканирование, тип 4 байта. Подсчитываем количество символов, сканируем. Жмакаем кнопку, снова подсчитываем символы уже в новой строке, жмакаем кнопку. Так пока не останется только один, два адреса. А потом просто смотрим какие функции обращаются к этому адресу.

И тут мы находим это

Memory Viewer - Running
File Search View Debug Tools Kernel tools
t	^	fc-
• • •
Toggle Breakpoint Run Step Into Step Over Step Out Run till.
Address
>>Game.exe+DAC77 Game.exe+DAC7D Game.exe+DAC7F Game.exe+DAC82 Game.exe+DAC84 Game.exe+DAC8A Game.exe+DAC91 Game.exe+DAC98 Game.exe+DAC9F

Что же, вот она, функция где форматируется текст. Если пролистать дальше, то можно будет увидеть работу с символами из строки. Красным если что выделена строка текста в кастомной кодировке, опытным путем выяснил значение контролирующих байтов: 01 80 - начало имени 02 80 - конец. 03 80 - конец текста.
Тааак, вот это уже интересно. У меня уже был опыт добавления переноса текста по словам в Rewrite стимовский, поэтому стал искать место где может формироваться уже новая строка с контрольными байтами переноса строки. Но тут меня ждало фиаско. Строка есть только одна, ебись с ней как хочешь. Но ведь как-то же движок переносит текст на новую строчку в игре?
Дальше я стал проводить эксперименты, высчитал нужную букву перед которой происходит перенос. Поставил на неё брейкпоинт, тыкался - тыкался в дебаггере, что там блядь происходит, нихуя не понятно. Думаю хуй с тобой золотая рыбка. Решил найти производится ли учет количества строк, но нет, нужной переменной не нашел. Далее координаты текста по оси y, и бинго. Нашел 

IDA - Game.exe.idb (Game.exe) C:\SG_ELITE\Game.exe.idb
File Edit Jump Search View Debugger Lumina Options Windows Help
& ▼ *4 ▼	% t 0-	SI Q	¡ê ui st -S+ - & m X	>03 0 Local Windows debugger v	te â'
Library function |_| Regular function Instruction Data Unexplored External symbol Lumina function

для лучшей наглядности. Ну думаю отлично, тут как раз есть проверочка, возможно это оно и нужно. В чит энджине jnz меняю на jmp, проверяю строку и есть.

& Бгетз^аге ЕЩЕ
Маюри уставилась на автомат с игрушками. Табличка впереди н
ПЕз] АНТОНЕ НК1Р)
□
X,ассемблер,Игры,баги,починил

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

Поэтому что в этом случае можно придумать? А вот что, заводим булевую. Пускай будет единица когда произойдет перевод на новую строку, но переводить мы не будем. Будем каждый символ проверять является ли он пробелом и если да, тогда уже делать перевод на новую строку. По итогу получается как-то так.

Auto Assemble edit: Auto Assemble script File View Template
11	(INJECT,Game.exe,
12	(newmem, $	)
13
14	(code)
15	(return)
16	(flag)
17	(hook)
18	(flag)
19	//Game.exe+DA544: 80 7C 11 01 07
20	//------------INJECTING	HERE -
21	//Game.exe+DA549: OF 85 0A 02 00 00
22	//------------DONE

И результат собственно 

& Бгетз^аге ЕЩЕ
Несколько автоматов с игрушками в к; ны с надписью “Родина японского ПК”.
[Ез] АНТОНЕ «К1Р)
□
X,ассемблер,Игры,баги,починил
&!	ЕЩЕ	-
ИЩ1
Несколько автоматов с игрушками в капсулах выстроены в ряд до пластины с надписью “Родина японского ПК”. @
[Ез] АНТОНЕ «К1Р),ассемблер,Игры,баги,починил
& Steins;Gate ELITE
Маюри уставилась на автомат с игрушк асит: “RaiNet AccessBattlers: Upa Collée
ÍESAÜTOHEUKIP)
□
X,ассемблер,Игры,баги,починил
& Steins;Gate ELITE
Маюри уставилась на автомат с игрушкам “RaiNet AccessBattlers: Upa Collection.”.
ÍES AMTOHE SKIP)
□
X,ассемблер,Игры,баги,починил
& Бгетз^аге ЕЩЕ
Выглядит как яйцо с торчащими конеч] ормированную собаку. О
ПЕз] АНТОНЕ НК1Р)
□
X
3 J,ассемблер,Игры,баги,починил
& Бгетз^аге ЕЩЕ
Выглядит как яйцо с торчащими конечностями и собаку. ^
ПЕз] АНТОНЕ НК1Р)
□
X,ассемблер,Игры,баги,починил
На третьем примере кстати видно недостаток подобного подхода, слишком сильно сжимает, по хорошему надо учитывать ширину символов, но итак сойдет. Ну и в конце всё это запилить в дллку, но я ебал его в рот, не люблю кресты, плюс еще не правильно чего сделаешь привет утечки памяти и прочие радости. А я точно неправильно сделаю, так-как на крестах не пишу.
Если кому нужна таблица для чит энджина: https://cdn.discordapp.com/attachments/128912752604348416/1000075342477787227/SteinsGateElite.CT
На сим всё. На самом деле там еще дохуя работы, в глоссарии пиздец тоже творится, но мне лень уже этим заниматься, все равно не так часто туда заходишь.

Подробнее
& Бгетз^аге ЕЩЕ Несколько автоматов с игрушками в к; ны с надписью “Родина японского ПК”. [Ез] АНТОНЕ «К1Р) □ X
Memory Viewer - Running File Search View Debug Tools Kernel tools t ^ fc- • • • Toggle Breakpoint Run Step Into Step Over Step Out Run till. Address >>Game.exe+DAC77 Game.exe+DAC7D Game.exe+DAC7F Game.exe+DAC82 Game.exe+DAC84 Game.exe+DAC8A Game.exe+DAC91 Game.exe+DAC98 Game.exe+DAC9F Game.exe+DACA1 Game.exe+DAC77 | Bytes |Opcode 8B 35 5C449900 mov ,[Game.exe+4D445C] 8B C1 mov i 89 45 D8 mov [ebp-28]fea 85 F6 test sZo\t Cbl 0F84 72010000 je 83 3D 4CD8AC00 00 cmp dword ptr [ C7 45 F4 00000000 mov [ebp-0C],00000000 C7 45 E8 00000000 mov [ebp-18]f00000000 7412 je 8B 0D D825B400 mov cx#[Gc )8] Comment (45) copy memory Protect: address 00B40AE0 00B40AF0 00B40B00 00B40B10 00B40B20 00B40B30 00B40B40 00B40B50 00B40B60 00B40B70 00B40B80 00B40B30 00B40BA0 00B40BB0 00B40BC0 00B40BD0 00B40BE0 Read/Write AllocationBase=004C0000 Base=00B40000 Size=15000 Module: EO El E2 E3 E4 E5 E6 E7 Ie8 E3 EA EB EC ED EE EF 01234567|83ABCDEF Address 0275F77C(esp+0) 0275F780(esp+4) 0275F784(esp+8) 0275F788(esp+C) 0275F7 8C(esp+10) 0275F790(esp+14) 0275F794(esp+18) 0275F798(esp+1C) 0275F79C(esp+20) 0275F7A0(esp+24) 0275F7A4(esp+28) 0275F7A8(esp+2C) 0275F7AC(esp+30) □ X Registers: Flags EAX 0000014A CF 0 EBX 0003DE00 PF 0 ECX 0003DE00 AF 0 EDX 00000000 ZF 0 ESI 000000C0 SF 0 n EDI 0000002D DF 0 EBP 0275F7B0 ESP 0275F77C EIP 0059AC77 OF 0 Segment Registers CS 0023 SS 002B DS 002B F.S nf)?R DWORD Value ooooooco (dword)000000C0(192) 00B369D8 (pointer)Game.exe+6769D8 00000030 (d wo rd)00000030(48) 00000000 (dword)00000000(0) 00000000 (dword)00000000(0) 00000004 (d wo rd)00000004(4) 00000004 (d wo rd)00000004(4) 0000002D (dword)0000002D(45) OOOOOOCO (dword)000000C0(192) 00000001 (dword)00000001(1) 00000000 (dword)00000000(0) 00000010 (dword)00000010(16) 000004BA (dword)000004BA(1210)
IDA - Game.exe.idb (Game.exe) C:\SG_ELITE\Game.exe.idb File Edit Jump Search View Debugger Lumina Options Windows Help & ▼ *4 ▼ % t 0- SI Q ¡ê ui st -S+ - & m X >03 0 Local Windows debugger v te â' Library function |_| Regular function Instruction Data Unexplored External symbol Lumina function S IDA View-A 0 0 Stack of sub_C3A3C0 Q m Functions Function name sub_CB8810 sub_CB8860 sub_CB8870 sub_CB88B0 sub_CB88F0 nullsub_3 sub_CB8940 sub_CB8990 sub_CB89E0 nullsub_4 sub_CB8A40 sub_CB8AA0 sub_CB8AC0 sub_CB8B10 sub_CB8B30 sub_CB8B50 sub_CB8B90 sub_CB8BD0 nullsub_5 nullsub_6 nullsub_7 nullsub_8 sub_CB8C50 sub_CB8C80 sub_CB8CB0 sub_CB8CF0 sub_CB8D30 sub CB8D50 n & X O Pseudocode-A Q |o] Hex View-1 Structures 0 Enums Imports Exports x eax, word_1317FDC[ebx] eax, [ebp+var_4] edi, [ebp+text_y] edi, eax [ebp+var_18], edi il loc_C3A541: mov ecx, [ebp+var_38] cmp byte pt\r [ecx+edx+1], 7 jnz loc_C3A759 :_C3A6CC: /zx ecx, word_1317FDA[ebx] ■» eax, eax / edx, [ebp+var_2C] / [ebp+var_lC], ecx / ecx, 0FFFFh / [ebp+text_y], edi / [ebp+var_4], eax / [ebp+var_8], ecx / [ebp+var_10], eax ) short loc_C3A762 Line 5773 of 5773 Graph overview □ SX { 1 MM loc_C3A759: mov edi, [ebp+var_18] mov ecx, [ebp+var_8] mov eax, [ebp+var_4] push [ebp+var_lC] mov ecx, [ebp+var_34] push edi push [ebp+var_10] push [ebp+var_24] push edx push eax lea eax, [ebp+text_y] push eax lea edx, [ebp+var_20] call sub_C39D00 movsx eax, word_1317FBC[ebx] add esp, ICh movzx ecx, word_1317FDA[ebx] mov edx, [ebp+var_2C] mov [ebp+var_20], eax movzx eax, word_1317FDC[ebx] add eax, edi mov [ebp+var_lC], ecx mov edi, [ebp+text_y] mov ecx, 0FFFFh add edi, eax mov [ebp+var_24], 0 xor eax, eax mov [ebp+var_18], edi mov [ebp+text_y], edi mov dword_1034458, edi 100.00% (2253,4327) (1093,350) 000D9544 00C3A544: sub C3A3C0+184 (Synchronized with Hex View-1) amrn 0 Output □ & X Warning: Action "Return" unexpectedly disabled. Context changed? IDC AU: idle Up Disk: 34GB
& Бгетз^аге ЕЩЕ Маюри уставилась на автомат с игрушками. Табличка впереди н ПЕз] АНТОНЕ НК1Р) □ X
Auto Assemble edit: Auto Assemble script File View Template 11 (INJECT,Game.exe, 12 (newmem, $ ) 13 14 (code) 15 (return) 16 (flag) 17 (hook) 18 (flag) 19 //Game.exe+DA544: 80 7C 11 01 07 20 //------------INJECTING HERE - 21 //Game.exe+DA549: OF 85 0A 02 00 00 22 //------------DONE INJECTING 23 newmem: 24 jne hook 25 mov byte ptr[flag], 26| cmp word ptr[edx* +Game.exe+ ], 27 je code 28 jmp Game.exe+ 29 hook: 30 cmp byte ptr[flag], 31 jne Game.exe+ 32| cmp word ptr[edx* +Game.exe+ ], 33 jne Game.exe+ 34 code: 35 mov byte ptr[flag], 36 cmp edx, 37 jle Game.exe+ 38 jmp return 39 flag: 40 41 INJECT: 42 jmp newmem 43 nop 44 return: 45 (INJECT) 46 47 [DISABLE] 48 49 INJECT: 50 51 « (INJECT) (flag) )0) // should be unique - cmp byte ptr [ecx+edx+01],07 - jne Game.exe+DA759 3f // 3f - пробел 3f // 3f - пробел
&! ЕЩЕ - ИЩ1 Несколько автоматов с игрушками в капсулах выстроены в ряд до пластины с надписью “Родина японского ПК”. @ [Ез] АНТОНЕ «К1Р)
& Steins;Gate ELITE Маюри уставилась на автомат с игрушк асит: “RaiNet AccessBattlers: Upa Collée ÍESAÜTOHEUKIP) □ X
& Steins;Gate ELITE Маюри уставилась на автомат с игрушкам “RaiNet AccessBattlers: Upa Collection.”. ÍES AMTOHE SKIP) □ X
& Бгетз^аге ЕЩЕ Выглядит как яйцо с торчащими конеч] ормированную собаку. О ПЕз] АНТОНЕ НК1Р) □ X 3 J
& Бгетз^аге ЕЩЕ Выглядит как яйцо с торчащими конечностями и собаку. ^ ПЕз] АНТОНЕ НК1Р) □ X
ассемблер,Игры,баги,починил
Еще на тему
Развернуть
Ты можешь пропатчить бинарник напрямую . Ни на каких крестах писать не нужно. Заменить один опкод на другое, это вообще плевое дело. С хуком чуть сложнее, тебе нужно вписать свой хук, в секцию кода и подумать как его органичнл встроить.
WiWind WiWind 22.07.202220:40 ответить ссылка -0.7
Ой правда что ли? Тут не просто заменить пару байтов. Тут во первых нужно реализовать переменную, а это значит выделить под неё память, во вторых обращение к константам. Далеко не всегда они статические, тут опять таки придётся вычислять RVA для них, а это скажем так не маленький кусочек кода. Никаких код кейвов не хватит.
ivdos ivdos 22.07.202220:43 ответить ссылка -2.9
Естественно, чтобы получить результат нужно приложить усилия.
Если только понтануться знанием азов ассемблера на развлекательном сайте не было само целью. В этом случае результат достигнут.
WiWind WiWind 22.07.202220:58 ответить ссылка 3.0
Скорее чтобы не забыть, что я для этого сделал. Но опять таки если брать сырой патчинг бинарника без хука через дллку, то нихуя не выйдет. Точнее в данном случае возможно выйдет, но вот в бинарниках с защитой, запакованные, селфинжектингом, то там только хук, никак иначе.
ivdos ivdos 22.07.202221:02 ответить ссылка -2.6
Зависит от остроты желания. Если пакер популярный в сети есть распаковщики. Если нет, можно сдампить на рантайме (иногда требуются дополниьельные манипуляции, если распаковка происходит не полностью, а постранично при обращении) и потом чинить.
Что до патчинга, обычно нужно найти правильное место чтобы вбить свой jmp. Точно так же как это и делает половина хукающих тулов только вручную.
WiWind WiWind 22.07.202221:22 ответить ссылка 0.0
> Что до патчинга, обычно нужно найти правильное место чтобы вбить свой jmp.
Блядь, я тоже самое делал для патчинга бинарника Rewrite, там чинил расстояние между буквами и перенос по словам. Проблемы начинаются когда тебе нужно свою собственную переменную вводить и держать её в памяти. И вроде бы можно место выделить в тех же код кейвах, но далеко не всегда VA == RVA, а это загружать библиотеку, обращаться к ней, записывать RVA в переменную, на всё нужно место, где его брать? Опять таки код кейвы не бесконечные, куда код девать если он не лезет?
ivdos ivdos 22.07.202221:29 ответить ссылка 0.0
А вообще если есть что предложить, то милости прошу. Я далеко не мастер фломастер, а только учусь. Может я чего не знаю. Ну вот например, скажи мне как с минимальным количеством кода узнать RVA, мне бы очень пригодилось. Или можно ли без код кейвов обойтись, тоже было бы очень интересно.
ivdos ivdos 22.07.202221:19 ответить ссылка 0.1
dr9vik dr9vik 22.07.202221:46 ответить ссылка 1.5
Сейчас не прочёл полностью, и русификаторами не пользуюсь, но очень люблю такие посты)
В них в разы больше труда вложено, чем в CTRL+C -> CTRL+V
.axl .axl 22.07.202222:19 ответить ссылка 1.4
Может потом ещё перевод ранобэ по Коносубе до ума доведёшь?
Сейчас приквел про Мегумин читаю - там то ошибки со склонением слова, то прямая речь не выделена пунктуацией, то не слова автора выделены дефизом, как будто прямая речь и так тупо в каждой главе по несколько раз встречается.
21parit 21parit 22.07.202222:48 ответить ссылка 0.0
Я только по программной части, переводы не делаю.
ivdos ivdos 22.07.202222:51 ответить ссылка 0.0
А где можно сам перевод скачать? И на какую версию ставить?
Мне больше интересно когда там перевод Персоны 4 закончат.
Norm_on Norm_on 23.07.202211:26 ответить ссылка 0.0
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
Telegram (1)
v л
X
last seen just now
l.
лете энкрипт? 6;42 PM
6:42 PM
Ага с.
6:42 PM
пиздос 7:17РМ
мы ща во время релиза обнаружили
7:17 РМ
что у нас в базе все широты и долготы местами перепутаны	7;18 рм
ололо) 7:18 РМ
к счатью, приложение тоже их путает местами, поэтому все работае
подробнее»

it разработка не баг а фича

Telegram (1) v л X last seen just now l. лете энкрипт? 6;42 PM 6:42 PM Ага с. 6:42 PM пиздос 7:17РМ мы ща во время релиза обнаружили 7:17 РМ что у нас в базе все широты и долготы местами перепутаны 7;18 рм ололо) 7:18 РМ к счатью, приложение тоже их путает местами, поэтому все работае