IPB

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

29 страниц V  « < 5 6 7 8 9 > »   
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 17 Dec 2016, 20:30
Сообщение #121

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




это я и понял, что надо сделать. Выше описал примерно. А вот КАК это сделать - хз. Могу переписывать ф-ю по адресу, это понимаю как. Но как словить входные параметры. Их отредачить и вызвать оригинал - хз как
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 17 Dec 2016, 20:46
Сообщение #122

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




Вот, что пишет baratorch:

Цитата
LoHook - это, соответственно, "низкоуровневый" хук. Его мы можем поставить вообще на любое место в коде. При этом мы получаем возможность работать с регистрами процессора как с переменными, используя их в нашем (допустим С++) коде и можем менять адрес возврата.
LoHook - гораздо более мощный и универсальный инструмент, в сравнение с HiHook'ом. Им можно решать любые задачи (даже те что решают SPLICE_ и CALL_ хайхуки).
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 17 Dec 2016, 22:55
Сообщение #123

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




мне это ничем не помогло. Я понимаю ЧТО надо сделать, я не понимаю как. А именно как получить результат работы ф-ии и изменить этот результат. И передать его куда-то дальше
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 17 Dec 2016, 23:52 (Сообщение отредактировал AlexSpl - 17 Dec 2016, 23:52)
Сообщение #124

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




Проверить не могу, так что псевдокод:

Код
int __stdcall ModifyPower(LoHook* h, HookContext* c) {
     c->eax *= 1.2f;
     return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x4A7441, (void*)ModifyPower);
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Dec 2016, 01:00
Сообщение #125

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20603 раза




Нет, не так.
Надо использовать хайхук со сплайсом.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 01:12
Сообщение #126

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




2feanor: а как же это:

Цитата
LoHook - гораздо более мощный и универсальный инструмент, в сравнение с HiHook'ом. Им можно решать любые задачи (даже те что решают SPLICE_ и CALL_ хайхуки).
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Dec 2016, 01:33
Сообщение #127

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20603 раза




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

Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 01:41
Сообщение #128

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




А как решается задача с помощью хайхука со сплайсом? И где мы выигрываем?
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 18 Dec 2016, 15:03 (Сообщение отредактировал feanor - 18 Dec 2016, 15:04)
Сообщение #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 + еще один для снятия параметров на старте функции, да еще и глобальные переменные заводить)
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 16:14
Сообщение #130

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




Цитата
единственно что могу сказать, что дробные результаты емнип не через eax возвращаются, а через st0

Там не дробный результат возвращается: eax (силу армии) умножаем на 1.2, а затем отбрасываем дробную часть.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 18 Dec 2016, 18:41 (Сообщение отредактировал DedMorozzz - 18 Dec 2016, 18:45)
Сообщение #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) нету. А как без него получить уровень дипломатии не знаю
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 18:51
Сообщение #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);
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 18 Dec 2016, 18:58
Сообщение #133

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




Цитата(AlexSpl @ 18 Dec 2016, 17:51) *
А так вылетает?

Неа, слабые убегают, сильные - нападают.. т.е. работает в штатном режиме
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 19:01
Сообщение #134

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




Т.е. если раскомментировать, вылет?
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 18 Dec 2016, 19:04
Сообщение #135

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




Цитата(AlexSpl @ 18 Dec 2016, 18:01) *
Т.е. если раскомментировать, вылет?

верно. Была идея, что сликом большие цифры делаю (сомнительно но всё же...).
Усилил в 2 раза (c->eax *= 2;) Так же вылетает
Может чёт не то правлю?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 19:11 (Сообщение отредактировал AlexSpl - 18 Dec 2016, 19:12)
Сообщение #136

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




А вот это работает?

Код
int __stdcall setArmyValue(LoHook* h, HookContext* c)
{
     int Power = c->eax;
     return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x4A7441, (void*)setArmyValue);
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 18 Dec 2016, 19:16
Сообщение #137

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




Цитата(AlexSpl @ 18 Dec 2016, 18:11) *
А вот это работает?


да. Точно так же, слабые сбегают, сильные нападают
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 19:20 (Сообщение отредактировал AlexSpl - 18 Dec 2016, 19:22)
Сообщение #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, и вернуть управление обратно.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 18 Dec 2016, 19:34 (Сообщение отредактировал DedMorozzz - 18 Dec 2016, 19:39)
Сообщение #139

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




Да, так работает. Слабые убегают, сильные убегают. Очень сильные - нападают
Но, предпросмотр пишет не правду. Пишут что мобы нападут. При нападении на них - они сбегают
Выходит для пред просмотра отдельная ф-я вызывается?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 18 Dec 2016, 19:41 (Сообщение отредактировал AlexSpl - 18 Dec 2016, 19:56)
Сообщение #140

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




Да, предпросмотр - в отдельной функции. Функция sub_426750 вызывается из 4-х мест в коде. Установите курсор на sub_427650 и нажмите X. IDA покажет все кроссреференсы (xref). Ставим LoHook на следующую за вызовом функции инструкцию и модифицируем eax.

Только, если я правильно понимаю, контекст локальный, поэтому это: *(char*)(c->esi + 201 + 4) не будет возвращать уровень Дипломатии.
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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