Спасибо, HoShiMin, за сочувствие и понимание, а то иногда прям комплексуешь и думаешь, что кого интересуют твои проблемы, кроме тебя самого. И иногда по некоторым постам, такой вывод порой напрашиваетя сам собой. --- Сообщение объединено, Aug 30, 2021 --- P.S. Еще хотел добавить, что когда я задаю тот или иной вопрос, то я учитываю, что ответа на него может и никто не знать. Потому как - все знать практически невозможно. Мне кажется, что каким-нибудь вопросом можно запросто поставить в тупик тех же Ионеску или Ильфака. Другой вопрос, что если они захотят, то они поднапрягутся и ответят, но на это нужно время, чтобы допустим, просмотреть какую-нибудь литературу или что-то уточнить в интернете. А это все время. Да и написание ответа тоже порой требует времени, а обычно свободного времени у специалистов не так много. Я у того же f13nd'а, в личке несколько раз пытался, помню, выяснить кое-какие вопросы на старом кл. А то думаю как-нибудь не так сформулирую вопрос в созданом мной треде на форуме - засмеют. Так он мне честно, прямым текстом иногда отвечал, что а хрен его знает - попробуй тему на форуме создать, может кто что подскажет. И что я его после этого стал меньше уважать? Потому как, еще раз повторюсь - все знать нереально.
HoShiMin, Взял бы пересобрал всю изменяемую процедуру, это лучший способ. Если в начале короткие ветвления, то возникнут проблемы, которые хардкодом решать плохой метод.
А это уже не укладывается в требования к простоте: писать и тащить огромный DBI ради вставки джампа... Так себе решение.
HoShiMin, А dbi причём, нужен лишь стабильный диз коих навалом и простой морфер(на x23 размер конструктора < 10kb, а размер определяет стабильность). Обьём кода куда меньше, чем твои хардкоды
Но согласись, что "простой" и "морфер" - это два взаимоисключающих параграфа. Явно ведь не уложишь морфер в пару тысяч строчек. Что вообще должно получиться на выходе после пересборки?
HoShiMin, Граф собрал, затем его в буфер сбилдил. Там будет вся процедура, затем можно атомарно и джамп вписать куда и как угодно.
Вот с этим и вопрос: как? Разобрал ты функцию на инструкции с узлами в условных переходах, а дальше? Чтобы собрать его обратно с новыми инструкциями, надо, как минимум, иметь ассемблер, а как максимум, виртуальную машину и транслятор x86 -> IL -> x86. Это совсем нетривиальная задача, даже если брать LLVM. Или я просто не знаю, как это делается по-простому.
LLVM очень жирный, но есть другие JIT-компиляторы. Использовать такое для "пересборки" функции в буффер" не нужно скорее всего. Вопрос в том, зачем вообще пересобирать? Вот есть у тебя внешняя библиотека, которую использует один процесс. Ты заинжектился в процесс, пересобрал функцию к себе в буффер (там страницу исполняемую выделил или кучу исполняемую), дальше то что? Как процесс станет твою пересобранную функцию использовать вместо оригинальной? Или опять нужно использовать эльфийские технологии с "подменой выборок"? Ну очень просто: делаешь у себя на коленке костыль, не тестишь его нормально, а как сделал, то начинаешь бить себя тапком в грудь за то, что смог то, что другие не смогли.
Зачем компилер, ветвления обработать, остальные блоки просто копировать. Может не хватить места в начале функции для записи ветвления, получится ветвь не на начало инструкции. Такая проблема как то возникла с семплом Rel, тут наверно осталась та тема. В общем если есть конструктор, можно не вносить изменения в целевой код, пересобрав его не изменяя смещения по данным, а лишь скорректировав на них ссылки при сборке. Таже катя не использовала компиляцию, но код успешно собирался, даже целиком переносился весь модуль в буфер(использовалось для защиты что то там с cfg).
По просьбе трудящихся добавил в хуклибу поддержку внешних хранилищ для хуков, чтобы обходиться без аллокаций вообще. У этого способа есть нюанс: если в начале перехватываемой функции есть относительные инструкции, а расстояние между данными, на которые смотрит оффсет, и нашим хранилищем больше 2х гигабайт, то мы не сможем корректно переместить начало на новое место. Чтобы это стало возможным, понадобится что-то типа того, что предлагал Indy_ - пересобирать начало. Поэтому не стал заливать этот способ в master, а ограничился отдельной веткой feature/external-storage-support, где будет доступна новая функция exthook.
HoShiMin, что значит код? Code (C++): static FnZwProtectVirtualMemory findVirtualProtect() { // Windows 8.1 and above: const UNICODE_STRING name = RTL_CONSTANT_STRING(L"ZwProtectVirtualMemory"); const FnZwProtectVirtualMemory fn = (FnZwProtectVirtualMemory)MmGetSystemRoutineAddress((UNICODE_STRING*)&name); if (fn) { return fn; } В плане, что изменилось в вин 8.1 ?