【Windows核心编程笔记】第二十二章 DLL注入和API拦截

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

猜你喜欢

转载自blog.csdn.net/zhao3132453/article/details/92407116