DLL 注入搜索过程/变量

逆向工程 dll 登录 dll注入 函数挂钩
2021-06-17 22:15:44

我正在学习 DLL 注入基础知识和不同的技术来实现它,例如使用CreateProcessLoadLibrary,或者只是替换要注入的应用程序所在的文件夹中的 .dll。在将 .dll 加载到应用程序的内存空间后,我能够执行一些基本任务,例如调用MessageBoxonDLLEntry和其他一些。但是如何使用应用程序本身的代码进行操作,例如。调用作为应用程序一部分的某个过程,或者只是修改一个变量?我在网上阅读的大多数教程只讨论注入过程本身,而不讨论应用程序的实际操作。或者至少我无法找到该信息。

那么,如何查找/提取您感兴趣的应用程序的内存部分,然后修改/更改它们?

1个回答

如果您想在应用程序中使用某个函数,最重要的是您需要知道它的位置。如果没有 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 而变得复杂。由于应用程序可能不在您认为的位置。 这个答案可以帮助计算由程序的基地址确定的某些部分。

修改全局变量是同一种交易。您需要在程序中找到它们的偏移量。然后,您可以创建指向该内存地址的指针以进行操作。