Current time: 13.11.2024, 07:23 Hello There, Guest! (LoginRegister)
Language: english | russian  

Poll: Интересно ли вам научиться самим находить необходимые данные в exe игры без посторонней помощи?
This poll is closed.
Да! 57.14% 8 57.14%
Конечно же ДА!!! 42.86% 6 42.86%
[...] 0% 0 0%
Total 14 votes 100%
* You voted for this item. [Show Results]

Post Reply 
Threaded Mode | Linear Mode
Реверс игры для новичков
» Небольшой туториал по нахождению данных для UN:C
Author Message
XEPOMAHT Offline
Moderators

Posts: 2354
Post: #46

(11.02.2022 06:09)wessonsm Wrote:  Но в 16-ричном виде команда имеет вид 8D 8B 4C FF FF FF, здесь нет и намека на нужное мне значение 0B4.
Как быть? Как изменить команду к примеру скажем на lea ecx, [ebx-0A4h] бинарником?

Значение отрицательное. Соответственно минус A4h = ffffff5ch. Т.е. бинарным патчем меняешь 1 байт 4С на 5С в указанном тобой примере.
11.02.2022 06:57
Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 792
Post: #47

XEPOMAHT, точно! Я забыл о записи отрицательных чисел.
Спасибо.
11.02.2022 07:03
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #48

(18.05.2022 16:21)wessonsm Wrote:  Случайно обнаружил ошибку в 9999 era - stdlib.erm (вылетало).


Имя дефа или pcx - это тоже строка, поэтому последнее условие нужно изменить на


wessonsm, не могу подтвердить - аргументом передаётся int
https://github.com/daemon1995/h3era_plug...n.cpp#L349

ну или вот сама ф-ция
int __thiscall Dlg_SendItemCommand(_Dlg_ *dlg, int cmdtype, int cmdsubtype, int itemind, int newparval)

всё равно ждём в дискорде - там активно ведём разработку Spiteful


Image: widget.png?style=banner2

Новейший Heroes Launcher
18.05.2022 20:25
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 792
Post: #49

daemon_n, мне кажется, для строки этот int означает указатель на строку (адрес строки), разве нет?
И как тогда передать в функцию имя дефа или pcx (скажем somedef.def), какое число использовать?
А вообще я ориентировался по описанию DL:A в хелпе (так как функционал аналогичный) - там имя файла это текстовая переменная.
(This post was last modified: 18.05.2022 21:29 by wessonsm.)
18.05.2022 21:17
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #50

wessonsm, вот без преобразования int и передаётся по умолчанию

я тоже могу ошибаться - проверить можно легко, использовав ф-цию на практике. Скажем, имя def файла в первом слоте существ в окне героя.


Image: widget.png?style=banner2

Новейший Heroes Launcher
18.05.2022 21:19
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 792
Post: #51

daemon_n, можно передать адрес числом, но для этого нужно сначала его узнать.
Хоть это и 1 строка в скрипте, но все же.
А вот такой вариант вполне работает без дополнительных уловок, если внести предлагаемое исправление (я проверял):
!!FU(H3Dlg_SendCmdToItem):P(DlgAdress)/(ItemId)/(DLG_CMD_SET_PCX)/^somepcx.pcx^;
А без исправления будет вылет, так как игра попытается прочитать что-то по несуществующему адресу.
(This post was last modified: 18.05.2022 22:13 by wessonsm.)
18.05.2022 22:02
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16654
Post: #52

Дп, всё верно. Для строк нужен адрес.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
18.05.2022 22:29
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2819
Post: #53

(18.05.2022 21:17)wessonsm Wrote:  daemon_n, мне кажется, для строки этот int означает указатель на строку (адрес строки), разве нет?
И как тогда передать в функцию имя дефа или pcx (скажем somedef.def), какое число использовать?
Все верно - это указатель на строку.
В героях строка может быть двух видов: массив символов, либо класс std::string (в героях он чуточку по своему сделан, но в целом это тоже самое). В обоих случаях они оба лежат в так называемой "куче" - такая область оперативной памяти (а есть ещё "стек"). И для получения доступа к ним и нужен указатель.
Следуем дальше: в функцию ты передаешь не саму строку (потому что вся строка может занимать очень очень много места (например всю "Войну и Мир")), а лишь указатель на строку, который весит всего 4 байта - это и есть тип int, хотя я не понимаю почему он знаковый (как по мне он должен быть uint). А программа сама потом по этому указателю найдёт данные в куче. Очень часто вы можете встретить проверку на null, которая означает что если адрес в указателе лежит - данные есть, если в указателе 0, то к данным невозможно обратиться

wessonsm, daemon_n, если вы занимаетесь реверсом - вам нужно очень хорошо понимать разницу между значимыми типами и ссылочными типами данных.
А для этого нужно понимать разницу что такое стек и куча.
Указатель (4 байта) лежит в стеке.
Данные (размер может быть очень большой) лежат в куче.
К стеку скорость доступа многократно выше, чем к куче. Но стек имеет очень маленький размер в сравнении с кучей.

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


game bug fixes extended.dll || My Plugins || My GitHub
19.05.2022 19:29
Visit this user's website Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #54

Лично мне больше понравился этот плейлист на данную тему.


Image: widget.png?style=banner2

Новейший Heroes Launcher
01.06.2022 05:45
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 792
Post: #55

Расширение и перенос структуры в памяти как делается?
Я так понимаю, нужно пропатчить все места в коде игры, где идет обращение к полям этой структуры?
А как тогда убедиться, что нашли действительно ВСЕ такие места?
Ведь значительная часть кода не разобрана даже.
(This post was last modified: 03.09.2022 06:35 by wessonsm.)
03.09.2022 06:26
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #56

wessonsm, берём адрес указателя на структуру и пишем туда указатель на свою, расширенную структуру.


Image: widget.png?style=banner2

Новейший Heroes Launcher
03.09.2022 09:17
Visit this user's website Find all posts by this user Quote this message in a reply
wessonsm Offline

Posts: 792
Post: #57

(03.09.2022 09:17)daemon_n Wrote:  wessonsm, берём адрес указателя на структуру и пишем туда указатель на свою, расширенную структуру.
Это надо осмыслить, желательно на примере.
Есть какой-то пример кода хотя бы один?
03.09.2022 11:01
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16654
Post: #58

1) Выделить память динамически (VirtualAlloc | malloc | new | GetMem in Delphi) или статически uint8_t newStruct[1000];

2) Пропатчить все обращения в коде к старому адресу структуры на новый.
Найти все обращения к структуре не просто. Olly Debugger 1 — ПКМ на команде ≠ Search For — All Constants — вводим базовый адрес структуры.
Или нажимаем на строку с командой и обращением к структуре, а затем ПКМ — Find all references to — Address constant.
Но это только часть. Если есть обращение к N-ному элементу структуры, то компилятор заранее рассчитывает адрес как базовый + индекс элемента * размер элемента.
Тут, возможно, ПКМ в IDA и что-нибудь вроде find all x-references. Может, комрады подскажут. Патчить нужно соответственно, на новый адрес + (адрес в коде - старый адрес).

3) Уведомить Эру, что структура перенесена.
RedirectMemoryBlock (старый адрес структуры/массива, старый размер всего массива структур/структуры, новый адрес структуры/массива).


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
03.09.2022 11:35
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #59

Berserker, сколько ни видел обращений к структурам, они все по ссылке идут.
Так понимаю, уведомить Эру надо, потому что она раньше всех плагинов на адреса цепляется?


Image: widget.png?style=banner2

Новейший Heroes Launcher
03.09.2022 11:45
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16654
Post: #60

Да ладно. Куча статических структур, весь вог в статике. Если память выделяется динамически, то проще всё, конечно. Просто перезаписываем адрес. Вот только если память очищается время от времени, выделять нужно её геройской функцией malloc.

Эра патчит много вог-кода. А там статические адреса. UN:C тоже работает со статическими. Вот где хранится единственно верный указатель на массив информации о монстрах в игре?
В OnAfterWoG достаточно вызвать RedirectMemoryBlock. Для бОльшей совместимости могу адреса следующих структур получать при отсутствии перенаправлений из указателей:

Code:
procedure OnAfterStructRelocations (Event: GameExt.PEvent); stdcall;
begin
  SecSkillNames := GameExt.GetRealAddr(SecSkillNames);
  SecSkillDescs := GameExt.GetRealAddr(SecSkillDescs);
  SecSkillTexts := GameExt.GetRealAddr(SecSkillTexts);
  MonInfos      := GameExt.GetRealAddr(MonInfos);
  ArtInfos      := ppointer(ArtInfos)^;
  Spells        := GameExt.GetRealAddr(Spells);
end;

SecSkillNames: PSecSkillNames = Ptr($698BC4);
SecSkillDescs: PSecSkillDescs = Ptr($698C34);
SecSkillTexts: PSecSkillTexts = Ptr($698D88);
Spells: PSpells = Ptr($7BD2C0);
MonInfos: PMonInfos = Ptr($7D0C90);
ArtInfos: PArtInfos = Ptr($660B68);

Только указатели в студию. Вторичные навыки (имена, описания), заклинания, монстры, артефакты.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
03.09.2022 12:47
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group