[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)
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; } }
相关文章推荐
- Redis集群进阶-移除节点
- 多校第九场Arithmetic Sequence题解
- HDU 5402 Travelling Salesman Problem
- 2015年最新Scala语言视频教程
- 二维几何模板 - 二维几何基础
- Mac OS下安装Brew
- HDU 1405 第六周 J题
- C#中yield return用法分析
- 修复系统时,鼠标键盘不能使用
- Objective-C 学习笔记 5 循环结构
- Win10正式版如何把小娜搜索换成谷歌搜索?
- 单向链表逆转
- update与case when的结合使用
- HOG特征经典分析汇总
- HDU-1102 Constructing Roads(最小生成树[Prim])
- Linux下fork()、vfork()、clone()和exec()的区别
- Android adb命令启动系统组件
- 【原】一句话说明Class.forName(xxx.xxx...)是干什么的
- 二维线段树(单点更新)
- Excel 用row()函数 在Excel中自动添加序号,