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关闭线程及进程句柄。

  1. //Code By Pnig0s1992
  2. //Date:2012,3,13
  3. #include <stdio.h>
  4. #include <Windows.h>
  5. #include <TlHelp32.h>
  6. DWORD getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID
  7. {
  8. DWORD dwRet = 0;
  9. HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  10. if(hSnapShot == INVALID_HANDLE_VALUE)
  11. {
  12. printf("\n获得进程快照失败%d",GetLastError());
  13. return dwRet;
  14. }
  15. PROCESSENTRY32 pe32;//声明进程入口对象
  16. pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小
  17. Process32First(hSnapShot,&pe32);//遍历进程列表
  18. do
  19. {
  20. if(!lstrcmp(pe32.szExeFile,lpProcessName))//查找指定进程名的PID
  21. {
  22. dwRet = pe32.th32ProcessID;
  23. break;
  24. }
  25. } while (Process32Next(hSnapShot,&pe32));
  26. CloseHandle(hSnapShot);
  27. return dwRet;//返回
  28. }
  29. INT main(INT argc,CHAR * argv[])
  30. {
  31. DWORD dwPid = getProcessHandle((LPCTSTR)argv[1]);
  32. LPCSTR lpDllName = "EvilDll.dll";
  33. HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwPid);
  34. if(hProcess == NULL)
  35. {
  36. printf("\n获取进程句柄错误%d",GetLastError());
  37. return -1;
  38. }
  39. DWORD dwSize = strlen(lpDllName)+1;
  40. DWORD dwHasWrite;
  41. LPVOID lpRemoteBuf = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE);
  42. if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllName,dwSize,&dwHasWrite))
  43. {
  44. if(dwHasWrite != dwSize)
  45. {
  46. VirtualFreeEx(hProcess,lpRemoteBuf,dwSize,MEM_COMMIT);
  47. CloseHandle(hProcess);
  48. return -1;
  49. }
  50. }else
  51. {
  52. printf("\n写入远程进程内存空间出错%d。",GetLastError());
  53. CloseHandle(hProcess);
  54. return -1;
  55. }
  56. DWORD dwNewThreadId;
  57. LPVOID lpLoadDll = LoadLibraryA;
  58. HANDLE hNewRemoteThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,0,&dwNewThreadId);
  59. if(hNewRemoteThread == NULL)
  60. {
  61. printf("\n建立远程线程失败%d",GetLastError());
  62. CloseHandle(hProcess);
  63. return -1;
  64. }
  65. WaitForSingleObject(hNewRemoteThread,INFINITE);
  66. CloseHandle(hNewRemoteThread);
  67. //准备卸载之前注入的Dll
  68. DWORD dwHandle,dwID;
  69. LPVOID pFunc = GetModuleHandleA;//获得在远程线程中被注入的Dll的句柄
  70. HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpRemoteBuf,0,&dwID);
  71. WaitForSingleObject(hThread,INFINITE);
  72. GetExitCodeThread(hThread,&dwHandle);//线程的结束码即为Dll模块儿的句柄
  73. CloseHandle(hThread);
  74. pFunc = FreeLibrary;
  75. hThread = CreateRemoteThread(hThread,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,0,&dwID); //将FreeLibraryA注入到远程线程中去卸载Dll
  76. WaitForSingleObject(hThread,INFINITE);
  77. CloseHandle(hThread);
  78. CloseHandle(hProcess);
  79. return 0;
  80. }

[转]Dll注入经典方法完整版的更多相关文章

  1. Dll注入经典方法完整版

    总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...

  2. c# TextBox只能输入数字的处理方法(完整版各种情况考虑在内,可根据需求灵活修改)

    //选择文本框的事件窗口,找到按键输入的方法KeyPress,双击建立新的方法. /// <summary> /// textBox只能输入数字的处理方法 /// </summary ...

  3. DLL注入之注册表

    0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...

  4. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

  5. 常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》

    常用经典SQL语句大全完整版--详解+实例 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML ...

  6. Asp.NET Core2.0 项目实战入门视频课程_完整版

    END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...

  7. Java编程思想(第4版) 中文清晰PDF完整版

    Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区  作者:Linux [字体:大 中 小]     <Java编程思想>这本书赢得了全 ...

  8. .netcore consul实现服务注册与发现-集群完整版

    原文:.netcore consul实现服务注册与发现-集群完整版 一.Consul的集群介绍    Consul Agent有两种运行模式:Server和Client.这里的Server和Clien ...

  9. sqlmap 注入的方法及技巧

    sqlmap 注入的方法及技巧 当给 sqlmap 这么一个 url 的时候,它会: 1.判断可注入的参数 2.判断可以用那种 SQL 注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些 ...

随机推荐

  1. PCA理论与实践

    PCA作用: 降维,PCA试图在力保数据信息丢失最少的原则下,用较少的综合变量代替原本较多的变量,而且综合变量间互不相关,减少冗余以及尽量消除噪声.   PCA数学原理: 设 是维向量 想经过线性变换 ...

  2. jQuery轮播

    一,简单实现轮播  //轮播容器 .carousel   //轮播容器--可设宽度      (carousel="轮播") //轮播指标 .carousel-indicators ...

  3. ThreadLocal工作原理

    原文出处: imzoer 在这篇文章中,总结了一下面试过程中遇到的关于ThreadLocal的内容.总体上说,这样回答,面试算是过得去了.但是,这样的回答,明显仅仅是背会了答案,而没有去研究Threa ...

  4. GDI+一般性错误(A generic error occurred in GDI+)

    1.GDI+的前世今生 GDI+全称图形设备接口,Graphics Device Interface (GDI) ,他的爸爸叫做GDI, 用C写的.Windows XP出来以后用C++重新写了一下,变 ...

  5. 三层交换单臂路由vlan间通信综合实验之降龙要点[转]

    单臂路由三层交换机提供vlan间的通信之菜鸟之降龙详解要点: 图示 PC:左到右依次设置IP172.16.10.1,    20.1,  30.1,   40,1  ,50,1  /24 网关10.2 ...

  6. web相关概念

    1.web概念:web1.0:静态页面为主(传统企业的页面)特点:由网站提供方来更新和维护内容web2.0:以动态页面为主,以用户为中心,网站由用户参与或编辑web3.0:智能化人与人与机器的交流(各 ...

  7. solr windows 启动和关闭命令

    进入bin目录执行  启动:solr -e dih 停止:solr stop -all D:\Solr\solr-5.2.1\solr-5.2.1\bin>solr -e dih

  8. 跨域资源共享 CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  9. 【转】搭建nginx+tomcat+Java的负载均衡环境

    一.简介: Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱.虽然Tomcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很 ...

  10. webshell

    webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下 ...