Примечание: это прототип работы, пожалуйста, рассматривать его как таковой. Приглашаются запросы на вытягивание! Вы можете промокнуть ногами с хорошими первыми проблемами
Простая в использовании библиотеку для эмуляции кода в файлах Minidump. Вот несколько ссылок на посты/видео с помощью Dilmpulator:
Не стесняйтесь присылать запрос на привлечение, чтобы добавить свою статью здесь!
Пример ниже открывает StringEncryptionFun_x64.dmp (скачать копию здесь), выделяет некоторую память и вызывает функцию расшифровки по телефону 0x140001000 , чтобы расшифровать строку по телефону 0x140017000 :
from dumpulator import Dumpulator
dp = Dumpulator ( "StringEncryptionFun_x64.dmp" )
temp_addr = dp . allocate ( 256 )
dp . call ( 0x140001000 , [ temp_addr , 0x140017000 ])
decrypted = dp . read_str ( temp_addr )
print ( f"decrypted: ' { decrypted } '" ) StringEncryptionFun_x64.dmp собирается в точке входа примера tests/StringEncryptionFun . Вы можете получить скомпилированные двоичные файлы для StringEncryptionFun здесь
from dumpulator import Dumpulator
dp = Dumpulator ( "StringEncryptionFun_x64.dmp" , trace = True )
dp . start ( dp . regs . rip ) Это создаст StringEncryptionFun_x64.dmp.trace со списком выполненных инструкций и некоторыми полезными показателями при переключении модулей и т. Д. Обратите внимание, что трассировка значительно замедляет эмуляцию, и в основном предназначено для отладки.
from dumpulator import Dumpulator
dp = Dumpulator ( "my.dmp" )
buf = dp . call ( 0x140001000 )
dp . read_str ( buf , encoding = 'utf-16' )Скажем, у вас есть следующая функция:
00007FFFC81C06C0 | mov qword ptr [rsp+0x10],rbx ; prolog_start
00007FFFC81C06C5 | mov qword ptr [rsp+0x18],rsi
00007FFFC81C06CA | push rbp
00007FFFC81C06CB | push rdi
00007FFFC81C06CC | push r14
00007FFFC81C06CE | lea rbp,qword ptr [rsp-0x100]
00007FFFC81C06D6 | sub rsp,0x200 ; prolog_end
00007FFFC81C06DD | mov rax,qword ptr [0x7FFFC8272510]
Вы хотите только выполнить пролог и настроить несколько регистров:
from dumpulator import Dumpulator
prolog_start = 0x00007FFFC81C06C0
# we want to stop the instruction after the prolog
prolog_end = 0x00007FFFC81C06D6 + 7
dp = Dumpulator ( "my.dmp" , quiet = True )
dp . regs . rcx = 0x1337
dp . start ( begin = prolog_start , end = prolog_end )
print ( f"rsp: { hex ( dp . regs . rsp ) } " ) quiet флаг подавляет журналы о загруженных DLL и установке областей памяти (для использования в сценариях, где вы хотите уменьшить спам журнала).
Вы можете (повторно) реализовать Syscalls, используя декоратор @syscall :
from dumpulator import *
from dumpulator . native import *
from dumpulator . handles import *
from dumpulator . memory import *
@ syscall
def ZwQueryVolumeInformationFile ( dp : Dumpulator ,
FileHandle : HANDLE ,
IoStatusBlock : P [ IO_STATUS_BLOCK ],
FsInformation : PVOID ,
Length : ULONG ,
FsInformationClass : FSINFOCLASS
):
return STATUS_NOT_IMPLEMENTEDВсе прототипы функций Syscall можно найти в ntsyscalls.py. Есть также много примеров о том, как использовать API.
Чтобы подключить существующую реализацию Syscall, вы можете сделать следующее:
import dumpulator . ntsyscalls as ntsyscalls
@ syscall
def ZwOpenProcess ( dp : Dumpulator ,
ProcessHandle : Annotated [ P [ HANDLE ], SAL ( "_Out_" )],
DesiredAccess : Annotated [ ACCESS_MASK , SAL ( "_In_" )],
ObjectAttributes : Annotated [ P [ OBJECT_ATTRIBUTES ], SAL ( "_In_" )],
ClientId : Annotated [ P [ CLIENT_ID ], SAL ( "_In_opt_" )]
):
process_id = ClientId . read_ptr ()
assert process_id == dp . parent_process_id
ProcessHandle . write_ptr ( 0x1337 )
return STATUS_SUCCESS
@ syscall
def ZwQueryInformationProcess ( dp : Dumpulator ,
ProcessHandle : Annotated [ HANDLE , SAL ( "_In_" )],
ProcessInformationClass : Annotated [ PROCESSINFOCLASS , SAL ( "_In_" )],
ProcessInformation : Annotated [ PVOID , SAL ( "_Out_writes_bytes_(ProcessInformationLength)" )],
ProcessInformationLength : Annotated [ ULONG , SAL ( "_In_" )],
ReturnLength : Annotated [ P [ ULONG ], SAL ( "_Out_opt_" )]
):
if ProcessInformationClass == PROCESSINFOCLASS . ProcessImageFileNameWin32 :
if ProcessHandle == dp . NtCurrentProcess ():
main_module = dp . modules [ dp . modules . main ]
image_path = main_module . path
elif ProcessHandle == 0x1337 :
image_path = R"C:Windowsexplorer.exe"
else :
raise NotImplementedError ()
buffer = UNICODE_STRING . create_buffer ( image_path , ProcessInformation )
assert ProcessInformationLength >= len ( buffer )
if ReturnLength . ptr :
dp . write_ulong ( ReturnLength . ptr , len ( buffer ))
ProcessInformation . write ( buffer )
return STATUS_SUCCESS
return ntsyscalls . ZwQueryInformationProcess ( dp ,
ProcessHandle ,
ProcessInformationClass ,
ProcessInformation ,
ProcessInformationLength ,
ReturnLength
) Поскольку v0.2.0 существует поддержка легко объявления ваших собственных структур:
from dumpulator . native import *
class PROCESS_BASIC_INFORMATION ( Struct ):
ExitStatus : ULONG
PebBaseAddress : PVOID
AffinityMask : KAFFINITY
BasePriority : KPRIORITY
UniqueProcessId : ULONG_PTR
InheritedFromUniqueProcessId : ULONG_PTR Чтобы создать эти структуры, вы должны использовать экземпляр Dumpulator :
pbi = PROCESS_BASIC_INFORMATION ( dp )
assert ProcessInformationLength == Struct . sizeof ( pbi )
pbi . ExitStatus = 259 # STILL_ACTIVE
pbi . PebBaseAddress = dp . peb
pbi . AffinityMask = 0xFFFF
pbi . BasePriority = 8
pbi . UniqueProcessId = dp . process_id
pbi . InheritedFromUniqueProcessId = dp . parent_process_id
ProcessInformation . write ( bytes ( pbi ))
if ReturnLength . ptr :
dp . write_ulong ( ReturnLength . ptr , Struct . sizeof ( pbi ))
return STATUS_SUCCESS Если вы передадите значение указателя в качестве второго аргумента, структура будет прочитана из памяти. Вы можете объявить указатели с помощью myptr: P[MY_STRUCT] и развеять их с помощью myptr[0] .
Доступен простой плагин x64dbg под названием Minidumpplugin Команда Minidump была интегрирована в X64DBG с 2022-10-10. Чтобы создать дамп, приостановите выполнение и выполните команду MiniDump my.dmp .
От PYPI (последний релиз):
python -m pip install dumpulator
Чтобы установить из источника:
python setup.py install
Установить для среды разработки:
python setup.py develop
То, что отличает Dilpulator от песочниц, таких как Speakeasy и Qiling, так это то, что полная память процесса доступна. Это повышает производительность, потому что вы можете подражать большей части вредоносного ПО, не покидая единорога. Кроме того, необходимо эмулировать только Syscalls для обеспечения реалистичной среды Windows (поскольку все на самом деле является законной средой процесса).