IPB

Здравствуйте, гость ( Вход | Регистрация )

29 страниц V  « < 20 21 22 23 24 > »   
Reply to this topicStart new topic
> Мод на ХотА
AlexSpl
сообщение 30 Dec 2016, 17:18 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 17:19)
Сообщение #421

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
Код
if (*(int*)(c->ebp + 16) != heroOffset) {
        return EXEC_DEFAULT;
    }

Так вряд ли прокатит. Там аргументы другие.

Лучше так:
Код
if ( heroOffset == 0 ) {
        return EXEC_DEFAULT;
    }


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 17:22
Сообщение #422

God
Сообщений: 267
Спасибо сказали: 25 раз




Переделаю ща..

А по артиллерии в банке, вот так получилось:
Код
if(*(char*)(heroOffset + 201 + 20) > 0) { //проверка на артиллерию
            if ( *(char*)(heroOffset + 301 + (13 << 3)) != -1 ) { //13 - слот на кукле для баллисты. -1 - пустой слот
                *(int*)(c->ebx + 200) += *(char*)(heroOffset + 201 + 20);
            }
        }

Это завелось. И баллиста и пушка дают бонусы (при наличии навыка). При пустом слоте - бонуса нет
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 17:22
Сообщение #423

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




8 - это размер структуры _Artifact_. Соответственно, 301 + slot * 8 - это оффсет арта в слоте.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 17:25
Сообщение #424

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 16:18) *
Лучше так:
Код
if ( heroOffset == 0 ) {
        return EXEC_DEFAULT;
    }


Так вылетает. А мой код не вылетал, но не давал сбегать даже при наличии навыка. Т.е. всегда дефолтное поведение у ф-ии было
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 17:28
Сообщение #425

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
2. При режиме "ПВП битве а нейтралами" - вылетает на ходу нейтралов (какой код разбираю, но точно не бонус при бое в банке)

Понятно. В этом режиме нет героев?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 17:31
Сообщение #426

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 16:28) *
Цитата
2. При режиме "ПВП битве а нейтралами" - вылетает на ходу нейтралов (какой код разбираю, но точно не бонус при бое в банке)

Понятно. В этом режиме нет героев?

нет, просто можно управлять нейтралами
Мы обычно с этим режимом на хотсите и играем.
Логика такая: ходит игрок, нападает на консерву с грифонами, а 2й игрок управляет грифонами

И вот сейчас получается игра вылетает на проверке активации кнопки побега, когда ход передаётся монстрам
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 17:33
Сообщение #427

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Попробуйте тогда так:

Код
int __stdcall setSurrenderButton(LoHook* h, HookContext* c)
{
    int heroOffset = *(int*)(c->esi + c->eax * 4 + 0x53CC);

    if ( heroOffset == 0 ) {
        return EXEC_DEFAULT;
    }

    char diplomacyLevel = *(char*)(heroOffset + 201 + 4);

    if ( diplomacyLevel > 0 ) {
        c->return_address = 0x477EB5;
        return NO_EXEC_DEFAULT;
    }

    return EXEC_DEFAULT;
}


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 17:37
Сообщение #428

God
Сообщений: 267
Спасибо сказали: 25 раз




Да, так завелось, спасибо!
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 18:33
Сообщение #429

God
Сообщений: 267
Спасибо сказали: 25 раз




Хочу немного с магией поколдовать...
Каким образом можно отредачить параметры даваемые магией? В частности молитва.
Сейчас она даёт +4 к атаке/защите/скорости
Хочу сделать так: +6 атака/защита, +4 скорости. И что бы вешалось благо

С чего начать? Как это сделать?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 19:08
Сообщение #430

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Адрес отряда легко посчитать. Да хотя бы на том же калькуляторе, если известен адрес combatManager. Известен адрес отряда, значит, и известны все его параметры. Например, скорость +196. Остаётся приаттачиться к процессу, поставить брейкпоинт на память по вычисленному адресу (в данном случае на запись, hardware), продолжить игру и повесить на этот отряд Молитву. Срабатывает брейкпоинт, и вот мы уже видим в IDA инструкцию, которая только что изменила память.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 19:20
Сообщение #431

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 18:08) *
Адрес отряда легко посчитать. Да хотя бы на том же калькуляторе, если известен адрес combatManager. Известен адрес отряда, значит, и известны все его параметры. Например, скорость +196. Остаётся приаттачиться к процессу, поставить брейкпоинт на память по вычисленному адресу (в данном случае на запись, hardware), продолжить игру и повесить на этот отряд Молитву. Срабатывает брейкпоинт, и вот мы уже видим в IDA инструкцию, которая только что изменила память.

Я наверное что-то упускаю...
но какой "калькулятор"? Комбат менеджер да, есть. Но как получить отряд, если допустим не эксперт молитва?
А по поводу дебага вроде понятно. Но вот "вычисленный адрес", на который поставить брейк поинт - не ясен тоже smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 19:24 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 19:33)
Сообщение #432

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




По шагам.

1. Начинаем бой. Загружаем базу игры в IDA и выбираем Debugger -> Attach to process...
2. Вычисляем адрес отряда. Пусть это будет самый верхний стек нашей армии в начале первого раунда.
2.1. Для начала смотрим адрес combatManager: клавиша G, вводим 699420 и записываем адрес (4 байта).
2.2. Вычисляем адрес отряда unitAddress = combatManager + 1352 * (unitNumber + 21 * unitSide) + 12708. В нашем случае unitAddress = combatManager + 1352 * (0 + 21 * 0) + 12708 = combatManager + 12708.
2.3. Вычисляем адрес параметра: прибавляем оффсет (например, +196 для скорости).
3. Снова жмём G, вводим этот адрес (понятно, что шестнадцатеричное значение). Ставим брейкпоинт: F2, снимаем флаг Read, ставим флаг Hardware.
4. Продолжаем игру: F9, кастуем Молитву. Инструкция выше выделенной и есть нужная.

Кстати, адреса и оффсеты лучше писать в шестнадцатеричной системе счисления, чтобы легко можно было потом считать.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 19:33 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 19:36)
Сообщение #433

God
Сообщений: 267
Спасибо сказали: 25 раз




https://sc-cdn.scaleengine.net/i/98a3f4c01a...24af4cb70c1.png - такой брейк поинт для комбат менеджера? (самый первый пункт)
Ранее диалога такого не показывалось

В общем если я правильно понимаю. Адрес такой - 07F32EF8. Я на верном пути?)
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 19:42
Сообщение #434

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Не, туда ставить не нужно. Делайте всё по инструкции ) Калькулятор можно использовать стандартный. Выберите режим "Программист" и переключитесь на HEX.

Цитата
2.1. Для начала смотрим адрес combatManager: клавиша G, вводим 699420 и записываем адрес (4 байта).
2.2. Вычисляем адрес отряда unitAddress = combatManager + 1352 * (unitNumber + 21 * unitSide) + 21708. В нашем случае unitAddress = combatManager + 1352 * (0 + 21 * 0) + 12708 = combatManager + 21708.


Поправил 12708 на 21708.

Цитата
В общем если я правильно понимаю. Адрес такой - 07F32EF8. Я на верном пути?)

Похож.

Теперь прибавьте к этому значению 21708 или 54ССh. Получите адрес первого отряда. Прибавьте смещение параметра - получите адрес параметра. Туда и нужно ставить брейкпоинт.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 19:44 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 19:47)
Сообщение #435

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 18:36) *
Не, туда ставить не нужно. Делайте всё по инструкции ) Калькулятор можно использовать стандартный. Выберите режим "Программист" и переключитесь на HEX.

Ага, дефолтный калькулятор и юзаю...
В общем, что получилось:
2.1. 07F32EF8
2.2. unitAddress = combatManager + 12708
07F32EF8 = ‭133377784‬
133377784‬ + 12708 == 133390492

Теперь перевожу 133390492 в хекс - ‭7F3609C‬

Пробую найти "‭7F3609C‬" в ИДА - пишет не верный адрес

PS: ага, с 21704 завелось. получилось 7F383C4. А со смещением (+196) вышло 7F38488
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 19:52
Сообщение #436

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
2.2. Вычисляем адрес отряда unitAddress = combatManager + 1352 * (unitNumber + 21 * unitSide) + 21708. В нашем случае unitAddress = combatManager + 1352 * (0 + 21 * 0) + 12708 = combatManager + 21708.


Перевожу в хекс:
Цитата
2.2. Вычисляем адрес отряда unitAddress = combatManager + 0x548 * (unitNumber + 0x15 * unitSide) + 0x54CC. В нашем случае unitAddress = combatManager + 0x548 * (0 + 0x15 * 0) + 0x54CC = combatManager + 0x54CC.


Соответственно, смещения тоже в хексе писать нужно: 196 = 0xC4.

Если не получается, заскриньте после 2.1. Я приведу пример расчёта с реальными цифрами.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 19:56 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 20:00)
Сообщение #437

God
Сообщений: 267
Спасибо сказали: 25 раз




Поставил точки остановки. Не отрабатывают.
2.1 - https://sc-cdn.scaleengine.net/i/2e9c35b615...2ba8952d7e5.png
адрес - 7F32EF8
2.2 - 133377784 + 21708 + 196 = 133399688
в хексовом виде - 7F38488
3. https://sc-cdn.scaleengine.net/i/0a85f3a7d4...157f85f9a82.png
4. молитва кастуется, ничего не происходит

PS: вот 2й заход. Всё с 0 сделал. Вот после каста молитвы https://sc-cdn.scaleengine.net/i/8772c1268f...18fac1ed0c3.png
Ничего не останавливалось. Бой как шел так и идёт
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 20:04 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 20:10)
Сообщение #438

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Короче, надеюсь, что адрес вы считаете верно. Иначе работать не будет. Также учтите, что адрес combatManager - не есть постоянная. Если выходите из игры, нужно пересчитывать.

Далее, после того, как Вы нашли адрес параметра (скорости, например), переходите по этому адресу и просто жмите F2. Флаги Вы убрали, но почему Enabled не стоит? Кроме того, из скрина видно, что скорость отряда равна 7 (так ли это?). Если всё сделать правильно, то после каста Молитвы на первый отряд, сработает брейкпоинт.

UPD На скорость не надо ставить - это для примера. Лучше на атаку поставьте. Молитва меняет модификатор скорости, а не скорость.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 20:10 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 20:13)
Сообщение #439

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 19:04) *
Короче, надеюсь, что адрес вы считаете верно. Иначе работать не будет. Также учтите, что адрес combatManager - не есть постоянная. Если выходите из игры, нужно пересчитывать.

Далее, после того, как Вы нашли адрес параметра (скорости, например), переходите по этому адресу и просто жмите F2. Флаги Вы убрали, но почему Enabled не стоит? Кроме того, из скрина видно, что скорость отряда равна 7 (так ли это?). Если всё сделать правильно, то после каста Молитвы на первый отряд, сработает брейкпоинт.


Да, скорость была 7, это был кентавр на траве. Сейчас с архом пробую.
Когда галочку "енейблед" поставил - завелось. Т.е. не активирован брейк поинт был..

Вот такой код, на котором остановилась игра - https://sc-cdn.scaleengine.net/i/4cfb6118f0...ed0b9f6a071.png

Код
.text:00444928 loc_00444928:                                             ; CODE XREF: combatMonster_ApplySpell+302j
.text:00444928 mov     eax, [esi+478h]
.text:0044492E mov     ecx, [esi+0C8h]
.text:00444934 mov     ebx, [esi+0CCh]
.text:0044493A add     ecx, eax                                          ; Add
.text:0044493C mov     [esi+0C8h], ecx
.text:00444942 mov     ecx, [esi+84h]
.text:00444948 shr     ecx, 6                                            ; Shift Logical Right
.text:0044494B add     ebx, eax                                          ; Add
.text:0044494D test    cl, 1                                             ; Logical Compare
.text:00444950 mov     [esi+0CCh], ebx
.text:00444956 jnz     loc_00444D5C                                      ; default
.text:00444956                                                        ; jumptable 00444701 cases 8,10-13,20,30,36-43,45,47
.text:0044495C add     [esi+0C4h], eax                                ; Add
.text:00444962 jmp     loc_00444D5C                                      ; default
.text:00444962                                                        ; jumptable 00444701 cases 8,10-13,20,30,36-43,45,47



.text:0044492E mov ecx, [esi+0C8h]
.text:00444934 mov ebx, [esi+0CCh]
Это походу атака/защита
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 20:14 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 20:16)
Сообщение #440

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Я апдейт написал в предыдущий пост. Если сработал брейкпоинт, то действительно изменилась скорость. Но безопаснее на атаку или защиту ставить.

Цитата
Код
.text:0044493C mov     [esi+0C8h], ecx

Ага, похоже на правду. Запишите этот адрес. И с атакой/защитой попробуйте.

Стоп. 0xC8 - это ж и есть атака.
Go to the top of the pageAdd Nick
 
+Quote Post

29 страниц V  « < 20 21 22 23 24 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 5 October 2025 - 00:26
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика