24.07.2020, 12:08
Продолжим...
Нам необходимо решить вторую часть вопроса: убрать доп.урон у баллисты шансами 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)
И что мы тут видим? А код то разный: в Иде (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", можно изменить номер вторичного навыка, и сделать скажем зависимость от Магии Земли (да, давайте её еще сильнее усилим
Изучаем детально код. Тут и кроется решение нашей задачи. Решений можно придумать 3-4 вида. Все они отличаются: можно подменить номер монстра, можно вырезать этот код вообще, поставив безусловный переход. Можно обнулить шансы бонусов балисты "BallistaDamageBonus 0063B810", можно изменить номер вторичного навыка, и сделать скажем зависимость от Магии Земли (да, давайте её еще сильнее усилим )
 )
В общем достаточно большое поле для манёвров.
Итак, задачу мы решили.
В следующий раз возьмёмся на нахождение адресов элементов диалогов, что на порядок сложнее нашей текущей задачи.
Я Иду ни разу не подключал к героям. Тут не подскажу. Только Олли.
Нам необходимо решить вторую часть вопроса: убрать доп.урон у баллисты шансами 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 и помотреть на чужие хаки
Spoiler (Click to View)

5. Листаем дальше, тут мы видим у Магов загрузку звука фаербола, загрузку дефа анимации и т.п. Листаем до следующего интересного места (хотя тут всё интересно, если честно).
6. Итак, находим проверку на Личей (стр.206)!
else if ( monType == LICH || monType == POWER_LICH )// Lich, Power Lich
Вспоминаем: в воге облаком Личей стреляет еще Драколич. Ради интереса проверяем в отладчике Ольке
Spoiler (Click to View)

Забегая далеко вперед скажу вам сразу, что если вы увидите адреса в пределах 0x701000-0x785000 при вызове функций - это установил хук наш родной Вог. Вот так выглядит эта нетривиальная проверка:
Code:
0x767B9F signed int __usercall DracolichShoot(int creatureID)
{
  signed int result; // eax
  if ( creatureID == 64 || creatureID == 65 || creatureID == 196 )
    result = 65; // возвращаем Могущественного Лича
  else
    result = 0;
  return result;
}Надеюсь я вас предупредил о такого рода неожиданностях.
7. Поехали дальше - пролистываем (и конечно же изучаем код действия стрельбы Лича) до следующего "else"
8. Нажмите TAB и обратите внимание, что в ASM коде мы переместились от проверки на Лича всего на несколько строк, а декомпилированном коде TAB (F5) мы пролистали порядка 20-30 строк. Такое бывает)) Привыкайте.
Если сбились с адреса, то это 0043FA38
Переходим опять в декомпилированный код и что мы видим:
Spoiler (Click to View)

9. Нам нужно найти бонус Баллисты. Заходим сначала в первую функцию - расчет базового урона. Двойно клик по "Battle_Stack_CalcDamage". Изучаем её, и понимаем простую логику:
- если на стрелке висит забывчивость, режем кол-во стрелков вдвое
- если баллиста - урон умножаем на силу атаки героя. Это не наш случай. Идем дальше
- проверки на заклинания Благословления и Проклятия (увеличиваем или режем величину урона)
- генерирем силу урона в пределах от Min...Max
- возвращаем силу урона
Итог: решения нашей задачи мы не нашли.
Нам нужно проверять следующую функцию. Жмем G и вводим адрес 0043FA3C (прыгаем туда, где были в начале п.8)
10. Делаем двойной клик по BattleStack_CalculateDamageToMonster и внутри этой функции стразу же видим функцию BattleStack_Calc_Damage_BonusesplyDoubleDamage. Название уже говорит о бонусах. Здорово. Нам сюда
11. Делаем двойной клик по функции насчета бонусов BattleStack_Calc_Damage_BonusesplyDoubleDamage. В ней есть проверка на дабблурон Черных рыцарей. Листаем дальше и находим проверку на баллисту (146) 004435B2
Spoiler (Click to View)

 )
 )В общем достаточно большое поле для манёвров.
Итак, задачу мы решили.
В следующий раз возьмёмся на нахождение адресов элементов диалогов, что на порядок сложнее нашей текущей задачи.
(24.07.2020 11:29)Zur13 Wrote: [ -> ]А эти адреса не изменяются при применении разного рода бинарных патчей или еще чего-либо? Насколько это решение надежно?Конечно адреса могут меняться, если кто-то это намеренно сделает. Во второй части я показал один из таких примеров.
И еще вопрос, то фактически на чем я застрял при подходе с помощью исходников, как ИДА подключить к героям в режиме дебага? У меня при попытке выполнить Attach to process к героям ИДА падает вместе с героями. Хотелось с помощью точки останова посмотреть то место кода которое я нашел с помощью исходников ВоГ.
Я Иду ни разу не подключал к героям. Тут не подскажу. Только Олли.













 , и credit.smk, и credit.bik
, и credit.smk, и credit.bik