Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 18.01.2018
Сообщений: 86
1

Расширение массива

31.10.2018, 02:28. Показов 885. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи , уважаемые форумчане.
Пожалуйста строго не кусайте, я пришёл к вам с вот таким вопросом, надеюсь, что кто нибудь мне поможет объяснить как можно это сделать :

Я пишу dll библиотеку для перехвата функций одной игры, всё вроде бы шло хорошо, но как столкнулся с мыслью расширить массив хранения, так называемых ХП( жизней) в игре и начались проблемы.

Сам хидер именно для этой функции имеет такую структуру :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#pragma pack(push,1)
struct _base_download_result_zocl
{
    struct _list_equip
    {
        char sTableCode;
        unsigned __int16 wItemIndex;
        unsigned int dwUptInfo;
        char byCsMethod;
        unsigned int dwT;
    };
    struct _list_embellish
    {
        char sTableCode;
        unsigned __int16 wItemIndex;
        unsigned __int16 wNum;
        char sClientIndex;
        char byCsMethod;
        unsigned int dwT;
    };
    char byRetCode;
    unsigned __int16 wZoneIndex;
    unsigned int dwExpRate;
    unsigned __int16 wClassHistory[3];
    unsigned __int16 wHP;
    unsigned __int16 wSP;
    unsigned __int16 wFP;
    long double dPvpPoint;
    long double dPvpCashBag;
    long double dPvpTempCash;
    unsigned int dwPvpRank;
    char byPvpClass;
    char byPlusKey;
    unsigned __int16 wXorKey;
    unsigned __int16 wMaxHP;
    unsigned __int16 wMaxSP;
    unsigned __int16 wMaxFP;
    unsigned __int16 wMapIndex;
    float fPos[3];
    _base_download_result_zocl::_list_equip EquipList[8];
    _base_download_result_zocl::_list_embellish EmbellishList[6];
    char byHolyMasterState;
    unsigned int dwGuildSerial;
    char byGuildGrade;
    char byEffectValue[2];
    char byUseTrunkSlotNum;
    unsigned __int16 wMaxDP;
    unsigned __int16 wDP;
    char byHonorGuildRank;
};
#pragma pack(pop)
вот небольшой кусок кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void CPlayer__SendMsg_BaseDownloadResult(CPlayer *_this)
{
Dst.byRetCode = 0;
    Dst.wZoneIndex = _this->m_ObjID.m_wIndex;
    Dst.dwExpRate = _this->m_dwExpRate;
    for (int i = 0; i < 3; ++i)
    {
        if (_this->m_Param.m_pClassHistory[i])
            Dst.wClassHistory[i] = _this->m_Param.m_pClassHistory[i]->m_dwIndex;
        else
            Dst.wClassHistory[i] = -1;
    }
    Dst.wHP = CPlayerDB__GetHP(&_this->m_Param);
    Dst.wSP = CPlayerDB__GetSP(&_this->m_Param);
    Dst.wFP = CPlayerDB__GetFP(&_this->m_Param);
    Dst.wDP = CPlayerDB__GetDP(&_this->m_Param);
    Dst.dPvpPoint = CPlayerDB__GetPvPPoint(&_this->m_Param);
    Dst.dPvpCashBag = CPvpOrderView__GetPvpCash(&_this->m_kPvpOrderView);
    Dst.dPvpTempCash = CPvpOrderView__GetPvpTempCash(&_this->m_kPvpOrderView);
    Dst.dwPvpRank = _this->m_Param.m_dbChar.m_dwRank;
    Dst.byPvpClass = _this->m_Param.m_byPvPGrade;
    Dst.wMaxHP = _this->m_nMaxPoint[0];
    Dst.wMaxSP = _this->m_nMaxPoint[2];
    Dst.wMaxFP = _this->m_nMaxPoint[1];
    Dst.wMaxDP = CPlayer__GetMaxDP(_this);
 
        ......
 
На конечном результате всё отправляется клиенту через указатель &Dst....
}
Вот,мне рассказали что это сделать возможно ( расширить массив нужных мне переменных) , кстати , имя переменных которые надо расширить - Dst.wHP и Dst.wMaxHP , но я еще в этом плане немного туплю и прошу вашей помощи подсказать, как можно это сделать, исходников приложения нету, лишь только экзешник и pdb файл.

Заранее благодарю вас за помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2018, 02:28
Ответы с готовыми решениями:

Расширение массива
Подскажите пожалуйста что может быть не верным в алгоритме void** InitArray (int size, int cnt)...

Расширение динамического массива
В С для работы с динамической памятью используются операторы: malloc,calloc для выделения...

Расширение динамического массива
Не знаю, как реализовать возможность расширения динамического массива. Код, которым задаю массив:...

Расширение динамического массива
Доброго времени суток. Прошу помощи. Моя проблема заключается в том, что не могу понять как...

4
0 / 0 / 1
Регистрация: 18.01.2018
Сообщений: 86
31.10.2018, 22:33  [ТС] 2


Добавлено через 7 часов 28 минут
неужели никто намёка даже не даст как это сделать?)
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
01.11.2018, 10:36 3
Цитата Сообщение от Император97 Посмотреть сообщение
неужели
Неужели вы думаете, что кому-то интересно разбираться в настолько неясно описанной проблеме, вдумываться в смысл пол-сотни переменных, и ломать олову - "что же он хотел спросить? Какие у него проблемы?"
Мой совет. Задали вопрос? Теперь попробуйте на секунду забыть все, что вы знаете по этому поводу и прочесть этот вопрос. Понятно? Если да - вопрос удался - ждите ответа. Нет - думайте дальше, как спросить.
2
0 / 0 / 1
Регистрация: 18.01.2018
Сообщений: 86
01.11.2018, 12:13  [ТС] 4
Извиняюсь.

Объясняю более подробно , есть давненькая онлайн игрушка Rising Force Online , она имеет клиент и серверную часть.
Я пытаюсь сделать некоторые модификации кода программы своей DLL библиотекой, которая в свою очередь по указанным мною адресам функций делает перехваты и подменяет старые функции на мои новые.
Вот кстати архив самой программы и PDB файла http://rgho.st/7j5JqNjvG
Адреса функций и содержимое HEADER файлов, как и примерное содержание функций я узнаю из IDA PRO x64
Поставил себе интересную задачу, находясь в игре (с клиентской стороны) у персонажа имеется более 70.000 количества ХП , но отображаются они неверно , как 4465 , изучив проблему и найдя нужную функцию , где с серверной стороны передаётся значение ХП в клиент я обнаружил в HEADER файле, что типом данных ХП является unsigned __int16 , прошу вас подсказать мне , как можно изменить тип данных.

Просто изменить значение в хидере не получится (уже пробовал, от этого падает клиент и мне сказал один программист, которому удалось поменять тип данных, что приложение скомпилено так, что знает какой там тип данных должен быть (unsigned __int16) поэтому и падает клиент из за чтения памяти функцией за границей выделения.

Вот.. последние его слова были, перед тем как он пропал, что необходимо понять, что такое указатель и память, так же надо как то изначально выделить больше памяти, у вас хотел бы поинтересоваться советом, как примерно можно это сделать?
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
01.11.2018, 16:08 5
Император97, К сожалению, лично я ничем вам помочь не смогу. Но вопрос поставлен уже более адекватно, и, возможно, кто-нибудь этим сможет заняться или задать вам дополнительные вопросы.
Единственно, что могу сказать, что при даже таком незначительном изменении в хедере проект надо пересобрать целиком, вместе в ДЛЛ и основной программой.
И может быть следует очистить (истребить) все рабочие файлы, где хранится история игры и достигнутые результаты.
И не факт, что это поможет.
Если есть все исходники игры, можно попытаться их проанализировать (но я за это не берусь!) Работа тяжелая и неблагодарная. Часто легче бывает создать игру заново.
Остается только пожелать вам везения и удачи!
0
01.11.2018, 16:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2018, 16:08
Помогаю со студенческими работами здесь

Расширение динамического массива объектов
Здравствуйте, форумчане. Моя задача написать функцию,которая добавляет новый объект в динамический...

Расширение массива с затиранием данных
Добрый день. Пример: int main() { DWORD size = 0; // нулевой размер TCHAR buf; //...

Расширение динамически созданного массива объектов
Здравствуйте! Подскажите, как расширить динамический массив без использования STL библиотеки: ...

Проверить фрагмент кода - правильно ли производится расширение массива (динамические массивы)
Правильно ли я расширяю массив? Какие последствия могут быть? int *mas = (int*) malloc (10 *...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru