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. MySQL默认数据库

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  2. Django1.9开发博客(8)- 继续完善

    到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了. 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现. 草稿箱 之前我们新建文章的 ...

  3. js面向对象选项卡

    window.onload=function() //面向对象 { var tab=new tabSwitch("div1"); var tab=new tabSwitch(&qu ...

  4. Octopus系列之各个页面调用示例

    调用首页产品 可选参数如下 New = 1, Hot = 2, Best = 3, Special = 4, Featured = 5, Other = 6 #foreach($item in $oc ...

  5. PHP 缓存扩展opcache

    opcache (全程 zend opcache): 从php5.5开始,默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就可以编译opcache了,只是要启用 ...

  6. Java中的HashSet和TreeSet

    1:Set集合(理解) (1)Set集合的特点 无序,唯一 (2)HashSet集合(掌握) A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法:hashCode()和eq ...

  7. HDFS中Java的API使用测试

    import java.io.IOException; import java.util.Arrays; import java.util.Date; import java.util.Scanner ...

  8. Android常见控件— — —EditText

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  9. git merge 和 rebase 区别

    git pull  超级不推荐使用git pull 有坑,谨慎使用,pull底层是merge git pull 是 git fetch + git merge FETCH_HEAD 的缩写.所以,默认 ...

  10. GT 940M 到底怎么样! 768的可以 1080的不要用了

    而对于目前的市场来看,NVIDIA独显无疑是占据了产品端的绝对主力,9系列独显也已经全面上市,但除了大家熟悉的GTX级之外,入门级的更新也同样对入门级玩家有着至关重要的意义,其中最具代表性的莫过于今天 ...