如何将DLL加载到用户定义的内存地址中,或者使用loadlibrary()函数加载DLL之后是否可以更改DLL地址。
我尝试使用VirtualAllocEx()分配内存地址并将DLL加载到远程进程。 DLL正在加载到远程进程中,但地址不同。
//virtually allocating the memory address
DWORD *arg = (PDWORD)VirtualAllocEx(process, /*(LPVOID)0x81200000*/0, strlen(buffer), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
if(arg == NULL) {
return 1;
}
//Write the argument to LoadLibraryA to the process's newly allocated memory region.
int n = WriteProcessMemory(process, arg, buffer, strlen(buffer), NULL);
if(n == 0) {
return 1;
}
//Inject our DLL into the process's address space.
HANDLE threadID = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)address, arg, NULL, NULL);
我也尝试过使用rebaseimage()函数,但是在加载DLL之后更改了内存地址。
//rebaseimage function to change the base address of the DLL
ret = ReBaseImage("WinMemoryDLL.dll","",TRUE,TRUE,FALSE,0,&OldImage,&OldImageBase,&NewImageSize,&NewImageBase,0);
hinstLib = LoadLibrary(TEXT("WinMemoryDLL.dll"));
答案 0 :(得分:0)
我没有理由认为需要将DLL加载到用户定义的地址中。根据标准的Windows编程习惯,您永远不要依赖将DLL加载到特定地址中。
如果您需要在运行时从DLL中访问某些内容,请使用相对偏移量。您可以在运行时使用CreateToolhelp32Snapshot()来获取模块的地址,然后添加相对偏移量来获取所需的动态地址。您也可以导出一个函数,然后使用GetProcAddress()获取该函数的地址。这两种方法都启用了ASLR,这是正确的方法。