0x01 dll 注入
所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。
很多恶意代码,游戏外挂,盗号木马,顽固类病毒等程序均采用此寄生,隐藏在目标计算机之内。
0x02 关键API
VirtualAllocEx function
VirtualAllocEx函数在远程进程的地址空间中分配一块内存
C++
LPVOID WINAPI VirtualAllocEx(
_In_ HANDLE hProcess,
_In_opt_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flAllocationType,
_In_ DWORD flProtect
);
WriteProcessMemory function
WriteProcessMemory函数把DLL的路径名复制到第1步分配的内存中
C++
BOOL WINAPI WriteProcessMemory(
_In_ HANDLE hProcess,
_In_ LPVOID lpBaseAddress,
_In_ LPCVOID lpBuffer,
_In_ SIZE_T nSize,
_Out_ SIZE_T *lpNumberOfBytesWritten
);
GetProcAddress function
GetProcAddress函数来得到LoadLibraryW或LoadLibraryA函数(在Kernel32.dll中)的实际地址
GetProcAddress函数来得到LoadLibraryW或LoadLibraryA函数(在Kernel32.dll中)的实际地址
C++
FARPROC WINAPI GetProcAddress(
_In_ HMODULE hModule,
_In_ LPCSTR lpProcName
);
CreateRemoteThread function
CreateRemoteThread函数在远程进程中创建一个线程,让新线程调用正确的LoadLibrary函数并在参数中传入第1步分配的内存地址。这时,DLL已经被注入到远程进程的地址空间中,DLL的DllMain函数会收到DLL_PROCESS_ATTACH通知并且可以执行我们想要执行的代码。
C++
HANDLE WINAPI CreateRemoteThread(
_In_ HANDLE hProcess,
_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_ LPDWORD lpThreadId
);
VirtualFreeEx function
用VirtualFreeEx来释放第1步分配的内存。
C++
BOOL WINAPI VirtualFreeEx(
_In_ HANDLE hProcess,
_In_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD dwFreeType
);
0x03 辅助工具
测试使用如下工具,也可以使用其它工具或者命令行也可以。
debugview 微软自家工具
pchunter 手动检测工具(神器)
0x04 注入代码
实现大家可以结合代码理解。
大家可以随便自己先编写一个demo.dll 这个不是重点。为了测试,编写的关键代码如下。
HANDLE ghServerThread=NULL;
BOOL CreateLukeMutex()
{
HANDLE hExist = ::CreateMutex( NULL, FALSE, L"5t4rk");
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
OutputDebugString(L"[ 5t4rk ] application is exists ");
Close