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 适 ...
随机推荐
- Delphi中的线程类(转)
Delphi中的线程类 (转) Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对 TThread类的几个成员作一简单介绍,再说明一下 ...
- PHP ftp_nlist() 函数
「大理石平台维修」大理石平台维修完后需要怎么处理? 定义和用法 ftp_nlist() 函数返回 FTP 服务器上指定目录的文件列表. 如果成功,则返回指定目录下的文件名组成的数组.如果失败,则返回 ...
- C++11下的关键字
STL类:stack,queue,deque,priority_queue,map,set,multiset,bitset,vector 函数类:min,max,swap,sqrt,log,rever ...
- AcWing 199. 余数之和 (除法分块)打卡
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值. 例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod ...
- 在Windows Server2016中安装SQL Server2016(转)
在Windows Server2016中安装SQL Server2016(转) 转自: http://blog.csdn.net/yenange/article/details/52980135 参考 ...
- Golang(Go语言)内置函数之copy用法
该函数主要是切片(slice)的拷贝,不支持数组 将第二个slice里的元素拷贝到第一个slice里,拷贝的长度为两个slice中长度较小的长度值 示例: s := []int{1,2,3} fmt. ...
- 如何在一个for语句中迭代多个对象(2.7)
如何在一个for语句中迭代多个对象 总结: 并行迭代使用zip(l1, l2, l3) 每次迭代从3个列表里各取一个数据 串行迭代使用itertools.chain(l1, l2, l3) 相当于把3 ...
- 2016 ICPC Mid-Central USA Region J. Windy Path (贪心)
比赛链接:2016 ICPC Mid-Central USA Region 题目链接:Windy Path Description Consider following along the path ...
- Java 中 Properties 类的操作
一.Java Properties类 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置 ...
- 常用css3属性的ie兼容查看
记录一下关于css3的各种常用属性对ie各版本浏览器的兼容程度: 最低可兼容ie7 最低可兼容ie8 最低可兼容ie9 最低可兼容ie10 position:fixed clip E:first-le ...