如果您想在应用程序中使用某个函数,最重要的是您需要知道它的位置。如果没有 ASLR,您可以将函数的地址硬编码到 DLL 中,并使用函数指针来调用它。如果您想修改已加载库中某个函数的数据,则需要挂钩该函数,并调用您自己的代码进行操作。
如果应用程序的函数在 0x0041A000 处,如果您知道有关该函数的所有信息,则可以创建函数指针;调用约定、返回值和参数。假设它是 a __stdcall
,两个VOID *
参数,并返回 a DWORD
。
typedef DWORD (WINAPI *FunctionType)(VOID *a, VOID *b);
DllEntry(...)
{
FunctionType function = (FunctionType) 0x0041A000;
function(your_param1, your_param2);
}
您还可以使用Windows Detours库来挂钩该函数。您将再次硬编码要挂钩的函数的地址,并编写您自己的函数版本。您需要确保它返回与实际函数相同类型的值,以确保调用函数中没有任何中断。使用GetProcAddress
您可以挂钩库的函数调用而不是应用程序的函数。
这一切都因 ASLR 而变得复杂。由于应用程序可能不在您认为的位置。 这个答案可以帮助计算由程序的基地址确定的某些部分。
修改全局变量是同一种交易。您需要在程序中找到它们的偏移量。然后,您可以创建指向该内存地址的指针以进行操作。