Объявления

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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 06 авг 2023, 09:34

Ну не игнорирует же компилятор соглашения. MinGW - это же не поделка какая-то, хорошая репутация у компилятора есть. Заменил __fastcall на неправильный в данном случае __thiscall и окошко уже поехало (строку взяли из ecx, __fastcall следующий аргумент из edx взял, а __thiscall - сразу из стека, поэтому окно и не по центру оказалось), так что работают соглашения.
Вернуться к началу

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

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

Сообщение void_17 » 06 авг 2023, 11:58

Отлично, значит я спокойно могу использовать адекватный компилятор(GCC) и code::blocks :smile1:

GCC на голову выше MSVC, к тому же здесь грамотно реализована libc. А установка пакетов с MSYS2+Pacman это буквально пара кликов. :smile2:
Надо будет это все в helpme описать
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 13 авг 2023, 13:31

Такой вопрос. Ниже приведён фрагмент декомпилированного кода, где this - это searchArray*, cell - searchPoint cell[72][72], sizeof(searchPoint) == 9.

Код: Выделить всё
curSearchPoint = *(searchPoint *)((char *)&this->cell[0][64 * X + 8 * X] + 8 * Y + Y);

После элементарных преобразований получаем:
Код: Выделить всё
curSearchPoint = *(searchPoint *)((char *)&this->cell[0][72 * X] + 9 * Y); => curSearchPoint = *(searchPoint *)((char *)&this->cell[0][72 * X] + sizeof(searchPoint) * Y); =>
=> curSearchPoint = *(searchPoint *)((char *)&this->cell[X][Y]); => curSearchPoint = *(searchPoint *)&this->cell[X][Y];

Известны ли способы заставить IDA понимать, что 64 * X + 8 * X = 72 * X? Не первый раз такое встречаю и ничего поделать не могу. Ведь нечитабельно. Понятное дело, что такой ассемблер, и два умножения посчитаны отдельно, но может быть, можно как-то подсказать IDA, что мы имеем дело с индексами двумерного массива?

Или вот пример попроще, но суть та же:
Код: Выделить всё
curSearchPoint = *(this->path + 8 * iSearchPointsNum + iSearchPointsNum);

Путь - это массив searchPoint path[1024]; Как строку выше преобразовать в то, чем она является?

Код: Выделить всё
curSearchPoint = *(this->path + 8 * iSearchPointsNum + iSearchPointsNum); => curSearchPoint = *(this->path + 9 * iSearchPointsNum); =>
=> curSearchPoint = *(this->path + sizeof(searchPoint) * iSearchPointsNum); =>  curSearchPoint = this->path[iSearchPointsNum];
Вернуться к началу

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

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

Сообщение void_17 » 13 авг 2023, 14:15

Ну это нечитаемо конечно, но понять-то можно что происходит. Я ничего не могу с этим сделать, к сожалению.
Последний раз редактировалось void_17 13 авг 2023, 14:17, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 13 авг 2023, 14:17

Это Герои 1. Неужели нет способа подсказать IDA, что 8 + 1 = 9? Тогда, я думаю, и индексы бы подхватились. А сейчас она не понимает, что 8 + 1 - это размер.
Вернуться к началу

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

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

Сообщение void_17 » 13 авг 2023, 14:19

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

Есть еще плагины IDA Ghidra Decompiler, retdec decompiler for IDA.
Вернуться к началу

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

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

Сообщение void_17 » 13 авг 2023, 14:20

С IDAвским декомпилятором можно попробовать поменять тип переменной(клавиша Y) в декомпляте на тот же самый и иногда это срабатывает. Либо поменять на void* или на int*, вообщем поиграться с типами, магическим образом все начинает нормально отображаться. Еще это зависит от версии IDA, я использую только 7.7... Вообщем это плохо когда имеем дело с проприетарным ПО, нельзя просто пофиксить баг. :smile5:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 13 авг 2023, 14:47

Вот из-за такого ассемблера IDA путается:

Код: Выделить всё
lea     edx, [ebp+eax*8+0]
lea     eax, [eax+edx+14h]

Первая строчка: edx = ebp + eax * 8. Подставляем во вторую: eax = eax + edx + 20 = eax + (ebp + eax * 8) + 20 = ebp + 8 * eax + eax + 20. И вот эту сумму она в 9 * eax никак не хочет преобразовывать.
Вернуться к началу

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

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

Сообщение void_17 » 10 сен 2023, 12:11

Если что я вернулся к API. По-тихоньку учусь писать плагины для IDA. Хочу автоматизировать написание API, это будет круто.
Сейчас надо сделать настраиваемый дамп информации о типах в базе данных. (По аналогии с Create C Header File.. но лучше)
Пока что сделал чтобы выводил список всех типов БД в output window, потом допилю и возможно прикручу GUI-шку и запилю свои плагины на гитхаб. :smile2:

 
Код: Выделить всё
// type information dumper by void_17
// version 0.1, september 10th 2023.

#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>
#include <kernwin.hpp>
#include <typeinf.hpp>

// Plugin struct
//--------------------------------------------------------------------------
struct plugin_ctx_t : public plugmod_t
{
    virtual bool idaapi run(size_t) override;
};

//--------------------------------------------------------------------------
bool idaapi plugin_ctx_t::run(size_t)
{
    info("Dumping type names... Look in the output window.");
    const til_t* idati = get_idati(); // get the database's type information library
    const int num_types = get_ordinal_qty(idati);
    qstring curr_name{};
    tinfo_t tif{};
    msg("List of types: \n");
    for ( uint32_t i = 1; i < num_types; ++i )
    {
        tif.get_numbered_type(idati, i);
        tif.get_type_name(&curr_name);
        assert(!curr_name.empty());
        msg("%s; \n", curr_name.c_str());
    }
    return true;
}

//--------------------------------------------------------------------------
static plugmod_t* idaapi init()
{
    return new plugin_ctx_t;
}

//--------------------------------------------------------------------------
plugin_t PLUGIN =
{
  IDP_INTERFACE_VERSION,
  PLUGIN_UNL            // Unload the plugin immediately after calling 'run'
  | PLUGIN_MULTI,       // The plugin can work with multiple idbs in parallel
  init,                 // initialize
  nullptr,
  nullptr,
  nullptr,              // long comment about the plugin
  nullptr,              // multiline help about the plugin
  "TIDv17",             // the preferred short name of the plugin
  nullptr,              // the preferred hotkey to run the plugin
};
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 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)
Поблагодарили: 2162 раз.

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

Сообщение AlexSpl » 22 окт 2023, 14:19

Появился такой вопрос. В С++98 же не было __int64? И long long, как я почитал, не было (если верить). Писались ли Герои с каким-то расширением языка? В дампе T_QUAD(013) просто, и это 64 бита.
Вернуться к началу

Пред.След.

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

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

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