2015-04-12 6 views
0

Забавно, я ответил на вопрос не так давно о получении адреса конструктора C++, говорящего, что это невозможно, поэтому вместо этого используйте совершенную переадресацию. Однако, с точки зрения обхода с использованием библиотеки Microsoft Detour, это не вариант. Адрес -, необходимый для обхода любого вызова. Итак, теперь я должен задать вопрос, если нет адреса конструктора, можно ли даже объединить его? И если да, то как?Есть ли способ обхода конструктора C++?

+0

Конструктор имеет адрес памяти (это исполняемый код afterall, поэтому он должен находиться * где-то * в памяти). Вы просто не можете использовать оператор '&' для получения этого адреса (стандарт языка запрещает его). Но, если вы знаете, как ваш компилятор излагает структуру класса в памяти, вы, вероятно, можете получить адрес конструктора с помощью «креативных» средств. Но я бы не советовал. –

+0

Ну, @RemyLebeau, кажется, что * creative * должен был стать для вас. Я знаю, что это *** определенно *** не будет переносимым, и я не ищу его. До тех пор, пока он работает под компилятором MS C++, я был бы счастлив. – Adrian

ответ

0

Не уверен относительно MS Detour, но я обычно подключаю обход вручную с помощью встроенной сборки на C++. Если код (экземпляр конструктора) отображается в памяти, и вы можете записать его в эту область памяти, тогда можно будет обходить .

  • Основной механизм зацепления крюка - найти место для замены исходного кода операции JUMP на вашу пещерку кода. Если код JUMP не соответствует размеру исходного кода операции, заполните его NOP.
  • Выполнить оригинальный опкод в коде пещере
  • PUSHAD & PUSHFD
  • Делать все, что вы хотите с помощью глобальных переменных (рекомендуется)
  • Вызов любой пользовательской функции без PARAMS
  • POPFD & POPAD
  • Перейти назад к исправленному операционному коду (умение несколько байтов NOPS)

Для первого шага o btain адрес экземпляра конструктора, вам нужно искать его динамический адрес либо с помощью ReadProcessMemory, либо любым способом. Я объединил функцию из DLL, загружаемой динамически. Чтобы получить эту функцию, я использую HANDLE tempHandle = GetModuleHandle((LPCWSTR)"DLLFileName.dll"); и перехожу по смещению дескриптора DLL.

Смежные вопросы