我想制作自己的 dll 加载器,这将允许从字节数组将 dll 加载到进程中,但我找到了一个现成的版本。我不了解一个细节。一切都井井有条..
首先,我们根据对齐方式将所有部分投影到目标进程中。其次,我们在目标进程中创建一个内存区域,在其中写入从内存中运行 dll 所需的数据和一个填充导入表、重定位的函数,然后我们将在单独的线程中运行. 实际上加载器本身:https ://github.com/BenjaminSoelberg/ReflectivePELoader 。我不明白的是,当我们填写结构时loaderdata,我们将加载dll的程序中的函数地址传递到函数指针字段中:
typedef HMODULE(__stdcall* pLoadLibraryA)(LPCSTR);
typedef FARPROC(__stdcall* pGetProcAddress)(HMODULE, LPCSTR);
LoaderParams.fnLoadLibraryA = LoadLibraryA;
LoaderParams.fnGetProcAddress = GetProcAddress;
毕竟,这些函数的加载地址在我们的加载器和目标进程中并不总是相同的。库可以在不同的进程中加载到不同的地址。然而,这个加载器就像 x32 程序上的时钟一样工作。
UPD。我决定深入研究调试器,到目前为止,我比较的所有库确实具有相同的加载地址。x32 和 x64(但不是 x64 和 x32)。它们总是一样吗?据我所知,可以在任意地址加载 dll(但在允许的范围内)
