Dll注入的一个例子
从其他进程创建的窗口派生子类窗口
SetWindowSubclass
GetWindowSubclass
RemoveWindowSubclass
DefSubclassProc
使用注册表来注入dll
整个系统的配置在注册表中
HLM\SoftWare\Microsoft\Windows NT\CurrentVersion\Windows\
AppInit_DLLs添加要注入的dll,只有第一个能加路径,后边的忽略,之间分号分隔
LoadAppInit_DLLs 设为1
两步即可,有如下缺点:
只会映射到使用了User32.dll的进程中(基于GUI的应用程序)
会映射到每个基于GUI的进程,而不是我们期望的一个或少数几个,影响性能
使用Windows挂钩来注入dll
SetWindowsHookEx
UnhookWindowsHookEx
DIPS工具:
获取桌面ListView控件窗口
GetFirstChild(GetFirstChild(FindWindow(L”ProMan”),NULL)));
使用远程线程来注入dll
Dll注入的根本:目标进程中的一个线程调用LoadLibrary来载入我们自己的DLL
CreateRemoteThread 在另一个进程中创建线程
为了强制代码略过转换函数并直接调用LoadLibrary,通过GetProcAddress获取LoadLibrary的确切地址
PTHREAD_START_ROUTINE pfn = (PTHREAD_START_ROUTINE)GetProcAddress(
GetModuleHandle(L”Kernel32”),”LoadLibraryW”);
HANDLE hThread = CreateRemoteThread(hProcessRemote,NULL,0,
pfn,L”test.dll”,0,NULL);
我们需要把dll的路径字符串存放到远程进程的地址空间去:
VirtualAlloc
ReadProcessMemory
WriteProcessMemory
整体流程:
VirtualAllocEx 在远程进程的地址空间分配一块内存
WriteProcessMemory 把dll的路径名复制到内存中(上边分配的)
GetProcAddress得到LoadLibraryA/W的确切地址
CreateRemoteThread 远程进程中创建线程,线程调用LoadLibrary(分配的内存地址)
VirtualFreeEx 释放分配的内存
GetProcAddress得到FreeLibrary的实际地址
CreatRemoteThread 远程进程中创建一个线程,线程调用FreeLibrary
使用木马dll来注入dll
替换dll,内部导出原先dll导出的所有符号
把dll作为调试器来注入
WriteProcessMemory
DebugSetProcessKillOnExit 传入false改变默认行为,不终止进程下停止调试进程
使用CreateProcess来注入代码
好处:容易对程序和注入的dll进行调试,并适用于gui和cui程序
缺点:只有当我们的代码在父进程的时候才能用此方法,并与cpu相关
API拦截的一个例子
只有我们确定任一时刻只有一个函数会试图调用这个函数时,通过覆盖代码来拦截API才可以正常工作
通过修改模块的导入段来拦截API