摘 要 详细阐述了如何使用DLL远程注入技术对Windows 记事本进行换肤,讲解了DLL远程注入的概念和步骤。
关键词 DLL远程注入,换肤
一、概述 1. DLL远程注入原理 DLL远程注入就是使用远程线程来插入DLL,就是要求目标进程中的线程调用LoadLibrary函数来加载必要的DLL。由于除了自己进程中的线程外,无法方便地控制其他进程中的线程,因此这种解决方案要求在目标进程中创建一个新线程。由于是自己创建这个线程,因此能够控制它执行什么样的代码。 Windows提供了一个称为CreaeRemoteThread的函数,使我们能够非常容易地在另一个进程中创建线程: HANDLE CreateRemoteThread(HANDLE hProcess,PSECURITY_ARRTRIBUTES psa,DWORD dwStackSize, PTHREAD_START_ROUTINE pfnStartAddr,PVOID pvParam,DWORD fdwCreate,PDOWRD pdwThreadId); 如何才能让该线程加载我们的DLL呢?那就需要该线程调用LoadLibrary函数: HINSTANCE LoadLibraryA (LPCSTR pszLibFileName);?????????????????? //ANSI 版本 HINSTANCE LoadLibraryW (LPCWSTR pszLibFileName);???????????? //Unicode版本 现在要做的事情是创建一个新线程,并使线程函数的地址成为LoadLibraryA或LoadLibraryW函数的地址。 PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT(“kernel32”)),”LoadLibraryA”); HANDLE hThread = CreateRemoteThread(hProcessRemote,NULL,0,pfnThreadRtn,”C:\\MyLib.dll”,0,NULL); 细心的读者应该注意到一个问题:就是字符串“C:\\MyLib.dll”是在调用进程的地址空间中,会导致远程进程的线程可能引发访问违规。所以必须将DLL的路径名字符串放入远程进程的地址空间中。 // 向目标进程地址空间写入DLL名称 DWORD dwSize, dwWritten; dwSize = lstrlenA( lpszDll ) + 1; LPVOID lpBuf = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE ); WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten );
Skin++ For VS.Net完整测试程序请到Skin++ 主页上去下载:www.uipower.com
|