Как изменить код игры на компьютере

Обновлено: 04.07.2024

«Война… Война никогда не меняется». Думаю, многим знакома эта фраза. Каждый пользователь ПК хоть раз запускал компьютерную игру. Много компьютерного железа пострадало в баталиях от горячей руки геймера, потерявшего последнюю «жизнь». Иногда появляется мысль: а не поискать ли «читы» и не накрутить ли себе жизней или ресурсов. Так начинается путь читера.

В этой статье я на двух примерах покажу, как с помощью подручных средств можно нечестно играть в игры на HTML5.

Ядро любой HTML5-игры — JavaScript. Единственной, на данный момент, защитой этого ядра является обфускация кода. Согласитесь, увидеть «простыню» в 10 000 строк обфусцированного кода без new-line — это поначалу страшно. Но если немного покопать — логика и архитектура приложения как на ладони. Главное — определить цель читерства (скорость, ресурсы, GodMode). В качестве инструмента используем Chrome и его Web Inspector. Во вкладке Sources можно «на горячую» изменять исполняемый код.

Google Doodles


Основная цель игры — пройти трассу как можно быстрее. В голову сразу приходят несколько уловок:

  • повысить скорость лодки;
  • убрать препятствия;
  • убрать замедление от столкновений;
  • «выпрямить» трассу;
  • что-нибудь сделать с таймером (обнулить, замедлить).

Нас интересует JavaScript-код игры.


Логично предположить, что это slalom_canoe12-2.js.

Исходный код… немного страшный, правда? Можно автоматом расставить new-line и отформатировать по синтаксису JavaScript. Читаемость значительно улучшиться и анализировать станет легче. Также можно обложить весь код брейкпоинтами и попытаться восстановить алгоритмы. Но не будем стрелять из С-400 по квадрокоптеру…

Начинаем рассуждать. По нажатию клавиши или при прохождении через ворота лодка ускоряется. Следовательно, где-то есть параметр «скорость» и он должен (скорее всего) инкрементироваться. Ищем по коду все операторы «+=» (благо объем и сложность кода позволяют), их находится всего 12. В принципе можно включить метод «научного тыка» и попробовать изменить все 12 по очереди. А можно и подумать.

  1. this.S+=b.duration — что-то связано с продолжительностью (спасибо, кэп!);
  2. this.B&&(e+=this.B*(Math.random()-0.5),f+=this.B*(Math.random()-0.5))… e+=this.o*(Math.random()-0.5))— random-0.5 как-то не похоже на скорость…
  3. R+=Qc*b — хм-м… и начальное значение, и какой-то коэффициент.

Остановимся и проверим. Обновляем страницу (на всякий случай). Открываем Sources slalom_canoe12-2.js. Находим R+=Qc*b. Предположим, что b — коэффициент ускорения. И заменим его на 500 (не забываем нажать Ctrl + S).


Жмем Play в игре и…


Бинго! Наш чудо-катер устремляется к финишу. Теперь можно похвастаться перед друзьями скоростью своих пальцев :)

Отмечу, что приведенный пример — это случай, в котором удалось обойтись малой кровью. И не потребовало глубоких знаний JavaScript, архитектуры, отладки. Только арифметика.

Перейдем к другому примеру.

Spelunky

В этом примере потребуется знать, что такое if и что такое =, а также базовое знание английского языка. Не так давно на Хабре была опубликована статья о Spelunky. Игра, безусловно, заслуживает внимания. Старый добрый хардкор! Но есть в ней несколько «косяков» с управлением и коллизиями, которые мешают пройти игру. Давайте попробуем нарисовать себе жизней, бомб, веревок и прочей радости.


Открываем сайт с игрой. В инспекторе находим index.js, это и есть код игры. Первая мысль: «Какой кошмар».

Однако стоп! Встречаются и понятные слова. Например Bomb, Rope. Это уже интересно. Значит можно попробовать найти кусок кода, который обрабатывает получение предмета. А там где-то должно увеличивать количество оного…

Ищем слово Bomb. Результатов немало — 79. Попробуем Bomb Bag. И вот оно, первым же результатом!

Тут мы видим, что что-то сравнивается с Bomb Bag и если это оно, то делаем global.loc+=3 и куда-то пишется «YOU GOT 3 MORE BOMBS!» соответственно в global.loc у нас лежит количество бомб. Анализируем код, расположенный рядом, и находим переменные, в которых хранятся веревки и прочие радости. Вот краткий список:

  • global.loc — бомбы;
  • global.soc — липкие бомбы;
  • global.woc — веревки.


Открываем Console и вводим следующее.


Отпускаем паузу — и наслаждаемся полученным результатом! Не буду описывать, как нарисовать себе жизней. Пусть читатель сам попробует разобраться с этой переменной.

Вывод: умный в гору не пойдет. Изменение JavaScript-кода — это легче легкого. Обфускация — это не смертельно. Старайтесь мыслить логически. И еще: любое читерство постепенно убивает интерес к игре (во всяком случае у меня), аккуратней с этим.

После моей предыдущей статьи про борьбу с DMA, меня попросили написать статью про code injection. Не претендую на лавры первооткрывателя - про это достаточно много написано на английском, каждая уважающая себя группа, занимающаяся взломом игр, обычно имеет у себя на сайте дюжину статей про это. И я их почти все прочитал в своё время 8) В рунете дюжины статей нету, поэтому я напишу одну - постараюсь охватить всё как можно шире.

Что нам потребуется:

- Artmoney/TSearch и т.п.

- Утилита для поиска code caves - Sheep's Array of Sunshine (или Code Cave Chaos, или Tsongkie Code Cave Tool (TCCT))

- Язык программирования. В примерах - Delphi.

- Лист бумаги и ручка, голова, прямые руки, сгибающиеся в локтях

Хорошо бы иметь Red Alert 2, потому что я буду показывать на нём примеры (старьё? Я знаю, что старьё. Но ничего более нового и более показательного у меня не нашлось). Использую какую-то пиратскую русифицированную версию, v1.0.

Поскольку мы будем писать свой код на ассемблере, то нужно уметь на нём писать (знаний ассемблера в рамках MS-DOS вполне хватит), а также уметь пользоваться отладчиком SoftICE. Я умею. А вы? Нет? Ну, тогда учиться придётся самостоятельно, к нашей теме это не относится. Если да - то отлично, можно смело читать дальше.

Итак, code injection. Code injection переводится буквально - "инъекция кода" (русского эквивалента сей термин не имеет, поэтому я буду использовать английский вариант). Под этим термином подразумевается внедрение своего кода в (чужую) программу, в нашем случае - в игру.

В статье про DMA мы занимались тем, что искали способ всегда находить нужный нам адрес в памяти. Но можно пойти дальше - зачем изменять память, когда мы можем изменять сам код игры? Код, во время выполнения, тоже хранится в памяти, его тоже можно изменять, в т.ч. программно. Это гораздо удобнее - код не меняет адрес, мы можем заставить игру делать что угодно: например, значения не придётся "замораживать" таймерами. В общем, сами увидите, как это здорово 8)

Чтобы что-то изменять, нам это нужно найти. Для этого найдём адрес интересующего нас значения в памяти, и поставим брейкпоинт на запись по этому адресу. Когда произойдёт запись - исполнение приостановится, вылезет окно отладчика, и мы увидим тот код, который изменяет это значение. Его можно будет изменять.

Так же мы посмотрим, что такое code caves и научимся ими пользоваться. Code caves (в переводе означает "пещеры кода", а точнее, "пещеры в коде". Опять же, русского эквивалента не имеет) - термин, обозначающий участки кода программы, заполненные операторами NOP (байт 90) или байтами 00, т.е. которые ничего не делают. Раз они ничего не делают, то если туда запишем свой код, ничего такого не произойдёт. Именно это мы и сделаем 8) Собственно, тогда это и будет полноценный code injection.

Что ж, давайте посмотрим поближе на примерах.

3. Изменение кода игры

Итак, как я уже говорил, всё на примере Red Alert 2. Будем менять значение денег, т.к. больше-то и нечего (можно было бы сделать мгновенное строительство, но это уже сложнее, в другой раз).

Я считаю, что SoftICE у вас уже установлен, настроен и готов к работе, и по нажатию Ctrl+D вылезает его окошко. Включим окна регистров и памяти, если выключены (команды WR и WD соотв.).

Запускаем игру. Начинаем/загружаем игру. Теперь нам нужен адрес денег, его нужно найти. Но я уже нашёл указатель на него, ещё в прошлой статье. Поэтому делаем по-нашему, по-геймхакерски: жмём Ctrl+D, смотрим, чтобы был выбран нужный процесс (Game), в SoftICE набираем:

0030:00A1E0C4 60 6B C4 06 00 00 00 00 00 00 00 00 00 00 00 00

(Двоеточие в начале строки - приглашение отладчика к вводу команд, т.е. то, что начинается с ":" - вводим мы, всё остальное - вывод отладчика)
D - показать значение ячейки памяти,
A1E0C4 - адрес поинтера,
L4 - длина 4 байта.
60 6B C4 06 - содержимое поинтера
(у вас, естественно, будет другое значение, это ж DMA).

Все числа выводятся задом наперёд, так что 06C46B60 - адрес, на который указывает поинтер. Далее:

:? 06C46B60 + 24C
06C46DAC 0113536428 ". "

? - вычисление выражение (результат: первое число - в шестнадцатеричной системе счисления, второе - в десятеричной, третья штука - представление этих байтов в ASCII). Добавили к 06C46B60 смещение 24C, так что адрес денег - 06C46DAC.

Проверим значение по этому адресу:

0030:06C46DAC 10 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Всё верно - это наше значение, у меня было как раз 10000. (Внимание! Если у вас другая версия игры, и поинтер имеет другой адрес, т.е. после проделанных операций вы не нашли адрес денег - ищите его с помощью Artmoney/TSearch!)

Теперь поставим брейкпоинт на найденный адрес:

: BPM 06C46DAC W
:X

BPM - устанавливает брейпоинт на адрес памяти,
W - брейкпоинт на запись.
X - закрывает окно отладчика, и возвращает нас в игру.

После того, как вернулись в игру, начинаем что-нибудь строить. Количество денег уменьшается, поэтому срабатывает брейкпоинт, вылезает окно отладчика. В нём видим что-то вроде этого (все адреса кода могут меняться в зависимости от версии игры):

В окне кода:
.
017F:004E48F7 JMP 004E4988
017F:004E48F9 SUB EAX, EDI
.

BC - удалить брейкпоинт,
BC * - удаление всех брейкпоинтов (нам больше не нужны).

В общем-то, это почти всё - теперь осталось немного изменить код. После того, как вы начнёте изменять код - то отладчик будет уже не закрыть, т.е. если вы не допишете до конца код и вернётесь к процессу, то игра попросту аварийно завершится.

: A 004E48F9
0028:004E48F9

A - ввод ассемблерных команд с клавиатуры. Ввод начинается с адреса, используемого в качестве параметра. Заканчивается вводом пустой строки.

: A 004E48F9
017F:004E48F9 NOP
017F:004E48FB NOP
017F:004E48FC

Заменяем оператор SUB оператором NOP (т.е. вместо уменьшения EAX - ничего не делать). Мы вводим 2 оператора NOP, т.к. длинна команды "SUB EAX, EDI" равна двум байтам, а NOP - 1 байт (об этом нужно всегда помнить. Длина рассчитывается так: начальный адрес команды "SUB EAX, EDI" - 017F:004E48F9, начальный адрес следующей команды - 017F:004E48FB, следовательно длина команды равна FB-F9 = 2 байтам).

Теперь в окне кода мы должны увидеть такой код:

.
017F:004E48F7 JMP 004E4988
017F:004E48F9 NOP
017F:004E48FС NOP
017F:004E48FB MOV [ESP+24], EDI
017F:004E48FF MOV [EBX+0000024C], EAX
017F:004E4905 JMP 004E4953
.

Выполняем команду "X" и возвращаемся в игру. Попробуем что-нибудь построить, и видим, что. деньги не убывают 8) Замечательно. Но не всё так сладко: компьютерные игроки используют ту же самую процедуру (по крайней мере, в Red Alert 2) для вычисления их количества денег (это можно заметить по следующим проявлениям:
1) если поставить брейкпоинт (BPX) на адрес 004E48F9, увидим, что даже когда мы ничего не строим, брейкпоинт срабатывает;
2) враг просто будет строить орды солдат и танков 8) ), поэтому и у них их количество не будет уменьшаться. Подарить врагу неисчерпаемые материальные ресурсы? Ни за что! 8) О том, как с этим бороться - дальше.

4. Самый примитивный code injection

Перезапустите игру, альт-табом переключитесь на рабочий стол, запустите утилиту для поиска code caves (у меня - Sheep's Array of Sinshine), нужно будет указать имя процесса. В результате увидим список code cave'ов: начальный адрес, длину и секцию (г-н [Sheep] рекомендовал использовать только секцию кода .data, как самую безопасную).

В Red Alert 2 имеем code cave с начальным адресом 00B12024, длины FDC (4060) байт.

Перед тем, как писать свой код, попробуем лишь сделать переход в code cave и вернуться назад.

Заменим инструкцию "SUB EAX, EDI" на инструкцию безусловного перехода в code cave - "JMP 00B12024":

:A 004E48F9
017F:004E48F9 JMP 00B12024
017F:004E48FE

Инструкция JMP имеет длину 5 байтов, поэтому последующие две инструкции окажутся запороты: вместо


017F:004E48F9 SUB EAX, EDI
017F:004E48FB MOV [ESP+24], EDI
017F:004E48FF MOV [EBX+0000024C], EAX
017F:004E4905 JMP 004E4953

017F:004E48F9 JMP 00B12024
017F:004E48FE AND AL, 89
017F:004E48FF OR DWORD PTR .
017F:004E4905 JMP 004E4953

поэтому нам придётся восстановить ещё и эти две инструкции в нашем code cave. Поэтому же нужно всегда предварительно смотреть, сколько байтов будет занимать написанная нами инструкция, и записывать на бумажку старые, чтобы их потом восстановить.

Хорошо, теперь займёмся собственно code cave'ом:

: A 00B12024
017F:00B12024 SUB EAX, EDI
017F:00B12026 MOV [ESP+24], EDI
017F:00B1202A MOV [EBX+024C], EAX
017F:00B12030 JMP 004E4905
017F:00B12035

Этим кодом мы ничего не изменяем в нормальном ходе игры - просто восстанавливаем все испоганенные нами инструкции, и возвращаемся к инструкции, которая была после "MOV [EBX+024C], EAX". Теперь, при исполнении изменённого кода, когда очередь дойдёт до адреса 004E48F9 произойдёт переход к адресу 00B12024, там выполнится прежних 3 инструкции, и снова произойдёт переход назад, к адресу 004E4905. Это и есть простейший code injection - мы изменили код игры.

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

5. Более продвинутый code injection

Теперь напишем свой код в code cave. Здесь мы уже делаем полноценный code injection. Как сделать так, чтобы деньги не убавлялись у нас, но убавлялись у компьютерного игрока? Сделаем очень просто - сравним значение в регистре EAX со значением в ячейке памяти, на которую указывает нам поинтер.

В нашем code cave пишем такой код:

: A 00B12024
01F7:00B12024 PUSH EDX

После произведённых изменений деньги не будут уменьшаться только у нас, а у компьютера будут (для уверенности можно проверить это - поставить BPX 00B12034).

Всё 8) Мы успешно внедрили свой код.

6. Пишем трейнер

Чтобы не проделывать все эти трюки вручную, напишем трейнер. Серьёзный, взрослый трейнер с code injection 8) Пишем его абсолютно так же, как писали если бы изменяли значение в памяти.

Просмотрим машинные коды ассемблерных команд до и после замены SUB на JMP:

До:
:D 004E48F9 L5
017F:004E48F9 2B C7 89 7C 24 24 89 83 4C 02 00 00 .

После:
:D 004E48F9 L5
017F:004E48F9 E9 26 D7 62 00 24 89 83 4C 02 00 00 .

То же самое проделаем и с кодом в code cave. Всё это необязательно делать вручную - в Sheep's Array of Sunshine есть дампер памяти с форматированием для различных языков программирования. Просто пишем начальный адрес, длину - и готово.

Затем просто записываем полученные машинные коды в память, начиная с нужного нам адреса.

Исходники трейнера на Delphi прилагаются.

На этом у меня всё. Удачи. br0k3n_MinD.

7. Контакты и ссылки

Персональные уроки по почте я давать не намерен. Откровенно ламерские письма будут отвергнуты (типа, "ничего не понимаю, объясни" или "пришли мне SoftICE на мыло") и, хуже того, рискуют быть где-нибудь опубликованы мной 8) Если у вас есть какая-нибудь более или менее конструктивная критика, действительно принципиальные и хорошие вопросы, идеи, предложения - то пишите, буду рад.

28381

При нажатии на кнопку “Чтение” из файла 1.txt считываются и выводятся все строки в окно элемента управления textBox, а при нажатии на кнопку “Запись” данные из текстового поля сохраняются в файле 2.txt

Для хранения путей в программе используются две текстовых переменных: filePathIn и filePathOut

28382

Прошёл год, как программа была написана и отдана заказчику, но вдруг ему потребовалось изменить имя папки, в которой должны храниться оба файла, c 123 на Text. Задача простая, но прошло уже много времени, и исходник был потерян, что делать в такой ситуации?

28383

Полученный в результате компиляции файл (сборка) содержит внутри себя метаданные, манифест, код на языке IL (MSIL).

Манифест описывают саму сборку

MSIL код, полученный в результате компиляции файла исходного кода

То есть перед вами тот же исходник, только в другом формате. И для того, чтобы поработать с ним, Вам понадобиться специальный инструмент, который позволяет просматривать и редактировать данные внутри сборки.

Дизассемблер ILDASM

Для удобства работы создадим отдельную папку, например: ”c:\newasm” и поместим в неё файл TextEdit.exe

28384

Затем в меню “Пуск” открываем папку: «Visual Studio Tools»

28385

Запускаем командную строку разработчика

28386

Откроется консоль, вводим первую команду: ildasm. Для выполнения команды нажмите клавишу Enter.

28387

Появиться главное окно программы.

28388

Переместим файл сборку TextEdit.exe в окно дизассемблера ILASM, в результате отобразиться её внутреннее содержимое.

28389

Убедимся, что в ней содержатся нужные нам данные (пути к файлам).

28390

Два поля на месте, теперь взглянем на метаданные.

28391

Для доступа к метаданным Вы так же можно использовать сочетание горячих клавиш: Ctrl+M. Затем с помощью кнопки Find, найдём имя одного из файлов.

28393

28394

28395

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

Выгрузка данных

Выберите пункт меню File -> Dump

28396

Появится меню. В данном примере, все пункты меню оставим без изменений и просто нажмём кнопку OK.

28397

Появится диалоговое окно

28398

Выберем ранее созданную папку “newasm”, затем укажем имя и тип файла и нажмём на кнопку “Сохранить”

28399

В результате в папке “newasm” должно появиться несколько новых файлов

28400

Закрываем окно ildasm, а так же удаляем файл Textedit.exe, больше он нам не понадобиться. Теперь нас интересует полученный файл texted.il и для начала откроем его любым текстовым редактором, например блокнотом.

Снова воспользуемся поиском (Ctrl+F)

28402

Так же видим найденные строки, которые содержат пути к файлам.

28403

Изменим текущее имя папки 123 на новое название Text, для обоих файлов

28404

Сохраняем внесённые изменения и закрываем блокнот.

Ассемблер ILASM

Изменения внесены и теперь нужно преобразовать файл txted.il обратно в исполняемый файл (.exe) Для этого нам понабиться второй инструмент ILASM, ассемблер, который так же входит в состав пакета SDK и не требует отдельной установки.

Возвращаемся в консоль

28408

Вводим вторую команду:

28406

28407

Вот таким не сложным способом можно выйти из данной ситуации, при этом не имея исходника под рукой.

Вложения

The Codeby

The Codeby

ООО Кодебай

admin
Пятница на 10:09
Программа (файл) на каком языке написана?

Иван
Суббота на 10:09
Добрый день. Такая же ситуация. Пытаюсь открыть файл exe в редакторе LD DASM у меня появляется ошибка «отсутствует допустимый заголовок CLR поэтому дизассемблирование невозможно». Файл написан на Delphi.

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

Иван
Понедельник на 12:09
А как-то нормально можно посмотреть код, если есть уже окончательный exe и несколько dll проекта?

Иван
Среда на 03:09 ПП
Ну чтобы взять код себе в другой проект

admin
Четверг на 11:09
Есть вроде какие-то, но не помню названия, потому что не использую их.

Анатолий
Четверг на 12:02 ПП
Можете, помочь как я хочу переписать лаунчер для игры, что бы изменить проверку файлов но не могу никак открыть его. Пробывал через ресторатор 2007 но оно не может прочитать пату файлов точнее отобразить язык.

Как я программно могу менять значения в другой программы\игры? ведь нет никакого изначального "api". я подозреваю, что изменения происходят на низком уровне, то есть изменяются данные в памяти.. но как они тогда узнают адреса? и что именно этот адрес принадлежит именно этой программе\игре??

Что касается Windows, то советую почитать Рихтера - "Windows для профессионалов", в частности "Глава 22 - Внедрение DLL и перехват API-вызовов". Если коротко, то вы можете внедриться в память чужого приложения и выполнять код из его адресного пространства: wiki: DLL injection. По Unix системам ничего сказать не могу. Читайте про виртуальное адресное пространство. Давно уже в юзермоде нет проблемы попасть в "чужие" адреса. "и что именно этот адрес принадлежит именно этой программе\игре??" - такого вопроса в ОС с виртуальной памятью не существует. Виртуальные адреса не могут "принадлежать именно этой программе\игре". Физические могут, но в данном вопросе это не нужно.

"я подозреваю, что изменения происходят на низком уровне"

Верно подозреваете:) Но есть немного и другие штучки.

А так, давайте рассмотрим одну онлайн игру. Смысл такой, есть игроки тоесть танки. У танков есть определенное действие, например стрельба, передвижение.

Выходит: 1 программа сервер, которой мы отправляем данные, а она обрабатывает их. И неограниченное количество клиентов которые эти данные и шлют(перемещение танков).

В клиент программе присутствуют обычные нам ограничения. Например: вы можете выстрелить только 1 раз в 2 секунды. Тоесть пользователь нажал на пробел->проверка на таймер->если все ок то отправляем серверу комманду что мы выстрелили.

Вот пример небольшой игры. Как создать под нее чит? Требуется детально продебагить код программы, ее действия. Существуют множество утилит делающие это, они используя низкоуровневое апи могут определить какие программа вызывала функции, что писала в переменные.

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

Сегодня мы наконец-то расскажем вам, как-же редактировать исходный код игры на ПК.

Необходимый софт

Скачайте обозначенную версию

Немного теории

И так, что же мы будем делать?

Мы сначала дизассемблируем AoC2, проверим результат, внесем некоторые изменения и заново соберем АоС2.

Что же такое дизассемблирование?

Для начала, разберемся с Java Virtual Machine (JVM).

Что такое JVM? JVM - это программное обеспечение, которое эмулирует компьютер. JVM используется для запуска приложений, написанных на java. Однако JVM читает не просто java код, а скомпилированный байт-код Java, предварительно созданный из исходного кода Java-программой-компилятором Java (javac).

Использование байт-кода и JVM позволяет запустить скомпилированную программу на любом другом устройстве, на котором установлена JVM.

Вот мы и подошли к дизассемблированию. Дизассемблирование — это трансляция машинного кода в изменяемый байт-код.

(Если кто-то еще не понял, то АоС2 написана на Java)

Итак, мы разобрались как работает JVM, и можем приступать к работе.

Дизассемблирование

Заходим в скачанную нами программу (muxv.exe) и выбираем раздел «Дизассемблирование».

Гайд. Как редактировать исходный код игры., изображение №2

Указываем путь к файлу «disassemble.pу», который лежит в папке, в которую установлена Krakatau, потом указываем все остальные папки и файлы.

У вас может быть и другое местонахождение файлов и папок.

У вас может быть и другое местонахождение файлов и папок.

Если вы все сделали правильно, то у вас должно появиться такое окно командной строки:

Дизассемблирование может занять несколько минут.

Если у вас не получается дизассемблировать, то проверьте еще раз все папки и файлы. В названиях папках не должно быть знака «+». Если и это не помогает, смените папку, в которой находится файл.

После окончания дизассемблирования, откройте папку, которую вы указали, как «Директория, куда отправятся дизассемблированные файлы» и найдите там файл Menu_About.j (без цифр). Откройте его любым текстовым редактором.

Перед вами должна появиться примерно такая картина:

Выглядит страшно

Это — байт-код java, с ним мы и будем дальше работать.

Для начала определимся, что мы будем изменять. Допустим, вы решили заменить автора музыки в разделе «Подробнее».

Читайте также: