Функция C ++ подключается к исходному коду DLL - PullRequest
1 голос
/ 03 июля 2011

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

#include <windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")

//Function prototype
int (__stdcall* OriginalFunction)(); 

//Our hook function
int FunctionHook()
{
    //Return the real function
    return OriginalFunction(); 
}

//On attach set the hooks
OriginalFunction = (int (__stdcall*)())DetourFunction((PBYTE)0x0100344C, (PBYTE)FunctionHook);

Вопрос: не правда ли, если я ищу в ОДНОЙ DLL смещение и исправляю функцию по этому смещению (я думаю, что это сложнее, потому чтонахожусь в другой DLL и хотите подключить функцию для всех DLL)?Кстати, кто-нибудь знает, как я могу получить стандартные (например, 0x0100344C) смещения в IDA PRO?

1 Ответ

0 голосов
/ 03 июля 2011

Похоже, вы пытаетесь использовать обходы Microsoft, которая представляет собой систему хуков на платформе Windows. Detours использует «крюк для трамплина». Проще говоря, он попытается «переписать» переднюю часть функции ASM и перенаправить реальный вызов конкретной функции, что-то в этом роде. Обходы могут помочь вам справиться с этими деталями. Но я не вижу никакого кода о обходных путях, поэтому я думаю, что вам нужно изучить некоторую документацию по базовому использованию обходных путей.

На ваш вопрос:
OriginalFunction - это просто переменная точка для определенного адреса. Перепишите эту переменную не может повлиять на реальный вызов. Потому что ваша программа будет по-прежнему вызывать с использованием исходного адреса, вы просто измените переменную, а не свою внутреннюю программу.
Когда вы переписываете память, чтобы подключить функцию, это нормально влияет только на текущий процесс, потому что программа под Windows NT использует виртуальный адрес, а не реальный адрес памяти.

...