这篇文章将演示如何使用这样的句柄通过MiniDumpWriteDump API转储 LSASS 。 有人警告我不要在MiniDumpWriteDump 调用中使用重复的句柄,因为 API 只会打开自己的 LSASS 句柄,而不是使用提供的句柄。 Calling MiniDumpWriteDump... NtOpenProcess called. Target PID: 1056. Access: PROCESS_ALL_ACCESS Handle: 0x314 Calling MiniDumpWriteDump... PID: 21068, Handle: 0x6B4 MiniDumpWriteDump successful.
MiniDumpWriteDump函数 BOOL MiniDumpWriteDump( [in] HANDLE hProcess, [in] CallbackParam ); https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump OpenProcess( PROCESS_VM_READ | PROCESS_QUERY_INFORMATION | PROCESS_DUP_HANDLE, false, PID ); //利用MiniDumpWriteDump 转储lsass BOOL status = MiniDumpWriteDump(LsassHandle, PID, OutFile,MiniDumpWithFullMemory,NULL,NULL, https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump
CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] static extern bool MiniDumpWriteDump Overload supporting MiniDumpExceptionInformation == NULL [DllImport("dbghelp.dll", EntryPoint = "MiniDumpWriteDump , CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] static extern bool MiniDumpWriteDump MiniDumpWriteDump(currentProcessHandle, currentProcessId, fileHandle, (uint)options, IntPtr.Zero, IntPtr.Zero , IntPtr.Zero) : MiniDumpWriteDump(currentProcessHandle, currentProcessId, fileHandle, (uint)options,
dumplsass进程网上有很多的demo,其实更多的还是在使用MiniDumpWriteDump来进行内存dump,其原型如下: BOOL MiniDumpWriteDump( HANDLE delegate {callback}; 那我们就可以这样来写 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate bool MiniDumpWriteDump typeof(DMyUserCallFunction)); 那我们这里便是: IntPtr createPtr = GetProcAddress(LoadLibrary("Dbghelp.dll"), "MiniDumpWriteDump "); MiniDumpWriteDump miniDumpWriteDump = (MiniDumpWriteDump)Marshal.GetDelegateForFunctionPointer(createPtr , typeof(MiniDumpWriteDump)); GetProcAddress、LoadLibrary可以这样导入: //import Win32API [DllImport(
MiniDumpW通过OpenProcess+CreateFileW+MiniDumpWriteDump函数来dump内存。 • 2、通过MiniDumpWriteDump读取lsass进程内存,并将结果保存到文件。 • 对抗点二:是MiniDumpWriteDump函数dump进程内存的操作中,当dump内存时,会涉及到读取lsass内存和创建文件并将内存写入文件。 ,后通过syscall的方式调用ZwOpenProcess+NtCreateFile+MiniDumpWriteDump来进行内存dump,能有效的规避用户层的杀软。 如果是句柄,则通过QueryFullProcessImageName来显示出句柄的可执行文件路径,如果是lsass.exe文件,则调用后续的MiniDumpWriteDump来获取lsass内存。
前阵子在弄一个dump程序的时候遇到这样一个问题. dump程序在被dump程序debug情况下一切正常,release版本下调用了minidumpwritedump函数进行dump,但是minidumpwritedump
使用简单的 MiniDumpWriteDump API 转储 lsass 内存。 使用 MINIDUMP_CALLBACK_INFORMATION 回调转储 lsass 内存。 使用 MiniDumpWriteDump 的直接系统调用转储 lsass 内存。 使用直接系统调用转储 lsass 内存(本机转储,带有离线解析所需的流)。 随机选一个,比如 5,结果如图:
目前很多的dump手法使用的是利用MiniDumpWriteDump这个API进行进程的内存dump,demo如下: #include <windows.h> #include <DbgHelp.h> lsassPID << endl; } lsassHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lsassPID); BOOL isDumped = MiniDumpWriteDump
Include memory defined by the MiniDumpWriteDump callback routine named MiniDumpCallbackRoutine of the https://diverto.github.io/2019/11/05/Extracting-Passwords-from-hiberfil-and-memdumps 使用API MiniDumpWriteDump 方法 在dbghelp.dll中,有一个名为MiniDumpWriteDump的函数,该函数是: ? 在内部,MiniDumpWriteDump使用未记录的NtReadVirtualMemory API读取其目标的进程内存。 MiniDumpWriteDump + PssCaptureSnapshot 由于向LSASS打开特权句柄并将其传递给MiniDumpWriteDump可能会很麻烦,因此一种更隐秘的方法是使用PssCaptureSnapshot
MiniDumpWithPrivateWriteCopyMemory | MiniDumpIgnoreInaccessibleMemory | MiniDumpWithTokenInformation | MiniDumpFilterMemory ); MiniDumpWriteDump &mdei : 0, 0, &mci); //MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal
1.3 程序中加入存储Dump的代码 通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件。 dumpInfo.ThreadId = GetCurrentThreadId(); dumpInfo.ClientPointers = TRUE; // 写入Dump文件内容 MiniDumpWriteDump
GetCurrentThreadId(); dumpInfo.ExceptionPointers = pException; dumpInfo.ClientPointers = TRUE; ::MiniDumpWriteDump
注意:在调用MiniDumpWriteDump之前,需要链接Dbghelp.lib库。 例如,在Windows平台上,可以使用MiniDumpWriteDump函数时指定MiniDumpWithFullMemory以外的选项,以避免记录完整的内存内容。 在Windows平台上使用MiniDumpWriteDump函数时,可以选择MiniDumpNormal或MiniDumpWithFullMemory以外的选项。 在Windows平台上使用MiniDumpWriteDump函数时,可以通过MINIDUMP_TYPE参数指定DUMP文件的类型。 关键技能总结生成DUMP文件:在Windows平台上,可以使用MiniDumpWriteDump函数生成小型DUMP文件,或通过Visual Studio、事件查看器等工具生成DUMP文件。
// 引发异常的线程id dumpInfo.ClientPointers = TRUE; // 则异常指针位于客户机或崩溃的进程的地址空间中 // 写入Dump文件内容 MiniDumpWriteDump
einfo.ThreadId = ::GetCurrentThreadId(); einfo.ExceptionPointers = excp; einfo.ClientPointers = FALSE; ::MiniDumpWriteDump
Duplicate handle: 1549097566208 [*] MiniDumpWriteDump: NOT Hooked! [*] Duplicate dump successful.
这工具好像是调用MiniDumpWriteDump api来dump内存的,自己都可以用c++实现个 #include "stdafx.h" #include <windows.h> #include lsassPID << endl; } lsassHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lsassPID); BOOL isDumped = MiniDumpWriteDump
einfo.ThreadId = ::GetCurrentThreadId(); einfo.ExceptionPointers = excp; einfo.ClientPointers = TRUE; ::MiniDumpWriteDump
异常捕获机制```cpp// Windows 异常处理LONG WINAPI CrashHandler(EXCEPTION_POINTERS* pExceptionInfo) { // 生成转储文件 MiniDumpWriteDump dumpInfo.ThreadId = GetCurrentThreadId(); dumpInfo.ClientPointers = TRUE; // 写入Dump文件内容 ::MiniDumpWriteDump
•通过MiniDumpWriteDump函数来dump LSASS内存。 而后又介绍了目前已有的免杀转储内存的方法,分别是: •创建LSASS的进程快照,通过进程快照来间接dump内存。