перехват через hotpatching ... не экспортируемый метод класса в dll - PullRequest
2 голосов
/ 29 октября 2011

Я изучал этот метод перехвата API, используя механизмы горячей установки в Windows DLL.

http://www.codeproject.com/KB/winsdk/0xF9EB_Hooking.aspx

Мне было интересно, если кто-нибудь узнает о способе его расширения для перехвата неэкспортируемых функций, таких как конструктор C ++ для внутреннего класса внутри DLL. Я уже знаю адрес с помощью разборки ... проблема, с которой я сталкиваюсь, заключается в том, как установить правильные соглашения о вызовах, чтобы я мог вызывать исходную функцию внутри моей функции ловушки.

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

Предположим, мы говорим о подключении внутреннего конструктора класса к прототипу примерно так:

public __thiscall <class_name>::<class_name>(<single pointer arg to another object>)

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

В зависимости от того, как загружен ваш модуль, вы можете просто перезаписать относительные или абсолютные адреса на соответствующих сайтах вызовов, в противном случае вам нужно создать функцию трамплина, для которой проще использовать что-то вроде MS Detours.

С точки зрения правильного прототипа для функций-членов класса, основанных на __thiscall, вам понадобятся некоторые хитрости, поскольку вы не можете обычно использовать __thiscall вне классов.Самый быстрый и простой способ - использовать __fastcall и игнорировать второй параметр.Таким образом, ваше первое определение становится void __fastcall myctor(myobj* pObj).

0 голосов
/ 29 октября 2011

Определите его как типичную функцию __stdcall, за исключением того, что у вас будет указатель this в регистре ecx. Если вам нужен этот указатель, используйте ключевое слово __asm, чтобы получить значение:

void __stdcall HookedConstructor( SomeObject *pObject){
    HookedClass *pClass;
    __asm mov pClass, ecx;
    ...
}

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

...