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 适 ...
随机推荐
- Android Studio奇淫巧技
目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Act ...
- 【Codeforces Round #429 (Div. 2) C】Leha and Function
[Link]:http://codeforces.com/contest/841/problem/C [Description] [Solution] 看到最大的和最小的对应,第二大的和第二小的对应. ...
- Oracle删除修改字段
Oracle 增加修改删除字段 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],…. ...
- Android 读取<meta-data>元素的数据
在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>.<application> .<servi ...
- (抓)ubuntu下安装mysql --- 我主要参考的文章
转:http://cycnet.blog.51cto.com/117809/812625 现在的软件越来越好安装,尤其是在ubuntu下安装软件,更是没有技巧,只需要在联网的情况下使用apt-get ...
- STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时
前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时. 查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义 ...
- 2017年上半年,一线城市豪宅TOP50成交均价排名
辣眼睛!最新豪宅排行榜来了!释放重磅信号 东方财富网 2017-07-27 08:47 阅读:152 摘要:在中国,在买房这个问题上,不少工薪族都感到亚历山大.但是,在富豪眼里,犯难的是投资哪个房地产 ...
- 22、继续javascript,左边选中的跳到右边
1. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title& ...
- PHP面试 PHP基础知识 九(面向对象)
面向对象 PHP的类权限控制修饰符 public(公共的) . protected(受保护的).private(私有的) public :最高权限 可以在类的内部使用 可以在类的外部使用 可以 ...
- Java.util.ArrayDeque类
java.util.ArrayDeque 类提供了可调整大小的阵列,并实现了Deque接口.以下是关于阵列双端队列的要点: 数组双端队列没有容量限制,使他们增长为必要支持使用. 它们不是线程安全的;如 ...