[转]Dll注入经典方法完整版
Pnig0s1992:算是复习了,最经典的教科书式的Dll注入。
总结一下基本的注入过程,分注入和卸载
注入Dll:
1,OpenProcess获得要注入进程的句柄
2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1;
3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中。
4,CreateRemoteThread将LoadLibraryA作为线程函数,参数为Dll的名称,创建新线程
5,CloseHandle关闭线程句柄
卸载Dll:
1,CreateRemoteThread将GetModuleHandle注入到远程进程中,参数为被注入的Dll名
2,GetExitCodeThread将线程退出的退出码作为Dll模块的句柄值。
3,CloseHandle关闭线程句柄
3,CreateRemoteThread将FreeLibraryA注入到远程进程中,参数为第二步获得的句柄值。
4,WaitForSingleObject等待对象句柄返回
5,CloseHandle关闭线程及进程句柄。
- //Code By Pnig0s1992
- //Date:2012,3,13
- #include <stdio.h>
- #include <Windows.h>
- #include <TlHelp32.h>
- 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;
- }
[转]Dll注入经典方法完整版的更多相关文章
- Dll注入经典方法完整版
总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...
- c# TextBox只能输入数字的处理方法(完整版各种情况考虑在内,可根据需求灵活修改)
//选择文本框的事件窗口,找到按键输入的方法KeyPress,双击建立新的方法. /// <summary> /// textBox只能输入数字的处理方法 /// </summary ...
- DLL注入之注册表
0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...
- 常用经典SQL语句大全完整版--详解+实例 (存)
常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012 http://blog.sina.com.cn/s/blog_84 ...
- 常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》
常用经典SQL语句大全完整版--详解+实例 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML ...
- Asp.NET Core2.0 项目实战入门视频课程_完整版
END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...
- Java编程思想(第4版) 中文清晰PDF完整版
Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区 作者:Linux [字体:大 中 小] <Java编程思想>这本书赢得了全 ...
- .netcore consul实现服务注册与发现-集群完整版
原文:.netcore consul实现服务注册与发现-集群完整版 一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Clien ...
- sqlmap 注入的方法及技巧
sqlmap 注入的方法及技巧 当给 sqlmap 这么一个 url 的时候,它会: 1.判断可注入的参数 2.判断可以用那种 SQL 注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些 ...
随机推荐
- NGUI Atlas, Atlas Type Reference
在NGUI中,通过创建图集及引用图集,实际使用时指定引用图集而非具体图集本身,可以创建多语言,或高配低配版本资源包. NGUI Atlashttp://www.cnblogs.com/answerwi ...
- 向下滚动页面加载图片的js
js代码 scroll.photo.js : window.imgscroll = { options: { target: null, //插入图片的目标位置 img_list: null, //图 ...
- google应用商店的解决
{ "enabled_plugins": [ "SimpleReloadPlugin", "SimpleRefresh" ] } git c ...
- iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明
ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...
- 警惕USB键盘记录器
最近媒体报道了一种新型的能记录账号.密码输入的“USB键盘记录器”,引发网友关注,该设备看上去和普通U盘没什么区别,将其插入电脑USB接口,然后把键盘线和它连接,该设备就能够自动记录用户在电脑上输入的 ...
- sql float 转换为 nvarchar
INSERT INTO CC11 SELECT convert(nvarchar(30),convert(decimal(11,0),PCTID)),convert(nvarchar(30),conv ...
- 【转】MSM搭建(Memcached_Session_Manager)--解决集群session共享
一.环境 tomcat7三台,nginx(负载均衡),memcached(1.4.0) 需要的jar 二.memcached搭建 需要安装libevent 三.tomcat配置 在to ...
- android贪吃蛇(超级简陋版)
public class body { public int ax;//代表X周变量 public int ay;//代表Y轴变量 public int getAx() { return ax; } ...
- 如何在Eclipse中设置默认的JSP文件头部编码
如何在Eclipse中设置默认的JSP文件头部编码 一般,我们为了以后在导入和导出程序的时候(特别是项目较大,文件多)一般都默认文件编码格式为UTF-8 如果你通常都是通过Eclipse来编写程序,那 ...
- C++虚函数的实现机制示例
C++虚函数的实现机制是通过一个vtable表,指向子类的虚函数地址. 另外,如果不是虚函数,则不能实现用父类引用调用子类方法. #include <windows.h> #include ...