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 适 ...
随机推荐
- C判断语句
C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). C 语言把任何非零和非空的值假定为 true,把零或 null ...
- jdk环境配置-windows 10
近期由于云服务器到期,重新买了一个云服务器,这里顺便把jdk环境配置步骤做一个记录 1.下载自己需要的jdk 我这里是下的免安装版的 2.计算机(此电脑)->属性->高级系统设置-> ...
- PHP中关于Phar的学习
什么是phar 一个PHP程序往往是由多个文件组成的,如果能够集中为一个文件来分发和运行是很方便的.phar便应运而生.大概跟java的jar文件是差不多类似的.但是php的phar文件是可以由php ...
- SVG和canvas
1.SVG实现的圆环旋转效果 参考:http://www.softwhy.com/article-6472-1.html 2.SVG中的图形可以通过 transform="matrix(0 ...
- python re.findall 使用
python re.findall 使用 import re #\w 匹配字母数字及下划线 print(re.findall('\w','hello alan _god !@^&#^$^!*& ...
- LaTex 插入图像,以及应用表格
插入图像 参考:http://www.ctex.org/documents/latex/graphics/ 1: \includegraphics[width=20mm]{head.png} 应用表格 ...
- POJ3630-Phone List-Trie字典树模板题
Given a list of phone numbers, determine if it is consistent in the sense that no number is the pref ...
- DQL 数据查询语言 show
2.show show databases; 查看所有的库 show tables; 查看当前库的所有的表 show tables from database; 查看指定的库下的所有表 show pr ...
- yield迭代器的使用
class Program { static void Main(string[] args) { List<Student> students = new List<Student ...
- JDK8新特性之Optional
Optional是什么 java.util.Optional Jdk8提供Optional,一个可以包含null值的容器对象,可以用来代替xx != null的判断. Optional常用方法 of ...