Dll注入技术之注册表注入
2014-03-18 18:04
344 查看
[align=center]DLL注入技术之REG注入[/align]
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,这就要看使用者是怎么利用这个特性了。
我们可以利用这个特性来进行DLL的注入,接下来需要解决的就是关于注册表操作的Windows API了,如下列表格所示:
主要代码如下:
//打开键值
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如下表所示:
为了实现此功能,我们需要在注入的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都被注入,效率低,程序的扩展性差。
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,这就要看使用者是怎么利用这个特性了。
我们可以利用这个特性来进行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如下表所示:
[align=left]CreateThread[/align] | [align=left]创建线程[/align] |
[align=left]Sleep[/align] | [align=left]睡眠[/align] |
[align=left]EnumWindows[/align] | [align=left]遍历窗口[/align] |
[align=left]GetWindowText[/align] | [align=left]得到窗口名称[/align] |
[align=left]GetCurrentProcessId[/align] | [align=left]得到当前进程ID[/align] |
[align=left]GetWindowThreadProcessId[/align] | [align=left]由HWND获得进程ID[/align] |
主要代码如下:
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都被注入,效率低,程序的扩展性差。
相关文章推荐
- Dll注入技术之注册表注入
- Dll注入技术之注册表注入
- Dll注入技术之注册表注入
- [转载]Dll注入技术之注册表注入
- DLL注入技术之依赖可信进程注入
- Dll注入技术之ComRes注入
- DLL注入技术之ComRes注入
- DLL注入技术之消息钩子注入
- DLL注入技术之输入法注入
- Dll注入技术之ComRes注入
- DLL注入技术之消息钩子注入
- Dll注入技术之APC注入
- Dll注入技术之远程线程注入
- Dll注入技术之ComRes注入
- DLL注入技术之消息钩子注入
- Dll注入技术之输入法注入
- Dll注入技术之输入法注入
- Dll注入技术之依赖可信进程注入
- DLL注入技术之ComRes注入
- Dll注入技术之输入法注入