zoukankan      html  css  js  c++  java
  • Dll注入:注册表注入

    在系统中每一个进程加载User32.dll时,会受到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINESoftwareMicrosoftwindowsNTCurrentVresionWindowsAppInit_Dlls,并调用LoadLibrary来载入这个字符串中指定的每个DLL。被调用的DLL会在系统调用它们的DllMain函数,并将参数fdwReason的值设为DLL_PROCESS_ATTACH时,对自己进行初始化。所以我们在这个键值中添加我们的Dll路径,即可实现注入。

    注入流程:

    打开注册表键值如下:
    HKEY_LOCAL_MACHINESoftWareMicroSoftWindows NTCurrentVersionWindows

    1.在上面的注册表项中操作 AppInit_DLLs 键值,在该键值中添加自己的DLL的全路径加dll名,多个DLL以逗号或者空格分开(因此在文件名中应该尽量不要存在空格),该键值只有第一个dll文件名可以包含路径,后面的都不能包含,因此我们最好将dll放在系统路径    下,这样就可以不用包含路径也能被加载了。

    2.在该注册表项中添加键值 LoadAppInit_DLLs ,类型为 DWORD,并将其值置为 1 .

    注意:

    1.AppInit_DLLs是一个REG_SZ类型,在这里写入一个DLL的文件名或是一组DLL的文件名。如果写入的是一组DLL文件名,那么中间要用逗号或者是空格分隔。由于在这里使用空格分隔文件名,因此一定要避免在DLL文件名中包含空格。第一个DLL的文件名可以包含路径,但其他DLL包含的路径则将被忽略。因此应该将多个DLL放到Windows系统目录为妙,这样就不必指定路径了。

    2.由于被注入的DLL是在进程生命期的早期被载入(User32.dll),因此在dll实现中所调用的函数应该被慎重考虑,当然,调用Kernel32.dll是可以的,但其他dll函数可能会导致问题,甚至会蓝屏。

    方法比较简单,调用了USER32.dll 的进程都会被注入。可控性不强。

    #include "stdafx.h"
    #include <Windows.h>
    
    #define DSTKEY L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"
    
    BOOL RegInject(WCHAR* DllFullPath);
    int main()
    {
        WCHAR DllFullPath[MAX_PATH] = L"C:\Dll.dll";
        BOOL bOk = RegInject(DllFullPath);
        if (bOk)
        {
            printf("Registry inject success!
    ");
        }
        else
        {
            printf("Registry inject fail!
    ");
        }
        getchar();
        getchar();
        return 0;
        return 0;
    }
    
    
    //
    //利用AppInit_Dlls键值会被user32.dll调用LoadLibrary所加载
    //
    BOOL RegInject(WCHAR* DllFullPath)
    {
    
        BOOL bOk = FALSE;
        HKEY hKey = NULL;
        BYTE DllPath[MAX_PATH] = { 0 };
    
    
        printf("RegInject Enter...
    ");
    
    
        if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,DSTKEY,0,KEY_ALL_ACCESS,&hKey) != ERROR_SUCCESS)
        {
            printf("RegOpenKeyEx Error!
    ");
            goto Exit;
        }
    
        memcpy((void*)DllPath, DllFullPath, _tcslen(DllFullPath)*2 + 1);
    
    
        if (RegSetValueEx(hKey,L"AppInit_DLLs",0,REG_SZ,DllPath, (_tcslen(DllFullPath) + 1) * sizeof(TCHAR)) != ERROR_SUCCESS)
        {
            printf("RegSetKeyValue Error!
    ");
            goto Exit;
        }
    
        DWORD dwValue = 1;
    
    
        if (RegSetValueEx(hKey,L"LoadAppInit_DLLs",0,REG_DWORD,(BYTE*)&dwValue,sizeof(dwValue)) != ERROR_SUCCESS)
        {
            printf("RegSetKeyValue Error!
    ");
            goto Exit;
        }
    
        printf("RegInject Exit...
    ");
        bOk = TRUE;
    
    Exit:
        if (hKey)
            RegCloseKey(hKey);
        return bOk;
    
    }

    这个代码没有完善,没有处理好,如果该键值里面已经有值得情况,也没有写清理函数。

    参考:这个帖子比我写的好。

    http://blog.csdn.net/programmingring/article/details/18954193

  • 相关阅读:
    20201029模拟赛总结
    20201023模拟赛总结
    贪心题目选讲
    博客阅览帮助
    NTT&FFT(快速?变换,以及扩展)
    数论知识小结 [基础篇]
    数论知识小结 [微提高篇]
    零化多项式/特征多项式/最小多项式/常系数线性齐次递推
    牛顿迭代快速求解定义域为多项式的函数零点
    求导/泰勒展开
  • 原文地址:https://www.cnblogs.com/HsinTsao/p/6541883.html
Copyright © 2011-2022 走看看