Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

База данных IDA от void17

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 ноя 2021, 10:46

Офигеть! Работает. IDA, конечно, уже не узнаёт ftol(), но всё отлично декомпилируется. Сейчас только структуры для get_disease_value() пропишу, чтобы видели разницу.

Какая красота!

Код: Выделить всё
int __thiscall type_AI_spellcaster::get_disease_value(
        type_AI_spellcaster *this,
        const army *army,
        type_enchant_data data)
{
  int result; // eax
  int totalCombatValue; // eax
  double spellCastWorkChance; // st7
  int result_1; // [esp+18h] [ebp+8h]
  float result_2; // [esp+18h] [ebp+8h]

  if ( ((1 << army->sideIndex) & this->shootingThreats) == 0 )
    return 0;
  if ( this->combatParams.isOpponentDangerous )
    return 0;
  totalCombatValue = (army::get_total_combat_value)(this->combatParams.heroAttack, this->combatParams.heroDefense);
  result = ftol((totalCombatValue - totalCombatValue * 0.9) * data.spellDuration);
  result_1 = result;
  if ( data.a1 )
  {
    spellCastWorkChance = combatManager::SpellCastWorkChance(
                            combatManager,
                            SPL_WEAKNESS,
                            this->side[AI_CASTER],
                            army,
                            0,
                            1,
                            this->isCreatureCast);
    result_2 = result_1;
    return ftol(spellCastWorkChance * result_2);
  }
  return result;
}

Никаких LODWORD() и __int64 :smile20: А смысл тот же, и округление сразу видно! Только одна беда-печаль: нужно все структуры переносить из старой базы.

Просто сравните с этим монстрокодом:

Код: Выделить всё
int __thiscall type_AI_spellcaster::get_disease_value(
        type_AI_spellcaster *this,
        const army *army,
        type_enchant_data data)
{
  __int64 v5; // rax
  int total_combat_value; // eax
  float stack; // [esp+18h] [ebp+8h]

  if ( ((1 << army->sideIndex) & this->shootingThreats) != 0 )
  {
    if ( this->combatParams.isOpponentDangerous )
    {
      LODWORD(v5) = 0;
    }
    else
    {
      total_combat_value = army::get_total_combat_value(
                             army,
                             this->combatParams.heroAttack,
                             this->combatParams.heroDefense);
      v5 = ((total_combat_value - total_combat_value * 0.9) * data.spellDuration);
      if ( data.a1 )
      {
        stack = v5;
        return (combatManager::SpellCastWorkChance(
                  gpCombatManager,
                  SPL_WEAKNESS,
                  this->side[AI_CASTER],
                  army,
                  0,
                  1,
                  this->isCreatureCast)
              * stack);
      }
    }
  }
  else
  {
    LODWORD(v5) = 0;
  }
  return v5;
}

Никаких больше __int64 при округлении. Я перенёс только основные структуры, а уже заметно, как преобразился код.

Чем ещё хорош мой хак? Тем, что тут можно ftol() смело заменять на (int)() и код будет компилироваться.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 ноя 2021, 11:41

Короче восстановил я эти два шаблона. Залью в группу вк и сюда.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 ноя 2021, 11:43

Вот хак ftol(), если будете пробовать тоже:

Код: Выделить всё
; int __usercall ftol@<eax>(double@<st0>)
ftol proc near

var_C= dword ptr -0Ch
var_4= word ptr -4
var_2= word ptr -2

push    ebp
mov     ebp, esp
add     esp, 0FFFFFFF4h
fstcw   [ebp+var_2]
wait
mov     ax, [ebp+var_2]
or      ah, 0Ch
mov     [ebp+var_4], ax
fldcw   [ebp+var_4]
fistp   [ebp+var_C]
fldcw   [ebp+var_2]
mov     eax, [ebp+var_C]
nop
nop
nop
leave
retn
ftol endp

Машинный код fistp [ebp+var_C] - DB 5D F4.

Проверил, игра тоже работает.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 ноя 2021, 11:55

Я не помню, чтобы раньше ftol видел когда-нибудь в C++ листинге. Это же автоматически генерируемая функция, если я не ошибаюсь.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 ноя 2021, 11:59

Цитата:
Я не помню, чтобы раньше ftol видел когда-нибудь в C++ листинге. Это же автоматически генерируемая функция, если я не ошибаюсь.

Её можно вызвать явно, но я не в курсе, в каком она хедере:

Код: Выделить всё
while( iWidth-- )
{
   pDestination[0] = iClamp( ftol( i_pSource[2] * 255.0f ), 0, 255 ); // b
   pDestination[1] = iClamp( ftol( i_pSource[1] * 255.0f ), 0, 255 ); // g
   pDestination[2] = iClamp( ftol( i_pSource[0] * 255.0f ), 0, 255 ); // r

   i_pSource += i_iFloats;
   pDestination += iDestBytes;
}

Заменил на другой пример. Там какая-то с двумя аргументами была.

Посмотрел другие функции. LODWORD() пропали как класс :smile11: Остались только там, где часть переменной double используется под int, например. Но это не исправишь. Так делает компилятор.
Последний раз редактировалось AlexSpl 28 ноя 2021, 12:08, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 ноя 2021, 12:06

Александр, когда обновите базу на сервере? Очень хочу поработать :smile11:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 ноя 2021, 12:18

Будем старую продолжать? В новой код понятнее и она ближе к оригинальному коду. Только, естественно, встаёт вопрос: кому переносить структуры в новую базу. Плюс ручные правки пропадут. Но я считаю, того стоит. Уж больно причёсанный код получается для функций, работающих с плавающей точкой.

Интересно, в некоторых случаях IDA всё равно приводит к __int64, но здесь уже точно не имеет права. Видимо, работает шаблонный анализ. Например:

Код: Выделить всё
mov     [ebp+arg_4], edi
fild    [ebp+arg_4]
fstp    [ebp+var_8]
fld     [ebp+var_8]
fdiv    [ebp+X]
call    ftol

Превращается в
Код: Выделить всё
v15 = (__int64)((double)v7 / X);

Но :!: v15 объявлена как int v15, а приведение идёт к типу __int64! Похоже, IDA не совсем готова работать с нестандартным ftol(). Кое-где заменяет корректно, а кое-где остаются вот такие косяки.
Последний раз редактировалось AlexSpl 28 ноя 2021, 12:43, всего редактировалось 2 раз(а).
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 ноя 2021, 12:32

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

Если честно, я не совсем понял о чем вы, поясните. Особо не вникал в ваши сообщения с ftol, т.к. сейчас другим занимался
Последний раз редактировалось void_17 28 ноя 2021, 13:00, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 ноя 2021, 12:58

Вот разве так можно?

Код: Выделить всё
int __thiscall sub_438410(int this, int stack, int a3, int a4, double X)

Код: Выделить всё
return (__int64)((sqrt(X) - 1.0) * total_combat_value * v14);

Но ftol возвратила только eax.

Так. Творится чертовщина. Теперь и в get_disease_value() тоже приведение к __int64!
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 ноя 2021, 13:04

Александр,
Цитата:
Я всмысле прямо сейчас вы работаете над моей базой. Она основана на воговской старой. Больно муторно будет создать новую содовскую с чистого листа и из моей переносить. Давайте продолжать на старой работать. Обновите сейчас на сервере, пожалуйста, я хочу на следующей неделе сигнатурами заняться..

Если честно, я не совсем понял о чем вы, поясните. Особо не вникал в ваши сообщения с ftol, т.к. сейчас другим занимался
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron