ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SystemInformer 的 DLL 注入在哪:3 分钟走完从菜单到核心函数的完整调用链

2026/9/11 22:46:01 拓冰建站 浏览量
SystemInformer 的 DLL 注入在哪:3 分钟走完从菜单到核心函数的完整调用链 SystemInformer 的 DLL 注入在哪3 分钟走完从菜单到核心函数的完整调用链【免费下载链接】systeminformerA free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars Solutions, Inc. https://windows-internals.com项目地址: https://gitcode.com/GitHub_Trending/sy/systeminformer结论先行SystemInformer 的 DLL 注入功能当前落在三层——界面入口在 SystemInformer/prpgmod.c参数准备在 SystemInformer/actions.c真正执行注入的PhLoadDllProcess在 phlib/nativethread.c线程最终由 phlib/basesup.c 的NtCreateThreadEx系统调用落到内核。功能去哪儿了为什么找不到旧版 DLL 注入入口老版本 Process Hacker 的资料里注入常被描述成右键进程 → 注入 DLL很多教程还指向CreateRemoteThread那套写法。升级后的 SystemInformer 里这个入口搬到了进程属性的模块标签页函数名也变成了PhLoadDllProcess按旧教程搜函数名自然一无所获。本文带你从菜单一路走到系统调用共 3 站每站都给出文件路径和关键代码看完你就能在仓库里自己复现这条链路。沿着路径走从界面到内核第一站模块标签页里的Load module菜单项结论注入的触发点藏在进程属性对话框的模块页中由 SystemInformer/prpgmod.c 里的事件菜单构建。菜单项命中后调用PhUiLoadDllProcess// SystemInformer/prpgmod.c if (selectedItem-Id PH_MODULE_FLAGS_LOAD_MODULE_OPTION) { if (PhGetIntegerSetting(SETTING_ENABLE_WARNINGS) !PhShowConfirmMessage( hwndDlg, Lload, La module, LSome programs may restrict access or ban your account when loading modules into the process., FALSE)) break; PhUiLoadDllProcess(hwndDlg, processItem); }大白话它还会先弹一个风险提示确认后才继续——入口在模块页不在进程右键菜单。第二站UI 层选好文件、开好权限再交接结论PhUiLoadDllProcess在 SystemInformer/actions.c 中完成三件事弹出选 DLL 的对话框、按系统版本调整进程句柄权限、然后调核心函数// SystemInformer/actions.c: PhUiLoadDllProcess fileDialog PhCreateOpenFileDialog(); // 只给 *.dll 过滤器 ... status PhOpenProcess( processHandle, PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | SYNCHRONIZE, Process-ProcessId ); ... status PhLoadDllProcess(processHandle, fileName-sr, 5000); // 5 秒超时大白话这一层不碰目标进程内存只负责把文件路径 权限够用的句柄这两个参数备好5000 毫秒是注入等待的超时上限。最后一站PhLoadDllProcess 的三步注入结论真正的注入实现在 phlib/nativethread.c 的PhLoadDllProcess里标准远程线程三步曲// phlib/nativethread.c: PhLoadDllProcess status PhGetProcedureAddressRemote( // ① 找到目标进程里的 LoadLibraryW ProcessHandle, runtimeLibrary-Kernel32FileName, LoadLibraryW, loadLibraryW, NULL); status PhAllocateVirtualMemory(ProcessHandle, fileNameBaseAddress, ...); // ② 分配内存 status PhWriteVirtualMemory(ProcessHandle, fileNameBaseAddress, FileName-Buffer, ...); // ③ 写入 DLL 路径 status PhCreateUserThread( // ④ 创建远程线程入口是 LoadLibraryW ProcessHandle, NULL, THREAD_ALL_ACCESS, 0, 0, 0, 0, loadLibraryW, fileNameBaseAddress, threadHandle, NULL);线程创建函数PhCreateUserThread在 phlib/basesup.c 中最终落到NtCreateThreadEx系统调用由内核在目标进程里把线程跑起来。另外该函数开头还有一句KphProcessLevel(ProcessHandle) KphLevelMed的完整性检查目标进程比驱动本身等级高时直接拒绝内核通信库 是这条防线的来源。同文件下方还有个PhLoadDllProcessApcThread变体改用 APC异步过程调用线程等待时被动执行的回调方式投递适合不便新建线程的场景。证据档案历史留下的痕迹证据一被整段注释掉的旧代码。SystemInformer/heapinfo.c 保留了早年PhpDestroyHeap的实现里面先试RtlCreateUserThread失败则回退//if (!(threadHandle CreateRemoteThread( // processHandle, NULL, 0, // PhGetModuleProcAddress(Lntdll.dll, RtlDestroyHeap), // HeapHandle, 0, NULL)))说明项目早期依赖 Win32 的CreateRemoteThread后来统一换成 nt 级接口现在的PhCreateUserThread就是这条路线的产物。证据二CHANGELOG 里的命令行注入。CHANGELOG.txt 第 232 行记载Added ability to specify processes by their names and inject and unload DLLs in command line。说明注入能力最早是命令行参数形态图形入口是后来才长出来的。证据三内核侧的导出表。KSystemInformer/ksidll.def 导出的不是LoadDll这类现成函数而是一组更底层的原语KsiInsertQueueApc、KsiQueueWorkItem、KsiInitializeDpc。这意味着内核驱动只提供挂 APC、排队工作项这样的积木具体怎么注入由用户态代码拼装——这也是PhLoadDllProcessApcThread能与内核 APC 机制打通的原因。一图看懂调用链路动手实操如何真正用起来在 SystemInformer 主窗口打开进程列表选中目标进程此步对应processItem参数见第一站代码。双击进程或右键选属性切到**模块Modules**标签页该页对应 SystemInformer/prpgmod.c 的对话框。点模块列表列标题旁的齿轮事件菜单按钮选Load module...对应PH_MODULE_FLAGS_LOAD_MODULE_OPTION分支。若启用了警告设置会先弹确认框确认后按第二站代码弹出文件对话框选择要注入的.dll文件——句柄权限在这一步自动开好。等 5 秒超时窗口结束对应PhLoadDllProcess的第三个参数回到模块页刷新新 DLL 出现在模块列表即注入成功。收尾SystemInformer 的 DLL 注入没有神秘的内核魔咒就是一条清晰的链prpgmod.c的菜单 →actions.c备参 →nativethread.c的PhLoadDllProcess三步注入外加内核驱动等级检查做安全闸。随着 Windows 对进程完整性等级的收紧这条链路上的权限分支Win8/Win10 不同的句柄权限会持续演化。如果你在自己的场景里跑通了 APC 变体或有更稳的注入姿势欢迎参考 CONTRIBUTING.md 给项目提一个 PR。延伸阅读phlib/nativethread.cPhLoadDllProcess与PhLoadDllProcessApcThread的完整实现SystemInformer/actions.cUI 层动作函数集合kphlib/内核通信库消息与环形缓冲区定义KSystemInformer/ksidll.def内核组件导出表SystemInformer/heapinfo.c被注释的旧版远程线程代码【免费下载链接】systeminformerA free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars Solutions, Inc. https://windows-internals.com项目地址: https://gitcode.com/GitHub_Trending/sy/systeminformer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考