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. Delphi中的线程类(转)

    Delphi中的线程类 (转) Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对 TThread类的几个成员作一简单介绍,再说明一下 ...

  2. PHP ftp_nlist() 函数

    「大理石平台维修」大理石平台维修完后需要怎么处理? 定义和用法 ftp_nlist() 函数返回 FTP 服务器上指定目录的文件列表. 如果成功,则返回指定目录下的文件名组成的数组.如果失败,则返回 ...

  3. C++11下的关键字

    STL类:stack,queue,deque,priority_queue,map,set,multiset,bitset,vector 函数类:min,max,swap,sqrt,log,rever ...

  4. 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 ...

  5. 在Windows Server2016中安装SQL Server2016(转)

    在Windows Server2016中安装SQL Server2016(转) 转自: http://blog.csdn.net/yenange/article/details/52980135 参考 ...

  6. Golang(Go语言)内置函数之copy用法

    该函数主要是切片(slice)的拷贝,不支持数组 将第二个slice里的元素拷贝到第一个slice里,拷贝的长度为两个slice中长度较小的长度值 示例: s := []int{1,2,3} fmt. ...

  7. 如何在一个for语句中迭代多个对象(2.7)

    如何在一个for语句中迭代多个对象 总结: 并行迭代使用zip(l1, l2, l3) 每次迭代从3个列表里各取一个数据 串行迭代使用itertools.chain(l1, l2, l3) 相当于把3 ...

  8. 2016 ICPC Mid-Central USA Region J. Windy Path (贪心)

    比赛链接:2016 ICPC Mid-Central USA Region 题目链接:Windy Path Description Consider following along the path ...

  9. Java 中 Properties 类的操作

    一.Java Properties类 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置 ...

  10. 常用css3属性的ie兼容查看

    记录一下关于css3的各种常用属性对ie各版本浏览器的兼容程度: 最低可兼容ie7 最低可兼容ie8 最低可兼容ie9 最低可兼容ie10 position:fixed clip E:first-le ...