博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dll注入经典方法完整版
阅读量:4546 次
发布时间:2019-06-08

本文共 3079 字,大约阅读时间需要 10 分钟。

总结一下基本的注入过程,分注入和卸载

注入Dll:

1,获得要注入进程的

2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1;

3,将Dll的名字写入第二步开辟出的内存中。

4,将LoadLibraryA作为线程函数,参数为Dll的名称,创建新线程

5,关闭线程句柄

卸载Dll:

1,CreateRemoteThread将注入到远程进程中,参数为被注入的Dll名

2,将线程退出的退出码作为Dll模块的句柄值。

3,CloseHandle关闭线程句柄

3,CreateRemoteThread将FreeLibraryA注入到远程进程中,参数为第二步获得的句柄值。

4,等待对象句柄返回

5,CloseHandle关闭线程及进程句柄。

 

//Code By Pnig0s1992 //Date:2012,3,13 #include 
#include
#include
DWORD getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID { DWORD dwRet = 0; HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hSnapShot == INVALID_HANDLE_VALUE) { printf("\n获得进程快照失败%d",GetLastError()); return dwRet; } PROCESSENTRY32 pe32;//声明进程入口对象 pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 Process32First(hSnapShot,&pe32);//遍历进程列表 do { if(!lstrcmp(pe32.szExeFile,lpProcessName))//查找指定进程名的PID { dwRet = pe32.th32ProcessID; break; } } while (Process32Next(hSnapShot,&pe32)); CloseHandle(hSnapShot); return dwRet;//返回 } INT main(INT argc,CHAR * argv[]) { DWORD dwPid = getProcessHandle((LPCTSTR)argv[1]); LPCSTR lpDllName = "EvilDll.dll"; HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwPid); if(hProcess == NULL) { printf("\n获取进程句柄错误%d",GetLastError()); return -1; } DWORD dwSize = strlen(lpDllName)+1; DWORD dwHasWrite; LPVOID lpRemoteBuf = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE); if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllName,dwSize,&dwHasWrite)) { if(dwHasWrite != dwSize) { VirtualFreeEx(hProcess,lpRemoteBuf,dwSize,MEM_COMMIT); CloseHandle(hProcess); return -1; } }else { printf("\n写入远程进程内存空间出错%d。",GetLastError()); CloseHandle(hProcess); return -1; } DWORD dwNewThreadId; LPVOID lpLoadDll = LoadLibraryA; HANDLE hNewRemoteThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,0,&dwNewThreadId); if(hNewRemoteThread == NULL) { printf("\n建立远程线程失败%d",GetLastError()); CloseHandle(hProcess); return -1; } WaitForSingleObject(hNewRemoteThread,INFINITE); CloseHandle(hNewRemoteThread); //准备卸载之前注入的Dll DWORD dwHandle,dwID; LPVOID pFunc = GetModuleHandleA;//获得在远程线程中被注入的Dll的句柄 HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpRemoteBuf,0,&dwID); WaitForSingleObject(hThread,INFINITE); GetExitCodeThread(hThread,&dwHandle);//线程的结束码即为Dll模块儿的句柄 CloseHandle(hThread); pFunc = FreeLibrary; hThread = CreateRemoteThread(hThread,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,0,&dwID); //将FreeLibraryA注入到远程线程中去卸载Dll WaitForSingleObject(hThread,INFINITE); CloseHandle(hThread); CloseHandle(hProcess); return 0; }

转载于:https://www.cnblogs.com/MaxWoods/p/3889584.html

你可能感兴趣的文章
svn是什么
查看>>
队列2--集合
查看>>
Docker数据管理
查看>>
二分法猜数字
查看>>
第一百三十五节,JavaScript,封装库--拖拽
查看>>
有两种分别用<bgsound>和<embed></embed>标签,当用<embed>插入背景音乐时可以设置宽度和高度为0,隐藏播放器。...
查看>>
JavaI/O(输入/输出)
查看>>
电文保密
查看>>
dhcpd已分配动态分配地址管理工具DHCPd Tools
查看>>
mysql,命令导入\导出表结构或数据
查看>>
easyui datagrid的API
查看>>
linux 上修改了nginx.conf 怎么重新加载配置文件生效
查看>>
比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
查看>>
哪里有好用的电脑pdf编辑器免费版
查看>>
开发简单的Kafka应用
查看>>
PL/0 词法分析
查看>>
Eclipse配置--智能补全
查看>>
MySQL查看索引、表信息、触发器
查看>>
ThreadLocal
查看>>
mysql 根据一张表更新另一张表
查看>>