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. CSS制作红桃心

    这里主要用到了before与after属性之前之后 代码: <!DOCTYPE html> <html> <head> <meta charset=" ...

  2. Confluence 6 站点备份和恢复

    Atlassian 推荐针对生产环境中安装使用的 Confluence 使用原始数据库工具备份策略. 在默认的情况下,Confluence 每天都会备份所有数据和附件到 XML 文件备份中.这些文件被 ...

  3. stl+数论——1247D

    其实也不算很难想,每个元素质因子分解后的p^c的p和c用pair的形式存在每个元素vector里 要去前面找一个数使得所有指数相加是k的倍数,那么把vector里的所有c 模 k,然后去找前面互补的数 ...

  4. (转)ubuntu下如何安装使用SSH?

    转:http://os.51cto.com/art/201109/291634.htm ubuntu默认并没有安装ssh服务,如果通过ssh链接ubuntu(比如使用securecrt客户端来访问ub ...

  5. 剑指offer---1、顺时针打印矩阵

    剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...

  6. matlab中的 ndims(a)、length(a)、size(a) 分别是什么意思?

    size(a)表示矩阵每个维度的长度比如size([1 2 3;4 5 6])等于[2 3]表示他有2行3列size([1 2 3])等于[1 3]表示他有1行3列另外size(a,n)表示矩阵a在第 ...

  7. 京东云Ubuntu下安装mysql

    1.sudo apt-get install mysql-server,输入y后输入密码 2.sudo apt isntall mysql-client 3.sudo apt install libm ...

  8. VS下使用VIM, Visual Studio 安装 VSvim插件 配置 及使用

    简介 VIM是一款很高效的编辑工具,所幸的是VS2012以后支持VIM的插件:VsVim.下面介绍插件的安装.配置及简单使用. 1. 下载安装 去官网下载,双击直接安装后,重新打开VS. https: ...

  9. PAT_A1081#Rational Sum

    Source: PAT A1081 Rational Sum (20 分) Description: Given N rational numbers in the form numerator/de ...

  10. linux 创建用户并限制其访问目录

    1.创建用户及访问目录 useradd test1 -d /usr/share/webapps/test -M 设置密码 passwd  test1 将访问目录权限全部赋予用户 chown -R te ...