如何获取对目标应用执行操作的进程列表?含挂钩、DLL注入类关联进程
挂钩进程与无DLL痕迹Bot检测方案
- 全局句柄表检测:枚举系统全局句柄表,筛选所有持有你的应用进程、线程、内存段对象句柄的外部进程。无注入类Bot通常仅通过
OpenProcess/OpenThread获取权限后直接读写内存,不会留下DLL加载记录。你可以调用NtQuerySystemInformation传入SystemHandleInformation参数获取全系统句柄列表,过滤出对象类型为Process/Thread、且对应目标ID为你自身应用PID/线程ID的条目,即可直接拿到持有你进程权限的所有外部进程ID。 - 异常内存页扫描:遍历自身进程的所有用户态内存页,排查属性为
PAGE_EXECUTE_READWRITE、且所属内存区域不属于自身程序模块、也不属于系统签名认证模块的可疑页。无文件注入类Bot通常会直接在你的进程空间申请内存写入Shellcode执行,不会加载带完整PE结构的DLL,因此不会出现在常规模块枚举结果中。你可以通过VirtualQueryEx遍历内存页,对可疑区域做特征匹配,也可以调用NtQueryVirtualMemory查询内存分配的发起方信息。 - API完整性校验:对你应用依赖的核心系统API、自身业务关键函数做入口字节校验,比对函数前16字节是否与系统原版DLL的对应字节一致,排查Inline Hook痕迹。如果发现挂钩,可通过挂钩地址反向计算所属内存页归属,或回溯调用栈拿到发起挂钩的进程信息。你也可以通过ETW(Windows事件追踪)订阅针对你进程的
OpenProcess、VirtualAllocEx、WriteProcessMemory、CreateRemoteThread等高危操作事件,直接获取操作发起进程的ID,无需自行全局枚举系统资源。 - 交互行为溯源:如果Bot通过窗口消息、模拟输入等方式与你的应用交互,可以Hook自身进程的窗口过程,对异常消息调用
GetWindowThreadProcessId获取消息发起方的进程ID,过滤合法交互进程后即可定位可疑Bot。 - 线程合法性校验:枚举自身进程内的所有线程,检查线程起始地址是否属于自身程序模块、或系统已加载的合法模块。如果线程起始地址落在堆、栈或无归属的可执行内存页内,大概率是外部进程创建的远程线程,你可以调用
NtQueryInformationThread传入ThreadQuerySetWin32StartAddress参数获取线程起始地址,再关联查询远程线程的创建进程ID。
内容的提问来源于stack exchange,提问作者UbuntuToday
相关产品推荐
相关产品推荐

