Найти в Дзене
Adr Asd

Взлом игр. dayZ 1.21 - износ оружия (offline мод).

Всем привет.

Дёрнуло меня давеча посмотреть, а что ж эдакое - этот dayZ, да вот незадача - он онлайн, а мне подавай сингл-плей да ещё без стим, этой гадости (steam) - да не будет на компе. Ну то есть я искал сервер и клиент. Поискав на просторах (помойки) интернета день, понял что не всё так безоблачно как у EFT (aki, jet). Попался сервер версии 0.62.142963 и клиент к нему 0.62.144063 , один энтузиаст собрал и настроил, но есть неприятные глюки (оружие вместо повесить на плечо - выбрасывает, прочие), да и староваты версии. Попалась информация об офлайн модификации - DayZ.Community.OfflineMode и нашёлся клиент DayZ_1.21.156300 - вот с этим вполне получилось, это конечно не сервер и поиграть по сети с друзьями вроде не получится (не проверял), но для побегать поизучать карту вполне.

Ну зашёл я в общем в игру, из меню мода (Y) телепортировался в какой то населённый пункт, дома, зомбаки бегают, начал стрелять и где то через минуту оружие перестаёт функционировать, я в панике удираю от толпы бешенных фанатов, залезаю на первый попавшийся баобаб (сарай ;- ), а игра мне сообщает что берданка испорчена ;-\ Хотя только что была "не тронута". Что за нахер. Беру из меню мода калаш, магазин, приклад, цевьё, стреляю, через минуту - испорчен, ну это ваще ненормально, брал и находил другие пушки - ровно то же. Начинаю подозревать - что это и есть хардкор по задумке "гениальных" разработчиков. Ну следуя их пониманию ХАРДКОРА, дальнейшим его развитием будет - заставить игроков кидаться патронами в зомбаков и дубасить друг друга испорченными пушками. Да не осудят меня фанаты deyZ ;-)

Разумеется - мириться с такой подставой мы не будем, и отучим DayZ_x64.exe портить нам оружие. Почитал статьи по настройке серверов под себя и понял - что распаковывать, править конфиги на каждый предмет, перепаковывать, а при ошибках всё по новой - не наш путь, возьмём отладчик.

Как запускать.

Запускал через SmartSteamEmu - какой версии даже не знаю, взять с какого нибудь игро - клиента. (файлы приложу).


Путь к игре в моём случае:
f:\games2\dayz121\Dayz_Land\

Запускать -
.\Missions\DayZCommunityOfflineMode.ChernarusPlus\DayZCommunityOfflineMode.bat
- он в свою очередь запускает
SmartSteamLoader_x64.exe с ini файлом startserver.ini в качестве параметра.
- в
startserver.ini - прописаны параметры запуска DayZ_x64.exe


Привожу содержимое стартовых файлов:
1) распакованный офлайн Мод в папке с игрой - это папка Missions
- в нём три папки, я использовал только
DayZCommunityOfflineMode.ChernarusPlus
- в
.\Missions\DayZCommunityOfflineMode.ChernarusPlus\DayZCommunityOfflineMode.bat такое содержимое:

@echo off
taskkill /F /IM DayZ_x64.exe /T
RD /s /q "storage_-1" > nul 2>&1
cd ../../
start f:\games2\dayz121\Dayz_Land\SmartSteamEmu\SmartSteamLoader_x64.exe f:\games2\dayz121\Dayz_Land\SmartSteamEmu\startserver.ini

2) в папке с игрой располагается папка SmartSteamEmu - там создаём файл startserver.ini с содержимым:
[Launcher]
Target =
f:\games2\dayz121\Dayz_Land\DayZ_x64.exe
StartIn =
f:\games2\dayz121\Dayz_Land\
CommandLine =
-port=2302 -mission=.\Missions\DayZCommunityOfflineMode.ChernarusPlus -nosplash -noPause -noBenchmark -filePatching -doLogs -scriptDebug=true
SteamClientPath = SmartSteamEmu\SmartSteamEmu.dll
SteamClientPath64 = SmartSteamEmu\SmartSteamEmu64.dll

Persist = 0
ParanoidMode = 0
InjectDll = 0

... и так далее.

Стартовые файлы прилагаю, исправьте пути на свои.

Проверяем на работоспособность, не работает - ищем ошибки и работает.


Приступаем к исправлению.
Нам понадобятся
x64Dbg и ArtMoney или CheatEngine (у меня ArtMoney80).

Читаем справку к DayZ.Community.OfflineMode. Запускаем dayz файлом DayZCommunityOfflineMode.bat , из меню мода по (Y) спавним нужное оружие и лучше с глушителем, чтоб сволочи не набежали ;-) Нюанс, у меня игра периодически падает при выборе в списке меню мода.

Взяли пушку. Идём в инвентарь, наводим мышку, а оно нам пишет - что пушка уже повреждена

-2

ну ничего, лиж бы стреляла.

Запускаем ArtMoney, выбираем процесс dayz и производим поиск неизвестного значения с точкой 4 байта (float), ожидаем. После окончания поиска делаем в игре пару - тройку выстрелов и нажимаем в ArtMoney кнопку отсеять , в строке значение выбираем уменьшилось и ок. Повторяем выстрелы - отсев. Можно походить секунд 10 не стреляя, в ArtMoney отсеять и в строке значение выбрать не изменилось - чем отсеять порядочное количество лишнего. Повторяя эти две процедуры отсева - добиваемся приемлемого количества результатов. Добавляем их в правое поле.

-3

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

-4

Стреляем и видим что значение в ArtMoney уменьшается, нашли верно. А также статус оружия в инвентаре стал нетронуто.

-5

Можем заморозить значение и убедится что это оно. Теперь копируем адрес значения (здесь 02805A1F6330, у вас будет другой) куда нибудь в блокнот.

-6

Закрываем ArtMoney, запускаем x64Dbg. В отладчике идём в меню->Присоединиться

-7

и выбираем процесс DayZ_x64. После присоединения к процессу игры, щёлкаем во вкладке hex-дампа x64Dbg, нажимаем Ctrl+G и в окне перехода вводим найденный в ArtMoney адрес, хранящий здоровье оружия.

-8

Видим на скриншоте это перевёрнутое число 437A0000 - это hex-представление числа 250.00 типа float (проверьте в онлайн конвертере).

Щёлкаем правой мышкой по первому байту адреса (000002805A1F6330) в дампе и в контекстном меню->Точка останова->Аппаратная,Запись->Dword

-9

Мы установили аппаратную точку останова (хардварный бряк) на адрес хранения здоровья оружия. Если игра приостановлена отладчиком нажимаем F9, идём в игру и делаем выстрел. Происходит остановка на нашем бряке.

-10

Выделенная строка - где остановились, но аппаратная точка останова на запись - срабатывает после записи, а значит она строкой выше. Запись происходит в строке movss dword ptr ss:[rbp+10],xmm0 (добавил комментарий запись износа оружия.) Если установить бряк выше по коду и понаблюдать за алгоритмом и XMM регистрами в работе, то при каждом выстреле там появляется число 0x437A0000 и после ведуться вычисления. Это видимо число максимального здоровья оружия 250 (0x437A0000).

То есть, если в movss dword ptr ss:[rbp+10],xmm0 вместо xmm0 мы вставим 0x437A0000 - то оно и будет записываться вместо уменьшающегося здоровья в xmm0. Если мы просто напишем mov dword [rbp+0x10], 0x437A0000 - не учитывая размер инструкции, мы испортим далее следующую. Прямо под функцией после ret есть достаточно свободного места, перейдём туда, запишем нужные инструкции и вернёмся. Делаем.

Смотрим адрес первой пустой строки после ret, на скриншоте это 00007FF74D8F8981 | CC | int3

Выделяем строку movss dword ptr ss:[rbp+10],xmm0 , нажимаем пробел и пишем в окне Ассемблирование:

jmp 0x7FF74D8F8981 нажимаем OK

-11

Так как инструкция с переходом короче инструкции которая была тут ранее, от неё остались байты, занупаем (nop - no operator, пустой оператор) остатки, между jmp dayz_x64.7FF74D8F8981 и mov r15,qword ptr ss:[rsp+B0]

1) Правой мышкой по строке после jmp dayz_x64.7FF74D8F8981
2) В контекстном меню->Двоичные операции->Заполнить командами NOP

-12

3) В окне Размер нажимаем ОК И вместо остатков инструкции там нупы

-13

Теперь выделяем строку с адресом на который мы создали переход, 0x7FF74D8F8981 нажимаем пробел и пишем в окне Ассемблирования:

mov dword [rbp+0x10], 0x437A0000

-14

А на следующей строке таким же образом записываем инструкцию возврата к строке, которая ранее была следующей после записи, это инструкция mov r15,qword ptr ss:[rsp+B0] (по адресу 00007FF74D8F895E).

Пишем jmp 0x7FF74D8F895E и того получается:

1) Перешли к нашему патчу
2) Патчим здоровье оружия нужным числом
3) Возвращаемся к следующей инструкции после перехода

-15

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

-16

Если после долгой стрельбы оружие как новенькое - значит порядок.

Сохраняем исправления в игре. Правой мышкой в коде, в контекстном меню->Исправления

-17

И в окне исправлений по кнопке исправить файл

-18

В диалоговом окне сохранения задаём имя, например DayZ_x64_p1.exe , отсоединяем процесс в x64Dbg, закрываем его и игру. В папке dayz сохраним оригинальный DayZ_x64.exe куда нибудь, переименуем его или удалим. DayZ_x64_p1.exe переименуем в DayZ_x64.exe и запускаем.

-19

Ну вот - порядок, всем удачи. ;-)