หมายเหตุ: นี่เป็นต้นแบบที่กำลังดำเนินการอยู่โปรดปฏิบัติเช่นนี้ ยินดีต้อนรับคำขอดึง! คุณสามารถทำให้เท้าเปียกด้วยปัญหาแรกที่ดี
ไลบรารีที่ใช้งานง่ายสำหรับการเลียนแบบรหัสในไฟล์ minidump นี่คือลิงค์ไปยังโพสต์/วิดีโอโดยใช้ Dumpulator:
อย่าลังเลที่จะส่งคำขอดึงเพื่อเพิ่มบทความของคุณที่นี่!
ตัวอย่างด้านล่างเปิด 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]
คุณต้องการดำเนินการ prolog และตั้งค่าการลงทะเบียนบางส่วนเท่านั้น:
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 decorator:
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
สิ่งที่ตั้งค่า dumpulator นอกเหนือจาก sandboxes เช่น speakeasy และ qiling คือหน่วยความจำกระบวนการเต็มรูปแบบพร้อมใช้งาน สิ่งนี้ช่วยปรับปรุงประสิทธิภาพเนื่องจากคุณสามารถเลียนแบบมัลแวร์ส่วนใหญ่โดยไม่ต้องออกจากยูนิคอร์น นอกจากนี้ Syscalls เท่านั้นที่จะต้องเลียนแบบเพื่อให้สภาพแวดล้อมของหน้าต่างที่สมจริง (เนื่องจากทุกอย่าง เป็น สภาพแวดล้อมกระบวนการที่ถูกต้องตามกฎหมาย)