0

loadlibrary()DLL をユーザー定義メモリ アドレスにロードする方法、または関数を使用して 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"));
4

1 に答える 1

0

DLL をユーザー定義のアドレスにロードする必要があると考える理由はありません。標準的な Windows プログラミング プラクティスに従って、DLL が特定のアドレスに読み込まれることに依存するべきではありません。

実行時に DLL から何かにアクセスする必要がある場合は、相対オフセットを使用します。実行時にCreateToolhelp32Snapshot()を使用してモジュールのアドレスを取得し、相対オフセットを追加して、必要なものの動的アドレスを取得できます。関数をエクスポートし、GetProcAddress() を使用して関数のアドレスを取得することもできます。これらの方法はどちらも ASLR が有効な状態で機能し、適切な方法です。

于 2020-02-01T17:39:54.677 に答える