25.08.2020, 12:09
(25.08.2020, 01:08)Albeoris Написал:(25.08.2020, 00:03)Demoth Написал: Вот пример третьего случая: https://gist.github.com/koteyur/416a6804...93b8214554
Тут под "как можно автоматизировать" я имею в виду проверку кода, который будет запатчен, правильный выбор позиции оригинального кода (после выполнения хука или перед) и адаптацию этого кода. Поэтому в моей либе предполагается, что тот кто будет писать код сам хорошо понимает, что он делает. Так что в моей либе ничего инновационного нет - простой cpp на 300 строчек кода.
Хм. Пока не понимаю проблемы.
При помощи Detours, мы перенаправляем все вызовы метода в нашу либину и получаем линку на оригинал. К нам приходит вызов, анализируем аргументы, в зависимости от них либо вызываем оригинал, либо выполняем наш хук. Вроде, всё тоже самое?
Единственное, в твоём случае я вижу некоторый контекст, у которого оттопырены значения регистров. В этой области я не силён, но предполагаю, что мы точно также можем получить их значения на момент вызова?
Возможность патчить отдельные инструкции в методах сама по себе интересная, но на мой взгляд очень скрупулёзная. Вытащить его полностью и дело с концом.
Ясно, я вот тоже всё ищу какую-нибудь серебряную пулю, которая может превратить рутину в "я просто пишу код", но всё никак не выходит. >_> И mail, не отвечают ни по одному из официальных ящиков...
P.S. А у тебя не было проблем с Hardware Breakpoint'ами? Выставляю в Cheat Engine бряку на чтение, и игра вылетает при первом же обращении.
Ну для перехвата именно метода нужно чтобы деторус знал, что это thiscall (при чём какой именно, он отличается у gcc/clang/msvc), и передал указатель this, который хранится в регистре ecx, в нашу реализацию, которая уже в соглашении о вызовах stdcall/cdecl. По крайней мере я себе это так вижу. Мб там можно и проще это сделать, но в любом случае это все не настолько принципиально, т.к. что детурс, что моя самопальная либа перехват именно функций позволяют сделать достаточно просто.
На счёт хуканья из середины функции. Если оригинальная фунция достаточно большая, то её перехват и анализ аргументов ничего не даст особо в том случае, когда тебе нужно именно изменить логику оригинальной функции, а не что-то поверх. А если функция небольшая, то можно, конечно, её целиком переписать как нам нужно.
С хардварными бряками никогда не было проблем.