我正在学习DLL注入基础知识和实现它的不同技术,例如使用CreateProcessLoadLibrary,或者只是替换要注入应用程序的文件夹中的.dll。
将.dll加载到应用程序的内存空间后,我能够执行一些基本任务,例如在MessageBox上调用DLLEntry等。
但是如何使用应用程序本身的代码进行操作,例如调用属于应用程序的某个过程,还是简单地修改变量?
我在线阅读的大多数教程都只讨论注入过程本身,而不讨论应用程序的实际操作。或者至少我在查找该信息时遇到了麻烦。

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

#1 楼

如果要在应用程序中使用功能,最重要的是您需要知道它的位置。如果没有ASLR,您可以将函数的地址硬编码到DLL中,并使用函数指针来调用它。如果要修改已加载库中某个函数的数据,则需要将该函数挂接,并调用自己的代码进行操作。

如果应用程序的函数位于0x0041A000,则可以创建一个函数指针,如果您知道有关该函数的所有信息;调用约定,返回值和参数。假设它是一个__stdcall,两个VOID *参数,并返回一个DWORD。您还可以使用Windows Detours库来钩挂该函数。同样,您将对要挂接的函数的地址进行硬编码,并编写自己的函数版本。您需要确保它返回与真实函数相同类型的值,以确保调用函数中没有中断。使用GetProcAddress,您可以挂钩库的函数调用,而不是应用程序的函数。

ASLR使一切变得复杂。由于应用程序可能不在您认为的位置。这个答案可以帮助计算由程序的基地址确定的某些部分。您需要在程序中找到它们的偏移量。然后,您可以创建指向该内存地址的指针以进行操作。