我正在尝试学习使用弯路来修改和扩展程序中的功能。在这种情况下,我试图修改 Windows Notepad 32 位中的 InsertDateTime 函数。
我正在使用 Winject 注入我创建的用于修改函数的 dll。DLL 被正确注入,函数被绕道到我指定的新函数。但是,我绕行 InsertDateTime() 的新函数应该在名为 MyInsertDateTime() 的新函数的末尾调用原始函数InsertDateTime()。
但是,问题是,当调用新函数并最终尝试调用旧函数时。当然,这一个也会在无限循环中依次被重定向/绕道。所以永远不能调用原来的函数!
不知何故,我想我需要分离新功能才能调用旧功能。但是当我这样做时,我得到了错误?然而,这可能是一些根本性的错误。我应该如何正确地做到这一点?
代码如下:
#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
}