Перейти к содержанию

Корсары: Город потерянных кораблей


Рекомендуемые сообщения

Игра необычна тем, что все числовые значения (здоровье, энергия, характеристики) хранятся как текст o_0 Как же искать указатели на такие переменные? Ведь длина текста изменчива, значит кроме указателя на адрес надо ещё искать длину строки. Видимо CE тут не поможет, только в отладке копаться? Может кто уже изучал эту игру?

Ссылка на комментарий
Поделиться на другие сайты

В ArtMoney попробуй сделать так:

Нажимаем "Искать":

Параметры поиска "Точное значение".

Тип: "Текст".

Возможно, тебе поможет это.

Ну и это тоже попробуй:

Ссылка на комментарий
Поделиться на другие сайты

Да значения то Artmoney находит, но не указатели, и даже Автоизменение адресов помогает через раз, видимо длина строк меняется. А вообще применительно к этой игре проще скриптовый язык изучить и писать читы на нём - в папке PROGRAMS лежат текстовые файлы-скрипты, с помощью них можно сделать всё что угодно, если разобраться. Я уже сделал бессмертие, боеприпасы, энергию, убийство с одного удара, быструю перезарядку орудий кораблей, супер ветер (чтобы плавать быстро). Что пока не получилось - починка парусов. Кому интересно, могу выложить чит-файлы.

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

100% выход - копаться в отладке"

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
  • 4 недели спустя...

Вот накидал скрипт для беесмертия ГГ (версия игры 1.2)

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,1024) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)


newmem:
push edx
sub edx,60
cmp [edx],79616C70 ///этот фильтр по строке "player" ещё надо проверить, но пока работает
pop edx
jne originalcode
mov [edx],00393939 //записали в адрес здоровья строку "999" и символ окончания строки
jmp "ENGINE.exe"+56F1 //выход из цикла обработки строки

originalcode:
mov [edx],al
add ecx,01

exit:
jmp returnhere


"ENGINE.exe"+56E5:
jmp newmem
returnhere:




[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"ENGINE.exe"+56E5:
mov [edx],al
add ecx,01
//Alt: db 88 02 83 C1 01

Теперь проблема в том, что все строки обрабатываются парочкой инструкций, а значит надо весь взлом делать в одном скрипте с флагами, как это делает Recifense. Буду разбираться...

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Это что-то новенькое +1.

Ты можешь ещё попробовать поискать код который часто работает с указателем на главного героя считывая его. Например игровой интерфейс может "постоянно обращаться" к текстовым данным именно твоего героя. Перед этим обращением теоритически неплохо было бы сделать инъекцию изменения этих данных. Фильтров по идее не понадобится. Я понимаю что "писать-то советы легко", на деле это может оказаться сложнее. Так что возможно твой вариант разумнее по трудозатратам.  

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

А что, в этой версии убрали папку Program (C:\games\корсары\Program) со скриптами?

Да вообще она во всех версиях закрыта только NoDVD от версии 1.2 открывает

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Итак, начинаем ломать новую часть Корсаров Каждому своё v 1.0.2.

Ломать игру CE по прежнему считаю слишком сложным путём. Имеем параметр "run=seadogs.c" в engine.ini, но к сожалению самого файла seadogs.c в папке с игрой не наблюдается. Попытка подсунуть игре этот и другие файлы из версии ГПК ни к чему не приводят - вылет с ошибкой о неправильной передаче аргументов функциям, другие функции оказались и вовсе не обЪявлены - видимо что-то там в движке игры изменили... Попытался как-то исправить ошибку, но там дальше вообще непонятные ошибки идут, что-то про скобку ")" - сами логи подробностями не блещут, даже не показывает имя файла в котором возникает ошибка...

В общем надо как-то заставить игру запускать посторонний lua-скрипт. Все скрипты запускаются из seadogs.c (которого у нас нет). Как бы подсунуть игре оигинальный файл и заставить загружать свой скрипт пока не придумал... также непонятно откуда игра берёт файл seadogs.c, видимо из какой-то DLL-ки (вот бы его найти и выдрать как). Ломаю голову дальше...

Также любопытной мне кажется другой параметр INI-файла: "codefiles = 0", который создаёт некий дамп скриптовых файлов. Как дамп превратить в текстовый файл скрипта тоже непонятно - в самом дампе сохраняются только строки, всё остальное превращается в непонятный байт-код.

Сам байт-код оказался элементарный:


WORD version; //3A 1A - скорее всего версия скрипта
DWORD reserved; //00 00
DWORD filename_length; //длина имени файла
DWORD separator_index; //3B 04 NN 00, где NN номер строки, начиная с 00 и заканчивая последней строкой + ещё одна с четырьмя нулями после номера строки
WORD opcode; // опкод выполняемой команды, либо 00 00 в случае пустой строки (пропуск строки)
};
struct b_file {

Итак, сначала игра считывает 2 байта version, и если они окажутся меньше 3A 1A (например, 3A 14), выводится ошибка "Wrong script version".

Далее идут 4 нулевых байта.

Дальше указывается длина текстовой строки с именем файла скрипта. В длину строки также входит и полный путь к файлу (controls\init_pc.c итого длина строки = 18), ну и следом сама строка с именем файла скрипта.

Далее начинается собственно сам скрипт в байт-коде. Формат байт-кода такой:

3B 04 (это разделитель строк), дальше идут 2 байта с номером строки. Причём все скрипты начинаются со строки 00 00 и заканчиваются строкой на одну больше чем есть в скрипте (видимо последняя нулевая строка - знак окончания скрипта).

После номера строки идут 2 байта - опкод выполняемой команды, ну и далее всякие операнды до тех пор, пока снова не встретится разделитель 3B 04 с номером следующей строки. Если строка пустая (программист просто сделал отступ в виде пустой строки опкодом будут байты 00 00.

Вот собственно и весь формат b-файлов. Осталось составить таблицу опкодов и выполняемых ими команд.

Вот собственно и весь формат b-файлов. Осталось составить таблицу опкодов и выполняемых ими команд. А это надолго... надо погуглить, может и есть какие редакторы байт-кода для Корсаров... но вроде бы нету..

Ссылка на комментарий
Поделиться на другие сайты

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

Скрипт seadogs.c восстановлен до строки 833, дальше пока затык...

Вот бы дизассемблер кто накатал...

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

b-code.rar

PROGRAM_CSS.rar

Ссылка на комментарий
Поделиться на другие сайты

В общем мне по прежнему непонятно какого чёрта оно ругается на размер массива object Nations[MAX_NATIONS]; при определённом выше #define MAX_NATIONS 5. Обе строки находятся в файле globals.c, который ДОЛЖЕН браться из внутренних ресурсов игры при его отсутствии в папке PROGRAM, но ведь ругается.. в файле seadogs.c к массиву нет прямого обращения, есть только вызов функции, которая уже обращается к этому массиву. Функция NationsInit() также находится за пределами seadogs.c - мистика какая-то, либо хитрая защита от распаковки скриптов... С ошибкой столкнулся другой чел, отписал ему в личку, может он нашёл решение за 2 года...

Но есть и хорошие новости - исходники скриптов в текстовом виде распаковываются игрой и на какое-то недолгое время оседают в памяти по адресу [[0046B044]+0] (применительно к версии 1.0.2) - они оттуда очень быстро удаляются уже после появления на экране логотипа Акеллы, так что извлекать их надо в процессе загрузки игры. Чем я сегодня и попробую заняться :)

Upd: природа ошибки - компилятор не даёт указывать размерность массива через переменную, хоть ты её перез #define обЪявляй, хоть даже через

int DIMENSION=10;

int mas[DIMENSION];

Всё равно вылезет ошибка размера. Почему так происходит непонятно... Фиксить только жёстко заданной размерностью int mas[10]; :(

Подскажите как из памяти текст скопировать? CE или Olly копирует вместе с байтами - HEX-представлением буковок.. а как без них бы?

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Люблю такие штуки, можно в личку ссылку на игру?

[CENSORED]

без бессмертия в неё играть невозможно. Валят с двух ударов %)

И вроде как сейвы портит за читерство. Прибавил всего 1000 денег и сейв запорол (обнаружил только после перезапуска игры).

//Kvazimado

Я прошу прощения, но в каком месте было не понятно высказывание "Можно в личку"?

Правила, прочтите, молодой человек.

Замечание.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Для интересующихся инфа по прогрессу взлома игры. Мне помогли вытащить скрипты из игры (не все, а только те, что загружаются при запуске игры). В результате проблема с размерностью массивов выше отпала сама собой (причину ошибки так и не понял). Однако появился неприятный сюрприз - отладочная консоль никак не вызывается. Вроде бы всё на месте - интерфейс отладочного окна есть, файл скрипта Interface\debuger.c распакован, но насколько я понимаю не срабатывает ивент BOAL_Control, тот самый внутриигровой ивент, вызывающий консоль. т.е. этот ивент скорее всего обрабатывается ENGINE.EXE или одной из dll-ок и не даёт себя перехватить посредством скриптов :( надо копаться в дизассемблере, а это сложно)) возможно я не там копаю...

Ссылка на комментарий
Поделиться на другие сайты

Продолжаю изучать вызовы функций игрового движка. Пока только научился выводить надпись на экране. Функцию Log_Info(string, false) нашёл с помощью Function Hacker'а. Читом это назвать сложно, но вдруг кому интересно вот скрипт:


[ENABLE]
alloc(newmem,1024)
createthread(newmem)
newmem:
push ebp
mov ebp,esp
push edx
push ecx
mov edx,450668 //string_offset
mov ecx,[battle_interface.dll+31028] //Game Console pointer ?
push 00 //2-nd argument (0=исчезающая надпись, 1=надпись не исчезает)
push edx //1-st argument (string_offset)
call battle_interface.dll+1ACB0 //Log_Info(string, bool)
pop edx
pop ecx
pop ecx
pop edx
mov esp,ebp
pop ebp
ret
[DISABLE]
dealloc(newmem)

Других функций пока не нашёл.. очень жаль :(

Upd: буквально 5 минут назад с удивлением обнаружил, что читерская дебаг-консоль прекрасно себе появляется, если начать новую игру. Видимо инициализируется где-то при старте сволочь такая. Убил кучу времени на эту хрень, а оно оказывается давно работало))) Собираюсь создать сет читов и забиндить их на кнопки читерской консоли, потом уже выложу. кому не терпится почитерить могу поделиться файлами скриптов для включения консоли. Напомню что речь идёт об игре "Корсары: Каждому своё" ver. 1.0.4 (25.12.12)

Изменено пользователем aliast
Ссылка на комментарий
Поделиться на другие сайты

Для интересующихся инфа по прогрессу взлома игры. Мне помогли вытащить скрипты из игры (не все, а только те, что загружаются при запуске игры).

aliast, не поделитесь вытащенными скриптами?

Ссылка на комментарий
Поделиться на другие сайты

Подскажите как из памяти текст скопировать? CE или Olly копирует вместе с байтами - HEX-представлением буковок.. а как без них бы?

IDA Pro прекрасно сохраняет всё как надо.

aliast, не поделитесь вытащенными скриптами?

Ссылка на читы http://yadi.sk/d/gUAuDz_S2K33U

Ссылка на ориг. файлы seadogs.c, ships\ships.c и ships_init.c (кто хочет добавлять в игру новые корабли) http://yadi.sk/d/-dsKvVTa2UnWN

Ссылка на все вытащеные скрипты в одном файле (делить на отдельные файлы было лениво) http://yadi.sk/d/AzjWxhNn2Unyn

Все файлы для игры версии ver. 1.0.4 (25.12.12) - в пропатченных играх эти скрипты могли измениться! Использование скриптов от другой версии может привести к неработоспособности исправлений, внесённых новым патчем.

Ссылка на комментарий
Поделиться на другие сайты

Хм, хотя бы при том, что поиск дал бы множество ответов, и тебе бы не пришлось лишний раз тратить свое время)

Кроме того, поиск дает ссылку на правила форума, в котором говорится, что каждый пост должен быть информативен. Но так как твой вопрос слабо вяжется с термином информативности, я предложил тебе самый простой способ - поискать ответ на форуме.

В любом случае, советую - попроще объясняй, что тебе надо. Что именно читерить ты собрался, что хакать, как играть и тп. И будь уверен, люди к тебе потянутся)

Ссылка на комментарий
Поделиться на другие сайты

Хм, хотя бы при том, что поиск дал бы множество ответов, и тебе бы не пришлось лишний раз тратить свое время)

Кроме того, поиск дает ссылку на правила форума, в котором говорится, что каждый пост должен быть информативен. Но так как твой вопрос слабо вяжется с термином информативности, я предложил тебе самый простой способ - поискать ответ на форуме.

В любом случае, советую - попроще объясняй, что тебе надо. Что именно читерить ты собрался, что хакать, как играть и тп. И будь уверен, люди к тебе потянутся)

ааа. спасибо =)

Продолжаю изучать вызовы функций игрового движка. Пока только научился выводить надпись на экране. Функцию Log_Info(string, false) нашёл с помощью Function Hacker'а. Читом это назвать сложно, но вдруг кому интересно вот скрипт:


[ENABLE]
alloc(newmem,1024)
createthread(newmem)
newmem:
push ebp
mov ebp,esp
push edx
push ecx
mov edx,450668 //string_offset
mov ecx,[battle_interface.dll+31028] //Game Console pointer ?
push 00 //2-nd argument (0=исчезающая надпись, 1=надпись не исчезает)
push edx //1-st argument (string_offset)
call battle_interface.dll+1ACB0 //Log_Info(string, bool)
pop edx
pop ecx
pop ecx
pop edx
mov esp,ebp
pop ebp
ret
[DISABLE]
dealloc(newmem)

Других функций пока не нашёл.. очень жаль :(

Upd: буквально 5 минут назад с удивлением обнаружил, что читерская дебаг-консоль прекрасно себе появляется, если начать новую игру. Видимо инициализируется где-то при старте сволочь такая. Убил кучу времени на эту хрень, а оно оказывается давно работало))) Собираюсь создать сет читов и забиндить их на кнопки читерской консоли, потом уже выложу. кому не терпится почитерить могу поделиться файлами скриптов для включения консоли. Напомню что речь идёт об игре "Корсары: Каждому своё" ver. 1.0.4 (25.12.12)

куда кидать скрипты ? ну или как включить консоль ККС 1.0.4 . а то что то не доходит :-D

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.