Dll注入技术之注册表注入
来源:互联网 发布:淘宝是什么 编辑:程序博客网 时间:2024/04/27 19:37
DLL注入技术之REG注入
DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等。REG注入原理是利用在Windows 系统中,当REG以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个DLL文件路径中的DLL文件。当如果遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径。
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
REG注入就好比在食堂(Windows 系统)发放给学生(EXE文件)饭菜(DLL文件)的过程中,食堂在将原有饭菜的基础上多发给一份紫菜鸡蛋汤(AppInit_DLL中的DLL文件),这个紫菜鸡蛋汤可以是英伟达的UI加速的DLL文件,也可以是是病毒文件的DLL,这就要看使用者是怎么利用这个特性了。
//打开键值 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 0
- Dll注入技术之注册表注入
- Dll注入技术之注册表注入
- Dll注入技术之注册表注入
- Dll注入技术之注册表注入
- DLL注入技术之远线程注入
- DLL注入技术之APC注入
- DLL注入技术之REG注入
- DLL注入技术之消息钩子注入
- DLL注入技术之ComRes注入
- DLL注入技术之远线程注入
- Dll注入技术之ComRes注入
- Dll注入技术之远程线程注入
- Dll注入技术之APC注入
- Dll注入技术之输入法注入
- Dll注入技术之APC注入
- Dll注入技术之输入法注入
- Dll注入技术之远程线程注入
- Dll注入技术之ComRes注入
- TextView的text内容包含双引号的问题
- CentOS查看CPU、内存、网络流量和磁盘 I/O【详细】
- JAVA回调
- Excel打开csv文件乱码问题的解决办法
- OPENCV入门系列(1)
- Dll注入技术之注册表注入
- 2014 年最热门的国人开发开源软件 TOP 100
- Quartz任务调度快速入门
- 通过 iwpriv 指令修改工厂参数
- Storm使用到的相关技术总结
- 如何在编译cocos2d项目加入自己的脚本
- selenium多个窗口操作及切换
- git,npm,bower等设置代理
- 调色板的简单实现