简单DLL注入
时间:2022-03-21
本文章向大家介绍简单DLL注入,主要包括简单DLL注入使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
简单的dll注入:DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。
dll注入的步骤:
- 附加目标进程
- 在目标进程中申请一个空间
- 把dll的路径写入到目标进程的内存空间
- 创建一个远程线程,让目标进程调用句柄
- 释放空间
注入dll的代码:
#include "stdlib.h" #include <tchar.h> #include <Windows.h> #include <direct.h> //注入dll函数的实现 bool Inject(DWORD dwId, //目标进程PID WCHAR *szPath)//DLL路径 { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,//获取进程权限 FALSE,//表示所得的进程是否可以被继承 dwId);//被打开进程的PID //执行成功分配内存单元的首地址,不成功就为NULL LPVOID pRemoteAddress = VirtualAllocEx(hProcess,//目标句柄 NULL,//保留页面的内存地址,一般NULL自动分配 1,//预分配的内存大小,字节单位 MEM_COMMIT,//为特定的页面区域分配内存中或磁盘的页面文件中的物理存储 PAGE_READWRITE);//区域可被应用程序读写 DWORD dwWriteSize = 0; WriteProcessMemory(hProcess,//OpenProcess返回来的句柄 pRemoteAddress, //准备写入的内存地址 szPath, wcslen(szPath)*2+2, //要写入的字节数 &dwWriteSize); //返回值,返回写入的字节 HANDLE hThread = CreateRemoteThread(hProcess, //该远程线程属进程的句柄 NULL, //一个指向SECURITY_ATTRIBUTES结构体的指针,该结构体指定线程的安全属性 0, //线程栈初始化大小,如果为0,那么使用系统默认的大小 (LPTHREAD_START_ROUTINE)LoadLibrary, //在远程进程地址空间中,该线程的起始位置 pRemoteAddress, //传给线程函数的参数(刚才在内存中写入的东西) NULL, //控制线程创建标志,NULL表示线程正在运行 NULL);//指向接收线程标识符的变量指针,如果为NULL,则不返回标识符 //返回线程句柄 WaitForSingleObject(hThread, -1);//当句柄所指定的线程有信号的时候,才会返回 VirtualFreeEx(hProcess,//目标进程句柄 pRemoteAddress,//只想要释放的空间 1, //虚拟内存空间的字节数 MEM_COMMIT);//MEM_COMMIT仅标示内存空间不可用 return 0; } int _tmain(int argc, _TCHAR *argv[]) { wchar_t szPath[] = L"D:\\myhack.dll"; //要注入的dll DWORD dwId = 0; HWND hCalc = FindWindow(NULL,L"QQ"); if(hCalc == NULL) { MessageBox(NULL,L"获取窗口句柄失败!",L"提示",MB_OK); } DWORD dwPid = 0; DWORD dwRub = GetWindowThreadProcessId(hCalc, &dwPid); if(dwPid == NULL) { MessageBox(NULL,L"获取目标进程pid失败!",L"提示",MB_OK); } Inject(dwPid, szPath); //注入dll函数 //system("pause"); return 0; }
基本dll编写代码:
#include <Windows.h> BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, //调用DllMain时赋值为DLL_PROCESS_ATTACH LPVOID lpReservd) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBoxA(NULL,"hello word!","你好呀!",MB_OK|MB_TOPMOST); break; } return TRUE; }
原文地址:https://www.cnblogs.com/flagby/p/16037156.html
- Python: 早点知道这些就不会这样了
- 第一个参数:initScans(job)
- Mysql 高可用 InnoDB Cluster 多节点搭建过程
- 用MapReduce分析Hbase将结果插入mysql中
- 敲敲级简单的鉴别H图片的小程序
- processArgs方法解读
- Python分布式微博爬虫(源码分享)
- NewInstallUserMapper.class阅读笔记
- TimeUtil类所有方法
- mapreduce项目调优
- zookeeper强制关机无法启动Unable to load database on disk具体解决步骤
- Python爬淘宝——300W淘宝文胸说明了什么
- 文本编码转换工具iconv 附批量转换文件编码命令
- 用23行代码爬取豆瓣音乐top250
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用new Function创建async方法
- Canvas系列(14):实战-小球碰撞
- IOC CreateBean
- Hugo搭建博客(二)— Hugo+Github Pages搭建博客
- 创建bean的实例
- Spring-IOC-默认标签的解析
- Spring-IoC -加载 Bean-总览
- Spring-IOC-创建Bean-属性填充
- vi与vim如何修改tab为4个空格方法示例
- Linux使用Crontab定时访问某个路由地址的方法
- jmeter 在linux服务器的安装和运行教程图解
- Linux中改变文件权限的chmod命令详析
- Ubuntu常用指令及用法详解
- Linux 系统使用私钥登录的教程详解
- Ubuntu如何轻松编译openJDK详解