![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#121
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
это я и понял, что надо сделать. Выше описал примерно. А вот КАК это сделать - хз. Могу переписывать ф-ю по адресу, это понимаю как. Но как словить входные параметры. Их отредачить и вызвать оригинал - хз как
|
|
|
![]()
Сообщение
#122
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Вот, что пишет baratorch:
Цитата LoHook - это, соответственно, "низкоуровневый" хук. Его мы можем поставить вообще на любое место в коде. При этом мы получаем возможность работать с регистрами процессора как с переменными, используя их в нашем (допустим С++) коде и можем менять адрес возврата.
LoHook - гораздо более мощный и универсальный инструмент, в сравнение с HiHook'ом. Им можно решать любые задачи (даже те что решают SPLICE_ и CALL_ хайхуки). |
|
|
![]()
Сообщение
#123
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
мне это ничем не помогло. Я понимаю ЧТО надо сделать, я не понимаю как. А именно как получить результат работы ф-ии и изменить этот результат. И передать его куда-то дальше
|
|
|
![]()
Сообщение
#124
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Проверить не могу, так что псевдокод:
Код int __stdcall ModifyPower(LoHook* h, HookContext* c) { c->eax *= 1.2f; return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x4A7441, (void*)ModifyPower);
|
|
|
![]()
Сообщение
#125
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20603 раза ![]() |
Нет, не так.
Надо использовать хайхук со сплайсом. |
|
|
![]()
Сообщение
#126
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
2feanor: а как же это:
Цитата LoHook - гораздо более мощный и универсальный инструмент, в сравнение с HiHook'ом. Им можно решать любые задачи (даже те что решают SPLICE_ и CALL_ хайхуки).
|
|
|
![]()
Сообщение
#127
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20603 раза ![]() |
Ну да.
Но это не значит, что им нужно пользоваться и тогда, когда есть специализированные и более приспособленные инструменты. |
|
|
![]()
Сообщение
#128
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А как решается задача с помощью хайхука со сплайсом? И где мы выигрываем?
|
|
|
![]()
Сообщение
#129
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20603 раза ![]() |
опять же, условный код, пока нет времени вникать в тред (единственно что могу сказать, что дробные результаты емнип не через eax возвращаются, а через st0)
Код int __stdcall OnFunc(HiHook* h, int pam, int param, int pararam) { param = some_tuning(param); int ret = CALL_3(int, __thiscall, h->GetOriginalFunc(), pam, param, pararam); ret = do_something(ret); return ret; } ... h->WriteHiHook(0x4567890, SPLICE_, EXTENDED_, THISCALL_, (void*)OnFunc); Еще можно CALL_, непосредственно на вызовы, если надо только в каких-то конкретных случаях механику менять. Выигрываем, во-первых, в высокоуровневости и дальнейшей читаемости кода, во-вторых, в одном хуке вместо нескольких (лоухуков надо на каждый ret + еще один для снятия параметров на старте функции, да еще и глобальные переменные заводить) |
|
|
![]()
Сообщение
#130
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата единственно что могу сказать, что дробные результаты емнип не через eax возвращаются, а через st0 Там не дробный результат возвращается: eax (силу армии) умножаем на 1.2, а затем отбрасываем дробную часть. |
|
|
![]()
Сообщение
#131
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
ни 1й, ни 2й вариант не завёлся.
1й: Код int __stdcall setArmyValue(LoHook* h, HookContext* c) { if (*(char*)(c->esi + 201 + 4) > 0) { c->eax *= 20; } return EXEC_DEFAULT; } ... _PI->WriteLoHook(0x4A7441, setArmyValue); При дипломатии умножаю силу в 20 раз. Что бы проверить, что от копейщиков убегают сильные войска.. Вылетает Пробовал и делить на 100, с округлением. Что бы на 50 ангелов нападали гоблины. Так же вылетает при нападении 2й вариант: Код int __stdcall ModifyPower(HiHook* h, int pam, int param, int pararam) { int ret = CALL_3(int, __thiscall, h->GetOriginalFunc(), pam, param, pararam); // if (*(char*)(c->esi + 201 + 4) > 1) { ret = floor(ret * 0.2); //ослабить армию в 5 раз // } return ret; } ... _PI->WriteHiHook(0x4A7441, SPLICE_, EXTENDED_, THISCALL_, ModifyPower); Тут проблема в том, что c (HookContext) нету. А как без него получить уровень дипломатии не знаю |
|
|
![]()
Сообщение
#132
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А так вылетает?
Код int __stdcall setArmyValue(LoHook* h, HookContext* c)
{ if (*(char*)(c->esi + 201 + 4) > 0) { // c->eax *= 20; } return EXEC_DEFAULT; } ... _PI->WriteLoHook(0x4A7441, (void*)setArmyValue); |
|
|
![]()
Сообщение
#133
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#134
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Т.е. если раскомментировать, вылет?
|
|
|
![]()
Сообщение
#135
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#136
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А вот это работает?
Код int __stdcall setArmyValue(LoHook* h, HookContext* c)
{ int Power = c->eax; return EXEC_DEFAULT; } ... _PI->WriteLoHook(0x4A7441, (void*)setArmyValue); |
|
|
![]()
Сообщение
#137
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#138
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Наверное, я не понимаю, что такое контекст в LoHook. Он что, read-only? Вот ещё вариант:
Код int __stdcall setArmyValue(LoHook* h, HookContext* c) { (int)c->eax = (int)c->eax * 20; return EXEC_DEFAULT; } ... _PI->WriteLoHook(0x4A7441, (void*)setArmyValue); На ассемблере всё работало бы. Идея перехватить код до выполнения инструкции по адресу 4A7441h, модифицировать регистр eax, и вернуть управление обратно. |
|
|
![]()
Сообщение
#139
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Да, так работает. Слабые убегают, сильные убегают. Очень сильные - нападают
Но, предпросмотр пишет не правду. Пишут что мобы нападут. При нападении на них - они сбегают Выходит для пред просмотра отдельная ф-я вызывается? |
|
|
![]()
Сообщение
#140
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Да, предпросмотр - в отдельной функции. Функция sub_426750 вызывается из 4-х мест в коде. Установите курсор на sub_427650 и нажмите X. IDA покажет все кроссреференсы (xref). Ставим LoHook на следующую за вызовом функции инструкцию и модифицируем eax.
Только, если я правильно понимаю, контекст локальный, поэтому это: *(char*)(c->esi + 201 + 4) не будет возвращать уровень Дипломатии. |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 3 October 2025 - 12:11 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|