Current time: 29.11.2024, 15:05 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
igrik Offline

Posts: 2819
Post: #31

Продолжим...
Нам необходимо решить вторую часть вопроса: убрать доп.урон у баллисты шансами 50%,75%,100%

Итак, поехали.
Мы остановились на адресе 0043FF79. С него и начнем.
Если вы куда-то переместились в другое место, то кликаем ЛКМ в закладку IDA-View, жмем горячую клавишу G, вставляем в окно с вводом адреса 0043FF79 и жмем OK. В итоге мы перепрыгнули на первый вызов функции стрельбы стеком "BattleStack_Shoot". Дважды кликаем по этой надписи "BattleStack_Shoot" и декомпилируем код (F5)

Смотрим на заголовок функции:
void - тип возвращаемого результата функции: нас пока что не интересует
__thiscall - соглашение о вызове: нас пока не интересует
BattleStack_Shoot - название функции: и так понятно

(_BattleStack_ *shooter, _BattleStack_ *target): аргументы функции
Это структуры стеков в битве (BM:Z) стрелка и цели. Просто запомним это

Дальше включаем логику: мы ищем увеличение урона, значит нам необходимо найти участок кода с расчетом урона, либо функцию которая расчитывает наносимый урон, и которая вызывается в нашей функции стрельбы.

Исследуем код функции стрельбы:
1. Сначала видим расчет удачи, и ее шансы. Нас не интересует - идем дальше.
2. Дальше видим вызов функции отрисовки полёта снаряда "Battle_Stack_DrawShot_Bullet". Проходим мимо
3. Видим код декремента (вычитания единицы) боеприпасов у стрелка, и проверку на наличие артефакта №5 (повода боеприпасов). Интересно, но всё равно идем дальше
4. Далее пошёл первый if(Magog). Теперь вы знаете где сделана проверка на стрельбу по площади. Тут нужно быть осторожным в правках. ВОГ мог модифицировать код в данном участке. Вспоминаем есть ли приколы в воге, связанные с магогами? Вроде нет. Можно загрузить Ольку (Olly Debager) по данному адресу 0043F729 и помотреть на чужие хаки
Вроде всё чисто. Это было чисто для интереса, поэтому идем дальше. Ах нет! Тут мог вклиниться Тифон, если он включён! И я даже более чем уверен, что Тифон ставит сюда свою проверку. Но проверять уже не будем)

5. Листаем дальше, тут мы видим у Магов загрузку звука фаербола, загрузку дефа анимации и т.п. Листаем до следующего интересного места (хотя тут всё интересно, если честно).
6. Итак, находим проверку на Личей (стр.206)!
else if ( monType == LICH || monType == POWER_LICH )// Lich, Power Lich
Вспоминаем: в воге облаком Личей стреляет еще Драколич. Ради интереса проверяем в отладчике Ольке
И что мы тут видим? А код то разный: в Иде (exe SoD 3.2) и Олли (exe ERA аля TE)
Забегая далеко вперед скажу вам сразу, что если вы увидите адреса в пределах 0x701000-0x785000 при вызове функций - это установил хук наш родной Вог. Вот так выглядит эта нетривиальная проверка:
Так что при попытке подмене стрелка с облаком смерти по адресу 0043FA1F !!UN:C4454945/1/x; вы получите неожиданный вылет из игры. Вот здорово! Поэтому если не проверять изменяемые вами данные в отладчике, можно долго биться головой об стену.
Надеюсь я вас предупредил о такого рода неожиданностях.

7. Поехали дальше - пролистываем (и конечно же изучаем код действия стрельбы Лича) до следующего "else"
8. Нажмите TAB и обратите внимание, что в ASM коде мы переместились от проверки на Лича всего на несколько строк, а декомпилированном коде TAB (F5) мы пролистали порядка 20-30 строк. Такое бывает)) Привыкайте.
Если сбились с адреса, то это 0043FA38
Переходим опять в декомпилированный код и что мы видим:
Видим такую логику: если цель есть, считаем базовый урон, считаем урон по цели, наносим урон цели.
9. Нам нужно найти бонус Баллисты. Заходим сначала в первую функцию - расчет базового урона. Двойно клик по "Battle_Stack_CalcDamage". Изучаем её, и понимаем простую логику:
    - если на стрелке висит забывчивость, режем кол-во стрелков вдвое
    - если баллиста - урон умножаем на силу атаки героя. Это не наш случай. Идем дальше
    - проверки на заклинания Благословления и Проклятия (увеличиваем или режем величину урона)
    - генерирем силу урона в пределах от Min...Max
    - возвращаем силу урона
Итог: решения нашей задачи мы не нашли.

Нам нужно проверять следующую функцию. Жмем G и вводим адрес 0043FA3C (прыгаем туда, где были в начале п.8)
10. Делаем двойной клик по BattleStack_CalculateDamageToMonster и внутри этой функции стразу же видим функцию BattleStack_Calc_Damage_BonusesplyDoubleDamage. Название уже говорит о бонусах. Здорово. Нам сюда
11. Делаем двойной клик по функции насчета бонусов BattleStack_Calc_Damage_BonusesplyDoubleDamage. В ней есть проверка на дабблурон Черных рыцарей. Листаем дальше и находим проверку на баллисту (146) 004435B2
Изучаем детально код. Тут и кроется решение нашей задачи. Решений можно придумать 3-4 вида. Все они отличаются: можно подменить номер монстра, можно вырезать этот код вообще, поставив безусловный переход. Можно обнулить шансы бонусов балисты "BallistaDamageBonus 0063B810", можно изменить номер вторичного навыка, и сделать скажем зависимость от Магии Земли (да, давайте её еще сильнее усилимSm )
В общем достаточно большое поле для манёвров.

Итак, задачу мы решили.

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

(24.07.2020 11:29)Zur13 Wrote:  А эти адреса не изменяются при применении разного рода бинарных патчей или еще чего-либо? Насколько это решение надежно?

И еще вопрос, то фактически на чем я застрял при подходе с помощью исходников, как ИДА подключить к героям в режиме дебага? У меня при попытке выполнить Attach to process к героям ИДА падает вместе с героями. Хотелось с помощью точки останова посмотреть то место кода которое я нашел с помощью исходников ВоГ.
Конечно адреса могут меняться, если кто-то это намеренно сделает. Во второй части я показал один из таких примеров.

Я Иду ни разу не подключал к героям. Тут не подскажу. Только Олли.


game bug fixes extended.dll || My Plugins || My GitHub
(This post was last modified: 24.07.2020 12:09 by igrik.)
24.07.2020 12:08
Visit this user's website Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #32

(24.07.2020 03:26)Zur13 Wrote:  Вопрос знатокам, насколько плохо то что я сделал в третьей части и можно ли такое проворачивать?

Увы, с точки зрения программного кода это называется костылями. Так делать не надо (и учить плохому других наверное тоже).

Давайте будем разбираться.

Как найти более-менее правильно причину ошибки?

1. Смотрим содержимое EIP в логе ошибки. По примеру - 4B4BAA.
2. Открываем базу IDA и переходим по этому адресу. Видим это:

mov ecx, [eax+1Ch]

3. Смотрим лог дальше. Он нам говорит следующее:

read of address: 0x0000001C

4. Анализируем. Игра что-то пытается прочитать по адресу 1С, чего не должно быть (т.к. данные ниже адреса 400000 к коду игры никакого отношения не имеют). Смотрим причину - в eax почему-то записан ноль. Хорошо, смотрим строчку выше:

mov eax, [esi+170h]

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

5. Анализируем далее. По идее тут надо бы идти к источнику esi, но это очень долго (т.к. адрес, который в него записан, может передаваться через сотню функций, без опыта пока что туда лучше не лезть). Попробуем побыстрее. Смотрим функции, для которых что-то считывается из esi. Так, это различные операции с отрядами на поле боя. Может тогда комбатменеджер? Нет, он в нашей функции получается отдельно. Может структура стека??? Хорошо, открываем структуру и сравниваем адресацию.

Выше в функции можно найти следующие строчки:

mov eax, [esi+38h]
mov dword ptr [esi+3Ch], 2
mov dword ptr [esi+40h], 0
mov eax, [esi+44h]

В структуре это:

Позиция dd ?; 38
def_group_ix dd ?; 3C - animation
def_frame_ix dd ?; 40 - animationFrame
Mon2SqDirectionForDWCr dd ?; 44 - secondHexOrientation

Смотрим названия функций, для которых эти данные используются. Думаю логично. Скорее всего esi - и есть структура стека.

Так мы разобрали небольшой участок кода, приступим к исправлению ошибки.

6. Смотрим опять то, с чего начали, но уже с комментариями:

mov eax, [esi+170h] - по структуре - получение Загруженный_звук_перемещения
mov ecx, [eax+1Ch] - тут нужна структура загруженного звука (или что-то вроде того), но у нас её нет, ну и ладно, не страшно.

7. Собственно, чтобы игра не падала, можно:
а) записать в структуру какую-нибудь загруженную озвучку, например скопировать туда адрес звука выстрела/урона/защиты/смерти, что короче подойдёт (если не будет резать слух) - выполнимо и ERM-ом в триггере перед экраном битвы (когда все звуки загружены).
б) ставить перехват кода на это место, проверять 0 в eax, если там ноль, то записывать в ecx ноль (т.е. чтобы функция остановки звука не останавливала звук, которого нет, т.к. там простая проверка на 0 по аргументу, который идёт на функцию) - бинарным патчем или уже dll.
в) грузить всю озвучку для боевой машины - так же искать место в коде, отвечающую за это дело, конкретно в месте проверки на боевые машины (там либо флаг боевой машины, либо номера монстров, в ощем тут опять применить навыки поиска адресов от Игрика). Ну и не забыть добавить саму озвучку в архивы с игрой (если её там нет).

(24.07.2020 10:19)igrik Wrote:  напомни - в чем проблема у тебя поставить Win 7? В слабом ПК?

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

(24.07.2020 10:19)igrik Wrote:  А XP не потащит?

На XP IDA 7 так же не работает (у меня не вышло заставить её работать).

(24.07.2020 10:19)igrik Wrote:  Просто использование вогобазы в текстовом режиме то еще извращение.

У меня вог-база сохранена в IDA 6.1 (пересохранял с версии 5.5).
24.07.2020 12:45
Find all posts by this user Quote this message in a reply
Zur13 Offline

Posts: 223
Post: #33

(24.07.2020 12:45)XEPOMAHT Wrote:  
(24.07.2020 03:26)Zur13 Wrote:  Вопрос знатокам, насколько плохо то что я сделал в третьей части и можно ли такое проворачивать?

Увы, с точки зрения программного кода это называется костылями. Так делать не надо (и учить плохому других наверное тоже).

Да, что это костыль понятно, я про озвучку написал в конце второй части туториала, третья часть показывает как можно поменять на лету код, она же была написана до второй части туториала от igrik, а он лучше описал возможные проблемы с таким подходом, тут уж опыт играет роль. Я наверное чуть больше добавлю описания вначале второй части чтобы было понятнее что есть и другие подходы для решения проблемы.

Не критика, я просто прочитал описанный способ поиска проблемы без использования псевдокода, и это для меня оказалось сложным, при том что я в этом месте довольно много провел времени в ИДА, думаю для человека совсем без опыта боюсь это окажется совершенно непонятно 105

Правка: попытаюсь чуть подробнее описать места, которые для меня показались сложными

1. "Теперь осталось узнать, что такое esi. Вспоминаем, что в esi обычно сишный компилятор записывает данные для длительного хранения.", я с сишным компилятором не работал на уровне ассемблерного кода, потому для меня это неочевидно, к примеру если я буду разбиратть другой участок кода и окажется что сишный компилятор использует для длительного хранения не только esi, ну или еще есть какие-то штуки которые стоит знать о сишном компиляторе для успешного анализа ассемблерного кода? Может стоит привести какую-то ссылку где можно больше про это почитать?

2. "В структуре это:", тут я не совсем понял как можно перейти к структуре из приведеного участка кода, куда нужно смотреть или нажимать?
(This post was last modified: 24.07.2020 14:17 by Zur13.)
24.07.2020 13:32
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #34

(24.07.2020 13:32)Zur13 Wrote:  я просто прочитал описанный способ поиска проблемы без использования псевдокода, и это для меня оказалось сложным, при том что я в этом месте довольно много провел времени в ИДА, думаю для человека совсем без опыта боюсь это окажется совершенно непонятно.

Опыт приходит со временем. Например у меня по-другому: не могу прочитать псевдокод, он мне просто не понятен (мозг уже подсажен на Ассемблер, а кучи Си-шных символов заводят меня в тупик), поэтому работаю только с чистым диассемблированным кодом. Да и самой IDA я пользуюсь только когда нужно посмотреть код в именованном виде, а не в совсем сыром. Все работы - только в Ollydbg (то же добавление новых городов было сделано чисто через Ollydbg+исходники WoG 3.59, без использования IDA).


(24.07.2020 13:32)Zur13 Wrote:  Может стоит привести какую-то ссылку где можно больше про это почитать?

Если кратко, то eax, ecx - "горячие" регистры, которые компилятор в коде пытается перезаписывать в первую очередь (т.е. долго в них ничего не хранится, а если стоит вызов функции, то после него там уже в 99% случаев или мусор, или данные, возвращаемые функцией).
Ну а ebx, edi, esi - для более длительного хранения, обычно компилятор после вызова функции сохраняет их в стеке (если нужно) и восстанавливает после выполнения функции в её самом конце.

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

(24.07.2020 13:32)Zur13 Wrote:  тут я не совсем понял как можно перейти к структуре из приведеного участка кода, куда нужно смотреть или нажимать?

Никуда не нажимать, тут чисто ручная работа (да простят меня лентяи). Блокнотом открываем структуру и сравниваем её со значениями из кода.
(This post was last modified: 24.07.2020 15:47 by XEPOMAHT.)
24.07.2020 15:08
Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #35

(24.07.2020 13:32)Zur13 Wrote:  Правка: попытаюсь чуть подробнее описать места, которые для меня показались сложными

1. "Теперь осталось узнать, что такое esi. Вспоминаем, что в esi обычно сишный компилятор записывает данные для длительного хранения.", я с сишным компилятором не работал на уровне ассемблерного кода, потому для меня это неочевидно, к примеру если я буду разбиратть другой участок кода и окажется что сишный компилятор использует для длительного хранения не только esi, ну или еще есть какие-то штуки которые стоит знать о сишном компиляторе для успешного анализа ассемблерного кода? Может стоит привести какую-то ссылку где можно больше про это почитать?

2. "В структуре это:", тут я не совсем понял как можно перейти к структуре из приведеного участка кода, куда нужно смотреть или нажимать?
1. Не нужно настолько глубоко анализировать ассамблерный код, если ты его плохо знаешь. Я его анализирую только в редких случаях - если я не могу до конца понять всевдокод. Но псевдокод намного более читабелен. Используй его.

2. Смотри. Ты просто наводишь мышь на непонятное тебе выражение. В данном случае мы говорим о "Mon". Тебе подсвечивается выражение так
Нажимаешь на "Mon" ПКМ->jump to local type...
Тебя перекидывает на очередное окно, говоря что это.
Даблклик, и мы понимаем, что это структура монстра _BattleStack_*. Потому ты будешь это понимать сходу, но нужен небольшой опыт.
Лучше всего структуры, да и вообще многие места описаны в H3API от RoseKavalier. Это действительно самое богатое API для HoMM3, из которых я видел вживую. Правда у него идут уже свои названия H3CombatMonster = _BattleStack_*.

PS: например вот только что я увидел из заголовочников RoseKavalier, что поле shooter->field_70 это shooter->isLucky


game bug fixes extended.dll || My Plugins || My GitHub
24.07.2020 15:38
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #36

Zur13, при вылете я обычно делаю так:
Открываю: Debug\Era\exception context.txt

Здесь тоже виден адрес вылета, регистры, стэк. Но именование функций лучше, чем в HD-логе, поскольку используются отладочные карты символов из папки DebugMaps. Для Эры это часто указание файлов и строк в исходниках (иногда ошибается, указав огромное смещение от функции):
Само исключение описывается в виде понятной текстовой ошибки. Для каждого 4-байтового значения даётся помимо шестнадцатеричного представления ещё десятеричное (int: xxx) и значение, которое лежит по адресу, если использовать текущее число как адрес другого числа или строки (pint: xxx, str: "...."). Таким образом видны строки перед вылетом и потенциальные указатели.

Далее стоит открывать Debug\Era\erm tracking.erm и посмотреть последние выполненные ЕРМ-события и команды, где видны имена файлов и строки.
Наконец, если подозреваем, что дело в некорректном значении переменных, можно заглянуть в erm memory dump.txt, где будет всё, от строк и до именованных глобальных переменных.

И здесь можно глянуть, что за моды и патчи использовались при вылете:
mod list.txt
patch list.txt
pe modules.txt


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

Posts: 2819
Post: #37

Находим элементы диалогов.

Так тут всё чуточку сложнее. Для начала нужно знать о некоторых факторах.
1. У нас есть прекрасный HD мод, основная цель и задача которого как раз таки и заключается в работе с диалоговыми окнами для изменения разрешения игры. Чаще всего HD мод просто изменяет координаты расположения диалога, для того чтобы последнее распологалось в центре экрана при разрешениях отличных от 800x600. Но есть и исключения: яркий пример окно встречи героев при включенном твике <UI.Ext.SwapMgr> {0,1,2} = 1 или 2.
2. Есть плагин wog native dialogs, который тоже не имеется в вогобазе. Да и стандартные воговские диалоговые окна, такие как ВогОпции, Диалог Командира, Опыта армий, сброса артефактов на землю и т.п. вы разобрать не сможете, да и ERMу они впринципе неподвластны.

Это означает, что мы можем что-то найти и изменить только в диалогах SOD (которые есть в ERA). Сразу же отсюда отметаем диалоги, которые работают до старта ERM (до начала загрузки карты), такие как: выбор сценария, кампании, настройка случайной карты, рекроды, загрузить игру и т.п.

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

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


1. Открываем ИДУ
2. Нажимаем G и вбиваем адрес функции 0041AFA0 DlgLvl1_Ctor
3. Перепрыгиваем на неё и переходим в ASM код в строку заголовка функции
4. Нажимаем CRTL+X и видим, как ИДА указала нам все места вызова этой функции. И мы видим множество диалогов.
Всё читаемо? Это результат тонны часов людей, которые разбирали эту базу.
Лет десять ранее это бы выглядело вот так
Ни черта не понятно, не правда ли?))

Во всех этих функциях ищем что-то похожее на название диалога героя.
Нашли Dlg_HeroInfo_Create (у вас она называется скорее всего под другому, потому что я потихоньку всё же пилю её). Нажимаем ОК. Нас перекидывает на адрес 004DE9B3. Нажимаем F5 и видим длиннющую функцию создания диалога.

Теперь нужно узнать айдишники (id) дефов морали и удачи героев. Открываем справку ERM-> триггер CM-> подкоманда I -> условно обозначеное "место" -> кликаем в "место" -> ищем "Области в окне героя" -> тут и ищем айдишники морали и удачи. Нашли: id 116 и 117.

Переходим в ИДУ, нажимем ALT+T, вводим значение 116, ОК.
Нас перебросило на переменную v116. Так ида объявила переменную, но это совершенно не то. Жмем далее (Ctrl+T), и так 3 раза. Нас перекинуло куда-то дальше. Смотрим детально куда:
и видим место создания какого-то дефа.
Сравниваем название: DlgDef_BuildAndLoadDef(v231, 182, 184, 44, 44, 116, aImrlb_def, 0, 0, 0, 0, 16);
Здорово, мы нашли то что скали.
Заходим в лод в дате, ищем этот файл (деф), вытаскиваем его, и определяем его размеры: 44х44. Отлично, зная размеры мы можем их найти тут.
DlgDef_BuildAndLoadDef(v231, 182, 184, 44, 44, 116, aImrlb_def, 0, 0, 0, 0, 16);
Значит перед ними, возможно, идут координаты установки дефа. (... Это схема простая ...)
Ставим курсор в "182" и нажимаем Tab, в асм коде мы видим "push 182" (или push B6h) и видим рядом адрес 004E0D01. Первый адрес нашли. Теперь будем проверять)

В этот раз, чисто для практики используем Olly.
Для начала нужно сделать так, чтобы игра у вас не запускалась в полноэкранном режиме!! Это очень важно. Олька часто останавливается сама при запуске игры, и вы хорошенько за***тесь, прежде чем запустите игру.
Поэтому пользуемся HD модом, и желательно в 32 битном режиме с разрешением 1180х664. Настроили. Запускаем игру и жмем F4. Игра перешла в оконный режим. Отлично. Это нам и нужно. Закрываем игру.

Далее. Запускаем Ольку, указываем ей путь до исполняемого файла "h3era HD.exe" и ждём. Первая прогрузка будет долгая (Оля там чё-то обрабатывает и создает дампы). В следующие разы будет быстрее. Внимательно смотрим на нижний правый угол: только начал загружаться Вог, и Олька сходу остановилась сама.
Жмём F9 и не паримся. Если еще будут такие же остановки, жмем F9 столько раз, сколько это нужно.
Это можно загнать в исключения, но я за 3-4 года пользования ей так и не сделал этого. Пофиг.

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

Опять переходим в Ольку, копируем адрес 004E0D01, нажимаем Ctrl+G (бесит, когда работаешь одновременно с Идой), вставляем адрес, ОК, и нас перекинуло в нужное место.
Теперь смотрим внимательно! и видим
Code:
004E0D01  68 B6000000   PUSH 0B6
Тут важно число B6000000 (182 в десятичной). По нему, мы можем определить, что число четырехбайтовое, а значит мы может запихнуть в него огроменное число. Намного сложнее работать с однобайтовыми числами. Много туда не влезает. И это порою бывает очень удручающе... Ну да ладно

На адресе 004E0D01 нажимем "пробел", вылезло окно редактора кода на ASMе. Теперь будем править координату Х иконки морали, для этого придумыаем число, например 405, но в Олю можно вводить только шестнадцатериные числа. Не проблема, переводить их мы уже умеем). Открываем калькулятор, и получем число 405 = 195(h). Вставляем это число, нажимаем ОК и открываем окно героя. Смотрим что получилось
Круто!
Поехали проводить ту же процедуру и с координатой Y, она в коде находится на одну строку выше 004E0CFC.
Ремарка, нужно обязательно поставить галочку "Fill rest with NOPs", иначе вы сломаете код (и начнете процедуру заново в Ольке), потому что Оля захочет записать это число как однобайтовое, и запишет его, а "хвост" останется и получится какая-то лапша, которая обязательно вылетит к чертовой матери. Ставьте галку)
Впихиваем координату 43 (PUSH 2B). Проверяем: мы повесили мораль на плечо герою

Ту же самую процедуру делаем и с Удачей (надеюсь вы справитесь сами).
Должно получиться вот так:

Адаптируем код на ERM, но тут не обязательно париться с NOPами

Image: index.png


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

Posts: 4343
Post: #38

igrik, спасибо огромное за гайд! Его бы и за пределы форума распространить, поскольку далеко не все программисты сидят здесь.105


Image: widget.png?style=banner2

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

Posts: 118
Post: #39

I've used igrik's method quite a bit for discovering dialog items... easy documentation could be generated with a plugin by hooking dialog creation methods
e.g. Main menu dialog:
Code:
address  x   y   id  name
0x4fba62 540  10 101 mmenung.def
0x4fbacb 532 132 102 mmenulg.def
0x4fbb34 524 251 103 mmenuhs.def
0x4fbb9d 557 359 104 mmenucr.def
0x4fbc06 586 469 105 mmenuqt.def
Of course there would be some manual work needed afterwards to categorize and document.
25.07.2020 04:10
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #40

RoseKavalier, nice! There weren't any numbers of theirs sizes near x/y positions?


Image: widget.png?style=banner2

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

Posts: 118
Post: #41

Well yes, but is it useful when you have everything else?

How about something like this?
Image: 4nnoXOy.png
(This post was last modified: 25.07.2020 19:35 by RoseKavalier.)
25.07.2020 17:45
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #42

RoseKavalier, for this buttun it is, cause it answers for mouse click position and def cadre changing


Image: widget.png?style=banner2

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

Posts: 792
Post: #43

daemon_n, если я не ошибаюсь, позиции и размеры кнопок главного меню одинаковые в WoG и в Complete, если нужны адреса, то они у меня есть, могу предоставить, мне только нужно привести это всё в читаемый вид, чтобы выложить.
(This post was last modified: 26.07.2020 00:12 by wessonsm.)
26.07.2020 00:10
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4343
Post: #44

wessonsm, но еще есть сод, и разные языки, и разные позиции, и разные размерыYes, и credit.smk, и credit.bik


Image: widget.png?style=banner2

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

Posts: 792
Post: #45

В базе IDA такой код:
Code:
text:00567DDE                     lea     ecx, [ebx-0B4h];

   
Я уверен, что здесь -0B4h это смещение координаты дефа, которое я хочу изменить, то есть lea здесь выполняет арифметическую операцию.
Я хочу сделать бинарный патч, который меняет это смещение.
Но в 16-ричном виде команда имеет вид 8D 8B 4C FF FF FF, здесь нет и намека на нужное мне значение 0B4.
Как быть? Как изменить команду к примеру скажем на lea ecx, [ebx-0A4h] бинарником?
11.02.2022 06:09
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