Как расширить внутрипрограммную функцию, используя Detours в c ++, не заходя в бесконечный цикл?

Я пытаюсь научиться использовать обходные пути для изменения и расширения функций в программе. В этом случае я пытаюсь изменить функцию InsertDateTime в 32-разрядной Windows Notepad.

Я использую Winject, чтобы ввести DLL, которую я создаю, чтобы изменить функцию. DLL вставляется правильно, и функция отклоняется от новой функции, которую я указал. Однако новая функция, к которой я обращаюсь, InsertDateTime () должна вызывать оригинальная функция InsertDateTime () в конце новой функции MyInsertDateTime ().

Однако проблема в том, что, когда новая функция вызывается и, в конце концов, пытается вызвать старую функцию. Этот, конечно, также перенаправляется / отклоняется в свою очередь в бесконечный цикл. Таким образом, оригинальная функция никогда не может быть вызвана!

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

Код можно увидеть ниже:

#include <iostream>

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

using namespace std;

static int(__stdcall* InsertDateTime)(int);

int MyInsertDateTime(int x) //Our function
{
MessageBox(NULL, TEXT("Detoured Function Call"), TEXT("Min funktion"), MB_OK);
return InsertDateTime(x); //Return the origional function
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
InsertDateTime = (int(__stdcall*)(int))(reinterpret_cast<DWORD>(GetModuleHandleA("notepad.exe")) + 0x978A);
switch (ul_reason_for_call) //Decide what to do
{
case DLL_PROCESS_ATTACH: //On dll attach
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((PVOID*)(&InsertDateTime), (PVOID)MyInsertDateTime);
DetourTransactionCommit();
break;
case DLL_THREAD_ATTACH: //On thread attach
break;
case DLL_THREAD_DETACH: //On thread detach
break;
case DLL_PROCESS_DETACH: //on process detach
DetourDetach((PVOID*)(reinterpret_cast<DWORD>(GetModuleHandleA("notepad.exe")) + 0x978A), InsertDateTime);
break;
}
return TRUE;
}

Наконец измененный MyInsertDateTime (), где я пытаюсь отделить объезд. Возможно, я делаю что-то не так, когда отсоединение?

int MyInsertDateTime(int x) //Our function
{
//Messagebox
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((PVOID*)(reinterpret_cast<DWORD>(GetModuleHandleA("notepad.exe")) + 0x978A), InsertDateTime);
DetourTransactionCommit();
MessageBox(NULL, TEXT("InsertDateTime Just Got Called"), TEXT("Min funktion"), MB_OK);
return InsertDateTime(x); //Return the origional function
}

1

Решение

Вы должны удалить Detour в DllMain только во время выгрузки DLL.

DetourAttach () дает вам указатель на исходную функцию.

Посмотреть здесь:

http://www.codeproject.com/Articles/30140/API-Hooking-with-MS-Detours

DetourAttach(&(PVOID&)pSend, MySend);

int WINAPI MySend(SOCKET s, const char* buf, int len, int flags)
{
fopen_s(&pSendLogFile, "C:\\SendLog.txt", "a+");
fprintf(pSendLogFile, "%s\n", buf);
fclose(pSendLogFile);
return pSend(s, buf, len, flags); // Calling original function obtained via the DetourAttach call, this will NOT cause MySend to be called again.
}

У вас может быть проблема, потому что:

InsertDateTime = (int(__stdcall*)(int))(reinterpret_cast<DWORD>(GetModuleHandleA("notepad.exe")) + 0x978A);

Возможно, это «неправильный» адрес, из-за которого jmp находится не в том месте.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector