[转载]Dll注入技术之注册表注入

转自:黑客反病毒论坛

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

主要代码如下:

//打开键值
02.nReg = RegOpenKeyEx(
03.    HKEY_LOCAL_MACHINE,
04.    m_szRegPath,
05.    0,
06.    KEY_ALL_ACCESS,
07.    &hKey);
08.
09.if(nReg != ERROR_SUCCESS)
10.{
11.    return FALSE;
12.}
13.
14.//查询键值
15.DWORD dwReadType;
16.DWORD dwReadCount;
17.TCHAR szReadBuff[1000] = {0};
18.nReg = RegQueryValueEx(hKey,
19.    _T("AppInit_DLLs"),
20.    NULL,
21.    &dwReadType,
22.    (BYTE*)&szReadBuff,
23.    &dwReadCount);
24.
25.if(nReg != ERROR_SUCCESS)
26.{
27.    return FALSE;
28.}
29.
30.//是否dll名称已经在内容中
31.tstring strCmpBuff;
32.strCmpBuff = szReadBuff;
33.if (!strCmpBuff.find(InjectFilePath))
34.{
35.    return FALSE;
36.}
37.
38.//有字符串就加入空格
39.if (0 != _tcscmp(szReadBuff,_T("")))
40.{
41.    _tcscat_s(szReadBuff,_T(" "));
42.}
43.
44._tcscat_s(szReadBuff,InjectFilePath);
45.
46.//把dll路径设置到注册表中
47.nReg = RegSetValueEx(hKey,
48.    _T("AppInit_DLLs"),
49.    0,
50.    REG_SZ,
51.    (CONST BYTE*)szReadBuff,
52.    (_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)
02.{
03.    TCHAR str[MAXBYTE] = {0};
04.    //得到窗口名称
05.    GetWindowText(hwnd,str,sizeof(str));
06.    //是否名称是计算器
07.    if(0 == _tcscmp(str,_T("计算器")))
08.    {
09.        //由于存在可能多个计算器,需要过滤线程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.
25.
26.DWORD ThreadProc(LPVOID lParam)
27.{
28.    //等待1秒时间以便于让windows创建窗口
29.    Sleep(1000);
30.    DWORD dwFind = 0;
31.    //遍历窗口,过滤窗口名称
32.    EnumWindows(lpEnumFunc,(LPARAM)&dwFind);
33.
34.    if (!dwFind) return 0;
35.
36.    // 运行代码
37.
38.    return 0;
39.}
40.
41.BOOL InitInstance()
42.{
43.    DWORD dwThreadId;
44.    m_hThread = ::CreateThread(NULL, NULL,
45.        (LPTHREAD_START_ROUTINE)ThreadProc,
46.        this, NULL,&dwThreadId);
47.
48.    return TRUE;
49.}  

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

时间: 2024-10-07 02:30:17

[转载]Dll注入技术之注册表注入的相关文章

[转载]Dll注入技术之远程线程注入

转自:黑客反病毒 DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等.     远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLi

[转载]Dll注入技术之依赖可信进程注入

转自:黑客反病毒 DLL注入技术之依赖可信进程注入 依赖可信进程注入原理是利用Windows 系统中Services.exe这个权限较高的进程,首先将a.dll远线程注入到Services.exe中,再利用a.dll将b.dll远线程注入到待注入进程中.具体过程如下图所示: 这里提供一个小技巧,当注入到Services.exe里的DLL时,想在做完事情后悄无声息的将自己释放掉,在Windows 中有这样的一个API函数FreeLibraryAndExitThread(),它可以把自己卸载掉并且退

注册表注入

比较简单,就是往同一个路径的两个注册表键值写入你的东西,没啥实用性,不过测试DLL时可以用一下 void CInjectDemoDlg::OnBnClickedBtnReg() { WCHAR szSubKey[] = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows"; TCHAR szData[MAX_PATH] = _T(""); GetCurrentDirectory(MAX_PATH, s

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

1.首先读取注册表中本地软件安装的位置,如果未安装则无就跳转到下载页面. 2.启动软件,关闭页面. 3.如报错提示. <SCRIPT language=javascript>  <!--   function killErrors(){  alert("请将您浏览器Internet选项中的“对没有标记为安全的ActiveX控件进行初始化和脚本运行”设置为“启用”!/n/n然后刷新本页登陆!");  return true;}   window.onerror = ki

Dll注入:注册表注入

在系统中每一个进程加载User32.dll时,会受到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft\windowsNT\CurrentVresion\Windows\AppInit_Dlls,并调用LoadLibrary来载入这个字符串中指定的每个DLL.被调用的DLL会在系统调用它们的DllMain函数,并将参数fdwReason的值设为DLL_PROCESS_ATTAC

关于注册表注入无法生效的问题

远程过几个客户现场的环境,只有极少数环境会有这个问题.以前没太在意,今天又遇到一个,真是头大. 通过搜索终于找到问题所在了:与UEFI启动相关. 引用一下微软的网站: https://msdn.microsoft.com/en-us/library/windows/desktop/dn280412(v=vs.85).aspx 里面有关于UEFI安全启动禁止Appinit_Dlls的相关内容. 参考: https://bbs.pediy.com/thread-224410.htm https://

[转载]Dll注入技术之消息钩子

转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中.主要流程如下图所示 1.准备阶段     需要编写一个DLL,并且显式导出MyMessageProc()函数,主要代码如下: LRESULT WINAPI MyMessageProc(int code,WPARAM wParam,LPARAM lParam)

转 Python模块——_winreg操作注册表

Python模块--_winreg操作注册表 (2010-01-22 13:47:01) 转载▼ 标签: python _winreg 注册表 删除键 name 默认网关 utf-8 it 分类: Python 用python操作修改windows注册表,显然要比用C或者C++简单. 主要参考资料:官方文档:http://docs.python.org/library/_winreg.html 通过python操作注册表主要有两种方式,一种是通过python的内置模块 _winreg,另一种方式

DLL注入之注册表

0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适用平台 windows NT/2000/XP/2003 0x02 原理 通过修改注册表键值:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs.将需要注入的DLL的绝对路径添加到该键