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

    主要代码如下:

    //打开键值
    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都被注入,效率低,程序的扩展性差。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值