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. CMD规范(通用模块定义规范)(翻译)

    最近在使用sea.js.大家知道sea.js遵循CMD规范.该规范的英文说明很简洁,我试着翻译了一下,旨在交流. Common Module Definition 通用模块定义规范 This spec ...

  2. MCU厂家

    新唐(nuvoton):http://www.nuvoton.com/义隆(emc):http://www.emc.com.tw/chs/遠翔(feeling):http://www.feeling- ...

  3. iOS_autoLayout_Masonry

        概述     Masonry是一个轻量级的布局框架与更好的包装AutoLayout语法.   Masonry有它自己的布局方式,描述NSLayoutConstraints使布局代码更简洁易读. ...

  4. iOS开发拓展篇—音频处理(音乐播放器6)

    iOS开发拓展篇—音频处理(音乐播放器6) 一.图片处理 说明: Aspect表示按照原来的宽高比进行缩放. Aspectfit表示按照原来的宽高比缩放,要求看到全部图片,后果是不能完全覆盖窗口,会留 ...

  5. IOS基础库

    iOS 开发者中心                                             https://developer.apple.com/devcenter/ios/inde ...

  6. .htaccess应该放在哪里?

    根据 Apache 官方的介绍,.htaccess 文件属于分布式配置文件,可以放置在网站 www 根目录的所有子目录.以及 www 根目录的上一级目录中,生效的路径总是当前目录及其所有子目录(可在文 ...

  7. TreeSet和Comparator 对TreeSet排序

    使用TreeSet和Comparator,编写TreeSetTestInner类,要求对TreeSet中的元素"HashSet"."ArrayList".&qu ...

  8. socket协议下如何缓存图片--推荐EGOCache

    EGOCache是一个轻量级的缓存框架.用法简单方便,在现在的项目中,我就用到EGOCache来缓存下载过的照片和字符串. 有人可能会问到,缓存照片还需要用EGOCache吗?AFNetworking ...

  9. [深入Python]sys.modules

    Python中所有加载到内存的模块都放在sys.modules.当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Loc ...

  10. mysql alter 语句用法,添加、修改、删除字段等

    2013-05-03 17:13 39459人阅读 评论(1) 收藏 举报  分类: Mysql(9)  修改表名: ALTER  TABLE admin_user RENAME TO a_use / ...