您的位置:首页 > 其它

[Win32] DLL注入技术

2015-08-19 16:46 381 查看
本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:/article/9672540.html

DLL注入是什么?DLL注入是把指定的DLL加载到另一个进程的内存空间中去的技术。

为何要注入DLL?完成一些特殊目的,病毒把恶意代码隐藏在正常的宿主进程中,瞒天过海。或者偷窥密码edit的内容(因为利用Windows消息机制获取不了密码框的内容),或者Hook API拦截对API的调用(比如进程保护不让自己被结束;还有杀软也可以通过这个拦截程序调用API干坏事,充分体现了杀软和病毒是同一种东西)等等。

=================================================

DLL注入技术有很多种,我知道的有:

1。通过远程线程注入(CreateRemoteThread)

2。通过全局消息钩子注入(SetWindowsHookEx)

3。通过注册表注入

4。通过输入法注入

5。驱动注入

6。在启动进程时挂起直接挂起主线程,写入指令后再恢复线程(难度较大)

7。DLL劫持(严格意义上这个不是注入方法)

8。修改PE文件导入表

还有百度到的:

9。使用NtMapViewOfSection注入

10。使用SetThreadContext注入

=================================================

这里主要说一下第一种方法

1。用OpenProcess打开要注入进程的句柄。

2。用VirtualAllocEx在远程进程中申请一段内存,长度为DLL路径长度+1(多出来的一字节用于存放\0)。

3。用WriteProcessMemory将Dll的路径远程写入申请的内存中。

4。用CreateRemoteThread将LoadLibraryA作为线程启动函数,参数为DLL的路径,远程创建线程。

5。用CloseHandle关闭线程句柄。

6。会调用DllMain函数,在这个函数里完成你要做的事,比如偷窥密码edit的内容,或者Hook API了等等

源代码如下:

(注意最好加上Debug权限:/article/9672537.html

BOOL InjectDll(DWORD dwProcessID, char* dllPath){//参数:目标进程ID、DLL路径
FARPROC FuncAddr = NULL;
HMODULE hdll = LoadLibrary(TEXT("Kernel32.dll"));//加载DLL
if (hdll != NULL){
FuncAddr = GetProcAddress(hdll, "LoadLibraryA");//获取LoadLibraryA函数地址
if (FuncAddr == NULL)return FALSE;
}

HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION, FALSE, dwProcessID);//获取进程句柄
if (hProcess == NULL)return FALSE;
DWORD dwSize = strlen(dllPath) + 1;
LPVOID RemoteBuf = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);//远程申请内存
DWORD dwRealSize;
if (WriteProcessMemory(hProcess, RemoteBuf, dllPath, dwSize, &dwRealSize))//远程写内存
{
DWORD dwThreadId;
HANDLE hRemoteThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)FuncAddr, RemoteBuf, 0, &dwThreadId);//创建远程线程
if (hRemoteThread == NULL)
{
VirtualFreeEx(hProcess, RemoteBuf, dwSize, MEM_COMMIT);
CloseHandle(hProcess);
return FALSE;
}
//释放资源
WaitForSingleObject(hRemoteThread, INFINITE);
CloseHandle(hRemoteThread);
VirtualFreeEx(hProcess, RemoteBuf, dwSize, MEM_COMMIT);
CloseHandle(hProcess);
return TRUE;
}
else
{
VirtualFreeEx(hProcess, RemoteBuf, dwSize, MEM_COMMIT);
CloseHandle(hProcess);
return FALSE;
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: