![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#421
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Код if (*(int*)(c->ebp + 16) != heroOffset) { return EXEC_DEFAULT; } Так вряд ли прокатит. Там аргументы другие. Лучше так: Код if ( heroOffset == 0 ) {
return EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#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); } } Это завелось. И баллиста и пушка дают бонусы (при наличии навыка). При пустом слоте - бонуса нет |
|
|
![]()
Сообщение
#423
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
8 - это размер структуры _Artifact_. Соответственно, 301 + slot * 8 - это оффсет арта в слоте.
|
|
|
![]()
Сообщение
#424
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#425
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата 2. При режиме "ПВП битве а нейтралами" - вылетает на ходу нейтралов (какой код разбираю, но точно не бонус при бое в банке) Понятно. В этом режиме нет героев? |
|
|
![]()
Сообщение
#426
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата 2. При режиме "ПВП битве а нейтралами" - вылетает на ходу нейтралов (какой код разбираю, но точно не бонус при бое в банке) Понятно. В этом режиме нет героев? нет, просто можно управлять нейтралами Мы обычно с этим режимом на хотсите и играем. Логика такая: ходит игрок, нападает на консерву с грифонами, а 2й игрок управляет грифонами И вот сейчас получается игра вылетает на проверке активации кнопки побега, когда ход передаётся монстрам |
|
|
![]()
Сообщение
#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; } |
|
|
![]()
Сообщение
#428
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Да, так завелось, спасибо!
|
|
|
![]()
Сообщение
#429
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Хочу немного с магией поколдовать...
Каким образом можно отредачить параметры даваемые магией? В частности молитва. Сейчас она даёт +4 к атаке/защите/скорости Хочу сделать так: +6 атака/защита, +4 скорости. И что бы вешалось благо С чего начать? Как это сделать? |
|
|
![]()
Сообщение
#430
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Адрес отряда легко посчитать. Да хотя бы на том же калькуляторе, если известен адрес combatManager. Известен адрес отряда, значит, и известны все его параметры. Например, скорость +196. Остаётся приаттачиться к процессу, поставить брейкпоинт на память по вычисленному адресу (в данном случае на запись, hardware), продолжить игру и повесить на этот отряд Молитву. Срабатывает брейкпоинт, и вот мы уже видим в IDA инструкцию, которая только что изменила память.
|
|
|
![]()
Сообщение
#431
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Адрес отряда легко посчитать. Да хотя бы на том же калькуляторе, если известен адрес combatManager. Известен адрес отряда, значит, и известны все его параметры. Например, скорость +196. Остаётся приаттачиться к процессу, поставить брейкпоинт на память по вычисленному адресу (в данном случае на запись, hardware), продолжить игру и повесить на этот отряд Молитву. Срабатывает брейкпоинт, и вот мы уже видим в IDA инструкцию, которая только что изменила память. Я наверное что-то упускаю... но какой "калькулятор"? Комбат менеджер да, есть. Но как получить отряд, если допустим не эксперт молитва? А по поводу дебага вроде понятно. Но вот "вычисленный адрес", на который поставить брейк поинт - не ясен тоже ![]() |
|
|
![]()
Сообщение
#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, кастуем Молитву. Инструкция выше выделенной и есть нужная. Кстати, адреса и оффсеты лучше писать в шестнадцатеричной системе счисления, чтобы легко можно было потом считать. |
|
|
![]()
Сообщение
#433
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
https://sc-cdn.scaleengine.net/i/98a3f4c01a...24af4cb70c1.png - такой брейк поинт для комбат менеджера? (самый первый пункт)
Ранее диалога такого не показывалось В общем если я правильно понимаю. Адрес такой - 07F32EF8. Я на верном пути?) |
|
|
![]()
Сообщение
#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. Получите адрес первого отряда. Прибавьте смещение параметра - получите адрес параметра. Туда и нужно ставить брейкпоинт. |
|
|
![]()
Сообщение
#435
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Не, туда ставить не нужно. Делайте всё по инструкции ) Калькулятор можно использовать стандартный. Выберите режим "Программист" и переключитесь на HEX. Ага, дефолтный калькулятор и юзаю... В общем, что получилось: 2.1. 07F32EF8 2.2. unitAddress = combatManager + 12708 07F32EF8 = 133377784 133377784 + 12708 == 133390492 Теперь перевожу 133390492 в хекс - 7F3609C Пробую найти "7F3609C" в ИДА - пишет не верный адрес PS: ага, с 21704 завелось. получилось 7F383C4. А со смещением (+196) вышло 7F38488 |
|
|
![]()
Сообщение
#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. Я приведу пример расчёта с реальными цифрами. |
|
|
![]()
Сообщение
#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 Ничего не останавливалось. Бой как шел так и идёт |
|
|
![]()
Сообщение
#438
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Короче, надеюсь, что адрес вы считаете верно. Иначе работать не будет. Также учтите, что адрес combatManager - не есть постоянная. Если выходите из игры, нужно пересчитывать.
Далее, после того, как Вы нашли адрес параметра (скорости, например), переходите по этому адресу и просто жмите F2. Флаги Вы убрали, но почему Enabled не стоит? Кроме того, из скрина видно, что скорость отряда равна 7 (так ли это?). Если всё сделать правильно, то после каста Молитвы на первый отряд, сработает брейкпоинт. UPD На скорость не надо ставить - это для примера. Лучше на атаку поставьте. Молитва меняет модификатор скорости, а не скорость. |
|
|
![]()
Сообщение
#439
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Короче, надеюсь, что адрес вы считаете верно. Иначе работать не будет. Также учтите, что адрес 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] Это походу атака/защита |
|
|
![]()
Сообщение
#440
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Я апдейт написал в предыдущий пост. Если сработал брейкпоинт, то действительно изменилась скорость. Но безопаснее на атаку или защиту ставить.
Цитата Код .text:0044493C mov [esi+0C8h], ecx Ага, похоже на правду. Запишите этот адрес. И с атакой/защитой попробуйте. Стоп. 0xC8 - это ж и есть атака. |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 5 October 2025 - 00:26 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|