DLL注入技术之REG注入

DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等。

    REG注入原理是利用在Windows 系统中,当REG以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个DLL文件路径中的DLL文件。当如果遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径。

  1. 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   关闭键值  

主要代码如下:

  1. //打开键值
  2. nReg = RegOpenKeyEx(
  3. HKEY_LOCAL_MACHINE,
  4. m_szRegPath,
  5. 0,
  6. KEY_ALL_ACCESS,
  7. &hKey);
  8. if(nReg != ERROR_SUCCESS)
  9. {
  10. return FALSE;
  11. }
  12. //查询键值
  13. DWORD dwReadType;
  14. DWORD dwReadCount;
  15. TCHAR szReadBuff[1000] = {0};
  16. nReg = RegQueryValueEx(hKey,
  17. _T("AppInit_DLLs"),
  18. NULL,
  19. &dwReadType,
  20. (BYTE*)&szReadBuff,
  21. &dwReadCount);
  22. if(nReg != ERROR_SUCCESS)
  23. {
  24. return FALSE;
  25. }
  26. //是否dll名称已经在内容中
  27. tstring strCmpBuff;
  28. strCmpBuff = szReadBuff;
  29. if (!strCmpBuff.find(InjectFilePath))
  30. {
  31. return FALSE;
  32. }
  33. //有字符串就加入空格
  34. if (0 != _tcscmp(szReadBuff,_T("")))
  35. {
  36. _tcscat_s(szReadBuff,_T(" "));
  37. }
  38. _tcscat_s(szReadBuff,InjectFilePath);
  39. //把dll路径设置到注册表中
  40. nReg = RegSetValueEx(hKey,
  41. _T("AppInit_DLLs"),
  42. 0,
  43. REG_SZ,
  44. (CONST BYTE*)szReadBuff,
  45. (_tcslen(szReadBuff)+1)*sizeof(TCHAR));

当我们完成了注册表的注入时,并不是希望所有程序都运行DLL里面的内容,这时我们就需要在DLL中过滤窗口名称,让指定窗口名称的EXE文件运行DLL里的线程。所需API如下表所示:

CreateThread
创建线程
Sleep
睡眠
EnumWindows
遍历窗口
GetWindowText
得到窗口名称
GetCurrentProcessId
得到当前进程ID
GetWindowThreadProcessId
由HWND获得进程ID

为了实现此功能,我们需要在注入的DLL中创建线程,并在线程中执行遍历窗口函数,我们需要先获取窗口名称,与我们想运行的EXE名称进行对比,并进行进程ID对比,因为不光只有一个EXE文件的运行实例,经过这些过滤后,我们就可以在指定的EXE文件中运行代码了。

主要代码如下:

  1. BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
  2. {
  3. TCHAR str[MAXBYTE] = {0};
  4. //得到窗口名称
  5. GetWindowText(hwnd,str,sizeof(str));
  6. //是否名称是计算器
  7. if(0 == _tcscmp(str,_T("计算器")))
  8. {
  9. //由于存在可能多个计算器,需要过滤线程ID
  10. //得到本身线程的ID
  11. DWORD dwCurrentProcessId = GetCurrentProcessId();
  12. DWORD dwFindCurrentProcessId = 0;
  13. //得到窗口线程ID
  14. GetWindowThreadProcessId(hwnd,&dwFindCurrentProcessId);
  15. //比较
  16. if (dwCurrentProcessId == dwFindCurrentProcessId)
  17. {
  18. *(PDWORD)lParam = 1;
  19. return FALSE;
  20. }
  21. }
  22. return TRUE;
  23. }
  24. DWORD ThreadProc(LPVOID lParam)
  25. {
  26. //等待1秒时间以便于让windows创建窗口
  27. Sleep(1000);
  28. DWORD dwFind = 0;
  29. //遍历窗口,过滤窗口名称
  30. EnumWindows(lpEnumFunc,(LPARAM)&dwFind);
  31. if (!dwFind) return 0;
  32. // 运行代码
  33. return 0;
  34. }
  35. BOOL InitInstance()
  36. {
  37. DWORD dwThreadId;
  38. m_hThread = ::CreateThread(NULL, NULL,
  39. (LPTHREAD_START_ROUTINE)ThreadProc,
  40. this, NULL,&dwThreadId);
  41. return TRUE;
  42. }

REG注入操作简单易懂,甚至不用写程序都可以完成注入操作,但是正是由于他的简单性,每个EXE都被注入,效率低,程序的扩展性差。

Dll注入技术之注册表注入的更多相关文章

  1. Dll注入技术之远程线程注入

    DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...

  2. 后门及持久化访问3----进程注入之AppInit_DLLs注册表项

    进程注入之AppInit_DLLs注册表项 User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL.只会影响加载了u ...

  3. DLL注入技术之依赖可信进程注入

    DLL注入技术之依赖可信进程注入 依赖可信进程注入原理是利用Windows 系统中Services.exe这个权限较高的进程,首先将a.dll远线程注入到Services.exe中,再利用a.dll将 ...

  4. Dll注入:注册表注入

    在系统中每一个进程加载User32.dll时,会受到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINE\Softwar ...

  5. 后门及持久化访问2----进程注入之AppCertDlls 注册表项

    代码及原理介绍 如果有进程使用了CreateProcess.CreateProcessAsUser.CreateProcessWithLoginW.CreateProcessWithTokenW或Wi ...

  6. 用javascript技术读取注册表中软件安装位置并启动本地软件

    1.首先读取注册表中本地软件安装的位置,如果未安装则无就跳转到下载页面. 2.启动软件,关闭页面. 3.如报错提示. <SCRIPT language=javascript>  <! ...

  7. Dll注入技术之消息钩子

    转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个 ...

  8. 第20章 DLL高级技术(3)

    20.4 函数转发器 (1)函数转发器原理(下图是利用Dependency Walker打开Kernel32.dll得到) ①图中CloseThreadpool*等4个函数转发到NTDLL中相应的函数 ...

  9. DLL注入之注册表

    0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...

随机推荐

  1. Android Studio奇淫巧技

    目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Act ...

  2. 【Codeforces Round #429 (Div. 2) C】Leha and Function

    [Link]:http://codeforces.com/contest/841/problem/C [Description] [Solution] 看到最大的和最小的对应,第二大的和第二小的对应. ...

  3. Oracle删除修改字段

    Oracle 增加修改删除字段 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],…. ...

  4. Android 读取<meta-data>元素的数据

    在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>.<application> .<servi ...

  5. (抓)ubuntu下安装mysql --- 我主要参考的文章

    转:http://cycnet.blog.51cto.com/117809/812625 现在的软件越来越好安装,尤其是在ubuntu下安装软件,更是没有技巧,只需要在联网的情况下使用apt-get ...

  6. STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时

    前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时. 查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义 ...

  7. 2017年上半年,一线城市豪宅TOP50成交均价排名

    辣眼睛!最新豪宅排行榜来了!释放重磅信号 东方财富网 2017-07-27 08:47 阅读:152 摘要:在中国,在买房这个问题上,不少工薪族都感到亚历山大.但是,在富豪眼里,犯难的是投资哪个房地产 ...

  8. 22、继续javascript,左边选中的跳到右边

    1. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title& ...

  9. PHP面试 PHP基础知识 九(面向对象)

    面向对象 PHP的类权限控制修饰符 public(公共的) . protected(受保护的).private(私有的) public :最高权限   可以在类的内部使用  可以在类的外部使用  可以 ...

  10. Java.util.ArrayDeque类

    java.util.ArrayDeque 类提供了可调整大小的阵列,并实现了Deque接口.以下是关于阵列双端队列的要点: 数组双端队列没有容量限制,使他们增长为必要支持使用. 它们不是线程安全的;如 ...