Изменение возвращаемого значения функции в C++ (во время выполнения)

avatar
Donald C. Spencer
9 августа 2021 в 00:07
152
1
0

я хочу изменить возвращаемое значение внешней функции (во время выполнения), которая находится внутри другой dll, которая загружается при запуске программы.

Практический пример того, что я хочу сделать:

Функция внутри dll:

int numberOfMoney() {
   return 0;
}

Моя основная программа:

    HMODULE handle = LoadLibraryA("/myDll.dll");

    auto gotFunc = GetProcAddress(handle, "numberOfMoney");
    // making numberOfMoney returning 1000 ???

Кто-нибудь знает, как мне это сделать? Может без внешних библиотек? Спасибо!

Источник
Pete Becker
9 августа 2021 в 00:16
0

Зачем вам вызывать функцию, если все, что она делает, это возвращает значение, которое вы собираетесь игнорировать? Просто напишите свою собственную функцию, которая возвращает нужное вам значение. Если на самом деле есть причина для вызова функции шляпы, напишите функцию, которая вызывает ее и соответствующим образом обрабатывает возвращаемое значение. Остальная часть вашего кода должна вызывать функцию-оболочку, а не фактическую.

WhozCraig
9 августа 2021 в 00:18
2

@PeteBecker Я подозреваю, что OP нисколько не заинтересован в том, чтобы быть вызывающим этой функции; скорее я подозреваю, что они хотят изменить результат из-под звонка так, чтобы вызывающий абонент не знал, что они это сделали. Например. то, что делает обходы.

Donald C. Spencer
9 августа 2021 в 00:38
0

@PeteBecker в основном потому, что эта функция вызывается внутри dll. Поэтому, если я изменю это возвращаемое значение, я смогу «взломать» всю систему dll.

Ответы (1)

avatar
Irelia
9 августа 2021 в 00:26
2

Вы можете изменить функцию или возврат функции во время выполнения с помощью перехвата. Существует несколько различных методов перехвата функции. Наиболее распространено так называемое горячее исправление, при котором в x86 первые пять байтов функции перезаписываются относительной инструкцией перехода к функции промежуточного программного обеспечения. Затем промежуточная функция может выбрать возврат к вызывающему объекту или фрагменту кода, называемому батутом. Батут восстанавливает исходный замененный код и возвращается к исходной горячей исправленной функции+5, чтобы предотвратить непрерывный цикл.

Есть также перехват IAT, но это больше перехват вызовов API, которые разрешают свой адрес через таблицу адресов импорта, расположенную в заголовках формата исполняемого файла.

VMT — это еще одна форма перехвата, при которой виртуальный метод может быть перехвачен из-за замены его адреса в таблице виртуальных методов. Аналогично IAT, но каждый экземпляр объекта указывает на таблицу виртуальных методов.

Взгляните на эту книгу изначально я узнал о IAT и горячем исправлении.<52473333739894>

Joe
9 августа 2021 в 00:56
0

Кроме того, книга Джона Роббинса по отладке Windows неоценима для такого рода вещей. Вот где я впервые узнал обо всем, что есть

Алексей Неудачин
9 августа 2021 в 01:51
0

то есть вам нужно написать драйвер с wdk, который у вас нет шансов быть подписанным ms. удачи леди

Donald C. Spencer
9 августа 2021 в 12:55
0

Для этого вам не нужны никакие привилегии ядра.

Irelia
9 августа 2021 в 23:04
0

@АлексейНеудачин Горячее обновление пользовательского режима можно легко обойти, особенно в WOW64, поскольку все они проходят через один и тот же шлюз вызова для завершения виртуализации. Но да, драйверы режима ядра были бы надежной техникой перехвата, хотя те, кто это делает, скорее всего, используют эксплойты для обхода DSE.