我正在阅读关于DLL注入技术的内容,我记住了这个问题.
让我们假设我们想要将一个DLL注入Windows 7中的目标进程,该进程为kernel32.dll启用了ASLR
因此,任何一段注入的代码都不能使用任何winapi或任何系统调用,因为地址让我们说在注入器代码中的loadLibrary函数将与目标进程中的地址loadLibrary不同,不是吗?
所以这样的召唤CreateRemoteThread不起作用:
CreateRemoteThread(hProcess,
NULL,
0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,
"LoadLibraryA" ),
pLibRemote,
0,
NULL );
::WaitForSingleObject( hThread, INFINITE );
Run Code Online (Sandbox Code Playgroud)
如果我在这个推理中错了,请纠正我.
我正在尝试加载.dll文件,并在加载时显示一个消息框.根据我的理解,一旦.dll加载,它就会调用dllmain()并切换到该DLL_PROCESS_ATTACH选项.我已经编写了加载它的代码.dll和代码.exe.在.exe能够正确加载并打印出该DLL已加载的地址,但我没有看到正在显示一个消息框.我在Microsoft.com上的某个地方读到,dll在加载时进入"锁定",以防止出于安全目的而执行某些功能或代码.此功能是否阻止显示消息框?是否存在诸如提升权限,系统等的工作......?我不确定DEP是否有任何影响,我将其设置为仅保护关键的Windows进程.
调用过程:
#include <iostream>
#include <windows.h>
int main()
{
HMODULE hDll = LoadLibraryA("dll.dll");
if (hDll == NULL)
std::cerr << "Unable to load dll";
else
std::cout << "Dll loaded @ " << hDll;
FreeLibrary(hDll);
}
Run Code Online (Sandbox Code Playgroud)
dll文件:
#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL, "Dll has been loaded.", "Loaded", MB_OK);
break;
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
我认为如果我有办法运行.dll调试器并查看 …