Dll注入技术之注册表注入
DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等。
REG注入原理是利用在Windows 系统中,当REG以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个DLL文件路径中的DLL文件。当如果遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径。
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
REG注入就好比在食堂(Windows 系统)发放给学生(EXE文件)饭菜(DLL文件)的过程中,食堂在将原有饭菜的基础上多发给一份紫菜鸡蛋汤(AppInit_DLL中的DLL文件),这个紫菜鸡蛋汤可以是英伟达的UI加速的DLL文件,也可以是是病毒文件的DLL,这就要看使用者是怎么利用这个特性了。
我们可以利用这个特性来进行DLL的注入,接下来需要解决的就是关于注册表操作的Windows API了,如下列表格所示:
| RegOpenKeyEx | 打开注册表键值 |
| RegQueryValueEx | 查询键值 |
| RegSetValueEx | 设置键值 |
| RegCloseKey | 关闭键值 |
主要代码如下:
- //打开键值
- nReg = RegOpenKeyEx(
- HKEY_LOCAL_MACHINE,
- m_szRegPath,
- 0,
- KEY_ALL_ACCESS,
- &hKey);
- if(nReg != ERROR_SUCCESS)
- {
- return FALSE;
- }
- //查询键值
- DWORD dwReadType;
- DWORD dwReadCount;
- TCHAR szReadBuff[1000] = {0};
- nReg = RegQueryValueEx(hKey,
- _T("AppInit_DLLs"),
- NULL,
- &dwReadType,
- (BYTE*)&szReadBuff,
- &dwReadCount);
- if(nReg != ERROR_SUCCESS)
- {
- return FALSE;
- }
- //是否dll名称已经在内容中
- tstring strCmpBuff;
- strCmpBuff = szReadBuff;
- if (!strCmpBuff.find(InjectFilePath))
- {
- return FALSE;
- }
- //有字符串就加入空格
- if (0 != _tcscmp(szReadBuff,_T("")))
- {
- _tcscat_s(szReadBuff,_T(" "));
- }
- _tcscat_s(szReadBuff,InjectFilePath);
- //把dll路径设置到注册表中
- nReg = RegSetValueEx(hKey,
- _T("AppInit_DLLs"),
- 0,
- REG_SZ,
- (CONST BYTE*)szReadBuff,
- (_tcslen(szReadBuff)+1)*sizeof(TCHAR));
当我们完成了注册表的注入时,并不是希望所有程序都运行DLL里面的内容,这时我们就需要在DLL中过滤窗口名称,让指定窗口名称的EXE文件运行DLL里的线程。所需API如下表所示:
|
CreateThread
|
创建线程
|
|
Sleep
|
睡眠
|
|
EnumWindows
|
遍历窗口
|
|
GetWindowText
|
得到窗口名称
|
|
GetCurrentProcessId
|
得到当前进程ID
|
|
GetWindowThreadProcessId
|
由HWND获得进程ID
|
为了实现此功能,我们需要在注入的DLL中创建线程,并在线程中执行遍历窗口函数,我们需要先获取窗口名称,与我们想运行的EXE名称进行对比,并进行进程ID对比,因为不光只有一个EXE文件的运行实例,经过这些过滤后,我们就可以在指定的EXE文件中运行代码了。
主要代码如下:
- BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
- {
- TCHAR str[MAXBYTE] = {0};
- //得到窗口名称
- GetWindowText(hwnd,str,sizeof(str));
- //是否名称是计算器
- if(0 == _tcscmp(str,_T("计算器")))
- {
- //由于存在可能多个计算器,需要过滤线程ID
- //得到本身线程的ID
- DWORD dwCurrentProcessId = GetCurrentProcessId();
- DWORD dwFindCurrentProcessId = 0;
- //得到窗口线程ID
- GetWindowThreadProcessId(hwnd,&dwFindCurrentProcessId);
- //比较
- if (dwCurrentProcessId == dwFindCurrentProcessId)
- {
- *(PDWORD)lParam = 1;
- return FALSE;
- }
- }
- return TRUE;
- }
- DWORD ThreadProc(LPVOID lParam)
- {
- //等待1秒时间以便于让windows创建窗口
- Sleep(1000);
- DWORD dwFind = 0;
- //遍历窗口,过滤窗口名称
- EnumWindows(lpEnumFunc,(LPARAM)&dwFind);
- if (!dwFind) return 0;
- // 运行代码
- return 0;
- }
- BOOL InitInstance()
- {
- DWORD dwThreadId;
- m_hThread = ::CreateThread(NULL, NULL,
- (LPTHREAD_START_ROUTINE)ThreadProc,
- this, NULL,&dwThreadId);
- return TRUE;
- }
REG注入操作简单易懂,甚至不用写程序都可以完成注入操作,但是正是由于他的简单性,每个EXE都被注入,效率低,程序的扩展性差。
Dll注入技术之注册表注入的更多相关文章
- Dll注入技术之远程线程注入
DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...
- 后门及持久化访问3----进程注入之AppInit_DLLs注册表项
进程注入之AppInit_DLLs注册表项 User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL.只会影响加载了u ...
- DLL注入技术之依赖可信进程注入
DLL注入技术之依赖可信进程注入 依赖可信进程注入原理是利用Windows 系统中Services.exe这个权限较高的进程,首先将a.dll远线程注入到Services.exe中,再利用a.dll将 ...
- Dll注入:注册表注入
在系统中每一个进程加载User32.dll时,会受到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINE\Softwar ...
- 后门及持久化访问2----进程注入之AppCertDlls 注册表项
代码及原理介绍 如果有进程使用了CreateProcess.CreateProcessAsUser.CreateProcessWithLoginW.CreateProcessWithTokenW或Wi ...
- 用javascript技术读取注册表中软件安装位置并启动本地软件
1.首先读取注册表中本地软件安装的位置,如果未安装则无就跳转到下载页面. 2.启动软件,关闭页面. 3.如报错提示. <SCRIPT language=javascript> <! ...
- Dll注入技术之消息钩子
转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个 ...
- 第20章 DLL高级技术(3)
20.4 函数转发器 (1)函数转发器原理(下图是利用Dependency Walker打开Kernel32.dll得到) ①图中CloseThreadpool*等4个函数转发到NTDLL中相应的函数 ...
- DLL注入之注册表
0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...
随机推荐
- HTML5的新增功能有哪些?
HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. 新的功能: 1.用于绘画的 canvas 元素 2.用于媒介回放的 video 和 audio 元素 3.对本地离线存储的 ...
- css3布局篇(双飞翼)
大家看到好多电商网站都见过经典三列布局,它也叫做圣杯布局 ,是Kevin Cornell在2006年提出的一个布局模型概念,这个在国内最早是由淘宝UED的工程师传播开来,在中国也有叫法是双飞翼布局,它 ...
- delphi 文件夹操作(监控)
delphi 监控文件系统 delphi 监控文件系统 你是否想为你的Windows加上一双眼睛,察看使用者在机器上所做的各种操作(例如建立.删除文件:改变文件或目录名字)呢? 这里介绍一种利用Win ...
- ionic学习使用笔记(一) 版本更新及创建项目时遇到的问题解决
最近开始用ionic开发项目,虽然去年的时候用ionic 2.0 开发过公司的项目,不过现在的ionic已经升级到了ionic framework 3.0 了.而且还有个 ionic-cli . 使用 ...
- 训练集(train set) 验证集(validation set) 测试集(test set)。
训练集(train set) 验证集(validation set) 测试集(test set). http://blog.sina.com.cn/s/blog_4d2f6cf201000cjx.ht ...
- ASP.NET Core学习——2
Application Startup ASP.NET Core为应用程序提供了处理每个请求的完整控制.Startup类是应用程程的入口(entry point),这个类可以设置配置(configur ...
- 关于swiper动态更改,无法更新的悖论
关于swiper动态更改,无法更新的悖论 以前都觉得swiper的使用很简单,那是因为使用swiper时都是写的数据,按照官网上介绍直接初始化swiper,随便丢一个地方初始化就ok了,但是在很多需求 ...
- Django+paramiko实现webshell
说明 基于 python3.7 + django 2.2.3 实现的 django-webshell,支持颜色显示,支持 tab 命令补全,项目地址:https://github.com/leffss ...
- IIS身份验证和文件操作权限(二、匿名身份验证)
一.配置匿名身份验证 二.浏览站点 -- 操作文件 ①无操作权限 点击写入 ②有操作权限(IIS_IUSRS.Authenticated Users两个任选一个) 点击写入
- java中的javap命令(工作中补充的知识)
背景: 上周针对某信得压力测试demo进行场景复现,但是只提供了class文件,只能通过反编译的软件进行查看,在复现的过程中报错某某某行,这里我以xx行代替,因为是class文件,所以并不能确定具体到 ...