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

注入流程:

打开注册表键值如下:
HKEY_LOCAL_MACHINE\SoftWare\MicroSoft\Windows NT\CurrentVersion\Windows\

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!\n");
}
else
{
printf("Registry inject fail!\n");
}
getchar();
getchar();
return ;
return ;
} //
//利用AppInit_Dlls键值会被user32.dll调用LoadLibrary所加载
//
BOOL RegInject(WCHAR* DllFullPath)
{ BOOL bOk = FALSE;
HKEY hKey = NULL;
BYTE DllPath[MAX_PATH] = { }; printf("RegInject Enter...\r\n"); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,DSTKEY,,KEY_ALL_ACCESS,&hKey) != ERROR_SUCCESS)
{
printf("RegOpenKeyEx Error!\n");
goto Exit;
} memcpy((void*)DllPath, DllFullPath, _tcslen(DllFullPath)* + ); if (RegSetValueEx(hKey,L"AppInit_DLLs",,REG_SZ,DllPath, (_tcslen(DllFullPath) + ) * sizeof(TCHAR)) != ERROR_SUCCESS)
{
printf("RegSetKeyValue Error!\n");
goto Exit;
} DWORD dwValue = ; if (RegSetValueEx(hKey,L"LoadAppInit_DLLs",,REG_DWORD,(BYTE*)&dwValue,sizeof(dwValue)) != ERROR_SUCCESS)
{
printf("RegSetKeyValue Error!\n");
goto Exit;
} printf("RegInject Exit...\r\n");
bOk = TRUE; Exit:
if (hKey)
RegCloseKey(hKey);
return bOk; }

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

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

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

最新文章

  1. CLR:基元类型、引用类型和值类型
  2. 在VBA中调用excel函数
  3. PyCharm 教程(四)显示行号
  4. 网页设计中常用的19个Web安全字体
  5. c#中结构体(struct)和类(class)的区别
  6. Tyvj 1030 乳草的入侵
  7. WIN7+Ubuntu双系统,win7启动不了
  8. YUV数据格式
  9. ab基本用法
  10. 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈
  11. JQuery获取Checkbox组的值
  12. .NET平台的ORM分析工具
  13. 用keras作CNN卷积网络书本分类(书本、非书本)
  14. ionic笔记
  15. 新年放大招:Github 私库免费了!
  16. PAT基础6-6
  17. linux常用命令:Linux 文件属性详解
  18. hadoop项目开发案例方案汇总
  19. 字符的二进制,php的pack与unpack
  20. 易普优APS应用案例:线束行业生产计划排产

热门文章

  1. pandas中df.ix, df.loc, df.iloc 的使用场景以及区别
  2. C# 外观模式
  3. ASP.NET MVC 小牛之旅2:体验第一个MVC程序
  4. 使用Log4j2,打包后提示ERROR StatusLogger Log4j2 could not find a logging implementation.
  5. 2017-10-15 NOIP模拟赛
  6. Pycharm自动部署项目
  7. 任务计划cron
  8. 因为.patch_storage目录丢失,导致opatch打补丁失败
  9. P1089津津的储蓄计划
  10. Eclipse设置控制台字体