
Pure Rust x86 हार्डवेयर एमुलेटर और Windows प्रक्रिया सिम्युलेटर जो मैलवेयर विश्लेषण, शेलकोड एमुलेशन और पेलोड अनपैकिंग के लिए है। यह 32/64-bit PE एक्जीक्यूटेबल, Metasploit, Cobalt Strike और जटिल मैलवेयर परिवारों का समर्थन करता है।
यह एक हार्डवेयर एम्यूलेटर + OS प्रक्रिया सिम्युलेटर है जो शुद्ध रस्ट में लागू किया गया है।
यह दृष्टिकोण मैलवेयर विश्लेषण और अन्य चीजों (PE, शेलकोड आदि) के लिए बहुत सुविधाजनक है।
OS मुख्य रूप से विंडोज है, यह एक विंडोज प्रक्रिया का अनुकरण करता है, लिनक्स के लिए कुछ बुनियादी समर्थन है।
हार्डवेयर x86 32/64 बिट है, यह तेज़ और विश्वसनीय है।

परियोजना का नाम scemu से mwemu कर दिया गया है।
r2con2025 - mwemu से radare2 का उपयोग करके एक एम्यूलेशन क्षण के दौरान स्थैतिक विश्लेषण और विज़ुअलाइज़ेशन करना।
📦 रस्ट सुरक्षा, मैलवेयर का अनुकरण करने के लिए अच्छा।
⚡ बहुत तेज़ एम्यूलेशन
iced-x86 रस्ट डिस्सेम्बलर शानदार लाइब्रेरी द्वारा संचालित।
कमांडलाइन टूल, रस्ट लाइब्रेरी, और पायथन लाइब्रेरी।
पुनरावृत्ति डिटेक्टर।
मेमोरी और रजिस्टर ट्रैकिंग।
रंगीन।
एक विशिष्ट क्षण पर रुकें और स्थिति का पता लगाएं या उसे संशोधित करें।
339 CPU निर्देश लागू किए गए।
15 DLL के 260 winapi 32bits लागू किए गए।
10 DLL के 204 winapi 64bits लागू किए गए।
सभी लिनक्स syscalls।
SEH चेन।
वेक्टरेड अपवाद हैंडलर।
PEB, TEB संरचनाएँ।
डायनामिक लिंकिंग।
IAT बाइंडिंग।
विलंब लोडिंग।
मेमोरी आवंटक।
int3 के साथ प्रतिक्रिया।
गैर-डीबग किया गया cpuid।
32bits और 64bits शेलकोड एम्यूलेशन।
pe32 और pe64 निष्पादन योग्य एम्यूलेशन।
ज्ञात पेलोड के साथ पूर्ण एम्यूलेशन:
जटिल मैलवेयर फंक्शन के साथ आंशिक एम्यूलेशन:
एम्यूलेशन के दौरान आप अनुकरणित CPU निर्देशों की संख्या देख सकते हैं, जो एक एम्यूलेशन क्षण के लिए एक अद्वितीय आईडी है।
-c फ्लैग के साथ आप एक विशिष्ट क्षण पर एम्यूलेशन रोक सकते हैं और कंसोल के साथ जांच कर सकते हैं कि क्या हो रहा है।
MWEMU एम्युलेटर मैलवेयर के लिए 0.7.11
@sha0coder
उपयोग:
mwemu [FLAGS] [OPTIONS]
FLAGS:
-6, --64bits 64bits आर्किटेक्चर एम्यूलेशन सक्षम करें
--banzai अलागू निर्देशों को छोड़ें, और जो भी अनुकरण किया जा सकता है उसे अनुकरण करते रहें
--flags प्रत्येक निर्देश में फ्लैग का हेक्स मान ट्रेस करें।
-F, --fpu fpu स्थितियों को ट्रेस करें।
-h, --handle Ctrl+C को संभालें कंसोल स्पॉन करने के लिए
--help मुद्रण सहायता जानकारी
-l, --loops लूप इटरेशन दिखाएं, यह धीमा है।
-m, --memory सभी मेमोरी एक्सेस रीड और राइट को ट्रेस करें।
-n, --nocolors रंगों के बिना प्रिंट करें, फ़ाइल >out में रीडायरेक्ट करने के लिए
-r, --regs प्रत्येक चरण में रजिस्टर मान प्रिंट करें।
-p, --stack_trace push/pop पर स्टैक ट्रेस करें
-t, --test परीक्षण मोड
--version संस्करण जानकारी मुद्रित करता है
-v, --verbose -vv असेंबली देखने के लिए, -v केवल संदेश, बिना वर्बोज़ के केवल API कॉल दिखाएँ और तेज़ी से चलता है
OPTIONS:
-A, --args <ARGS> EXE को तर्क प्रदान करें जैसे: --args '"aa" "bb"'
--cmd <COMMAND> कंसोल कमांड प्रारंभ करें
-b, --base <ADDRESS> कोड के लिए आधार पता सेट करें
-c, --console <NUMBER> चुनें कि किस क्षण कंसोल स्पॉन होगा निरीक्षण के लिए।
-C, --console_addr <ADDRESS> पहले eip = पते पर कंसोल स्पॉन करें
-d, --dump <FILE> डंप से लोड करें।
-a, --entry <ADDRESS> शेलकोड का एंट्री पॉइंट, डिफ़ॉल्ट रूप से शुरुआत से शुरू होता है।
-e, --exit <POSITION> शेलकोड का एग्ज़िट पोज़ीशन
-f, --filename <FILE> शेलकोड बाइनरी फ़ाइल सेट करें।
-i, --inspect <DIRECTION> मेमोरी मॉनिटर करें जैसे: -i 'dword ptr [ebp + 0x24]
--iso <ISO> विंडोज आईएसओ से वास्तविक system32 DLL निकालें और उन्हें मैप्स फ़ोल्डर के रूप में उपयोग करें, उदा. --iso ~/Downloads/win11.iso
-L, --log <LOG_FILENAME> लॉग आउटपुट को फ़ाइल में
-M, --maps <PATH> मेमोरी मैप्स फ़ोल्डर चुनें
--mxcsr <MXCSR> mxcsr रजिस्टर सेट करें
--r10 <R10> r10 रजिस्टर सेट करें
--r11 <R11> r11 रजिस्टर सेट करें
--r12 <R12> r12 रजिस्टर सेट करें
--r13 <R13> r13 रजिस्टर सेट करें
--r14 <R14> r14 रजिस्टर सेट करें
--r15 <R15> r15 रजिस्टर सेट करें
--r8 <R8> r8 रजिस्टर सेट करें
--r9 <R9> r9 रजिस्टर सेट करें
--rax <RAX> rax रजिस्टर सेट करें
--rbp <RBP> rbp रजिस्टर सेट करें
--rbx <RBX> rbx रजिस्टर सेट करें
--rcx <RCX> rcx रजिस्टर सेट करें
--rdi <RDI> rdi रजिस्टर सेट करें
--rdx <RDX> rdx रजिस्टर सेट करें
-R, --reg <REGISTER1,REGISTER2> प्रत्येक चरण में एक विशिष्ट रजिस्टर ट्रेस करें, मान और सामग्री
--rflags <RFLAGS> rflags रजिस्टर सेट करें
--rsi <RSI> rsi रजिस्टर सेट करें
--rsp <RSP> rsp रजिस्टर सेट करें
-x, --script <SCRIPT> एक एम्यूलेशन स्क्रिप्ट लॉन्च करें, scripts_examples फ़ोल्डर देखें
--stack_address <ADDRESS> स्टैक पता सेट करें
-s, --string <ADDRESS> एक विशिष्ट पते पर स्ट्रिंग मॉनिटर करें
-T, --trace <TRACE_FILENAME> निर्दिष्ट फ़ाइल पर आउटपुट ट्रेस करें
-S, --trace_start <TRACE_START> निर्दिष्ट पोज़ीशन पर ट्रेस शुरू करें
-V, --verbose_at <NUMBER> एक विशिष्ट पोज़ीशन पर असेंबली प्रदर्शित करना शुरू करें (यह -vv की तरह है जो एक विशिष्ट क्षण में सक्षम होता है)
64bits के लिए -6 फ्लैग की आवश्यकता है, ASM देखने के लिए -vv, और एक विशिष्ट क्षण पर कंसोल स्पॉन करने के लिए -c:
cargo run --release -- -f /tmp/shellcode.bin -6 -vv -c 19291
cargo run --release -- -f /bin/ls -6 -A '"-l"' -v
cargo run --release -- -f calc.exe -6 --winver win11
cargo run --release -- -f calc.exe -6 --winver win11 --syscall-mode
make tests
mwemu एक सरल शेलकोड का अनुकरण करता है जो execve() इंटरप्ट का पता लगाता है।
ध्यान दें कि मैंने इस टूल का नाम scemu से mwemu कर दिया है (इतालवी में scemu एक बुरा शब्द है)

हम लाइन का चयन करते हैं रुकने और मेमोरी का निरीक्षण करने के लिए।

लिनक्स में GuLoader win32 के लगभग 2 मिलियन निर्देशों के अनुकरण के बाद, रास्ते में cpuid और अन्य चालों का नकली उपयोग करते हुए, डीबगर्स को भ्रमित करने के लिए एक sigtrap पर पहुँचता है।

API लोडर पर मेमोरी डंप का उदाहरण।

डिफ़ॉल्ट रूप से कई मैप्स हैं, और LoadLibraryA जैसे APIs के साथ या कंसोल से मैन्युअल रूप से अधिक बनाए जा सकते हैं।

LdrLoadDLl() पर आधारित बुनियादी विंडोज शेलकोड का अनुकरण जो एक संदेश प्रिंट करता है:

कंसोल सीपीयू की वर्तमान स्थिति को देखने और संपादित करने की अनुमति देता है:
--- console ---
=>h
--- help ---
q ...................... बाहर निकलें
cls .................... स्क्रीन साफ़ करें
h ...................... मदद
s ...................... स्टैक
v ...................... वेरिएबल्स
r ...................... सभी रजिस्टर दिखाएँ
r reg .................. रजिस्टर दिखाएँ
rc ..................... रजिस्टर बदलें
f ...................... सभी फ्लैग दिखाएँ
fc ..................... सभी फ्लैग साफ़ करें
fz ..................... जीरो फ्लैग टॉगल करें
fs ..................... साइन फ्लैग टॉगल करें
c ...................... जारी रखें
ba ..................... पते पर ब्रेकपॉइंट
bi ..................... निर्देश संख्या पर ब्रेकपॉइंट
bmr .................... मेमोरी रीड पर ब्रेकपॉइंट
bmw .................... मेमोरी राइट पर ब्रेकपॉइंट
bc ..................... ब्रेकपॉइंट साफ़ करें
n ...................... अगला निर्देश
eip .................... eip बदलें
push ................... स्टैक पर dword पुश करें
pop .................... स्टैक से dword पॉप करें
fpu .................... fpu देखें
md5 .................... एक मेमोरी मैप का md5 जाँचें
seh .................... SEH देखें
veh .................... वेक्टरेड एग्ज़ेप्शन पॉइंटर देखें
m ...................... मेमोरी मैप्स
ma ..................... मेमोरी आवंटन
mc ..................... मेमोरी मैप बनाएँ
mn ..................... एक पते का मेमोरी नाम
ml ..................... मैप में फ़ाइल सामग्री लोड करें
mr ..................... मेमोरी पढ़ें, निर्दिष्ट करें जैसे: dword ptr [esi]
mw ..................... मेमोरी लिखें, निर्दिष्ट करें जैसे: dword ptr [esi] और फिर: 1af
md ..................... मेमोरी डंप
mrd .................... मेमोरी रीड dwords
mds .................... मेमोरी डंप स्ट्रिंग
mdw .................... मेमोरी डंप वाइड स्ट्रिंग
mdd .................... मेमोरी डंप टू डिस्क
mt ..................... मेमोरी परीक्षण
ss ..................... स्ट्रिंग खोजें
sb ..................... बाइट्स खोजें
sba .................... सभी मैप्स में बाइट्स खोजें
ssa .................... सभी मैप्स में स्ट्रिंग खोजें
ll ..................... लिंक्ड लिस्ट वॉक
d ...................... डिस्सेम्बल करें
dt ..................... संरचना डंप करें
enter .................. स्टेप इन
कोबाल्ट स्ट्राइक API लोडर मेटास्प्लॉइट के समान है, इसका अनुकरण:

कोबाल्ट स्ट्राइक API कॉल:

मेटास्प्लॉइट rshell API कॉल:

मेटास्प्लॉइट SGN एनकोडर पॉलीमॉर्फिज़्म छिपाने के लिए कुछ fpu का उपयोग करता है:

मेटास्प्लॉइट शिकाता-गा-नई एनकोडर जो भी fpu से शुरू होता है:

PEB संरचना प्रदर्शित करना:
=>dt
structure=>peb
address=>0x7ffdf000
PEB {
reserved1: [
0x0,
0x0,
],
being_debugged: 0x0,
reserved2: 0x0,
reserved3: [
0xffffffff,
0x400000,
],
ldr: 0x77647880,
process_parameters: 0x2c1118,
reserved4: [
0x0,
0x2c0000,
0x77647380,
],
alt_thunk_list_ptr: 0x0,
reserved5: 0x0,
reserved6: 0x6,
reserved7: 0x773cd568,
reserved8: 0x0,
alt_thunk_list_ptr_32: 0x0,
reserved9: [
0x0,
...
PEB_LDR_DATA संरचना प्रदर्शित करना:
=>dt
structure=>PEB_LDR_DATA
address=>0x77647880
PebLdrData {
length: 0x30,
initializated: 0x1,
sshandle: 0x0,
in_load_order_module_list: ListEntry {
flink: 0x2c18b8,
blink: 0x2cff48,
},
in_memory_order_module_list: ListEntry {
flink: 0x2c18c0,
blink: 0x2cff50,
},
in_initialization_order_module_list: ListEntry {
flink: 0x2c1958,
blink: 0x2d00d0,
},
entry_in_progress: ListEntry {
flink: 0x0,
blink: 0x0,
},
}
=>
LDR_DATA_TABLE_ENTRY और पहले मॉड्यूल का नाम प्रदर्शित करना:
=>dt
structure=>LDR_DATA_TABLE_ENTRY
address=>0x2c18c0
LdrDataTableEntry {
reserved1: [
0x2c1950,
0x77647894,
],
in_memory_order_module_links: ListEntry {
flink: 0x0,
blink: 0x0,
},
reserved2: [
0x0,
0x400000,
],
dll_base: 0x4014e0,
entry_point: 0x1d000,
reserved3: 0x40003e,
full_dll_name: 0x2c1716,
reserved4: [
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
],
reserved5: [
0x17440012,
0x4000002c,
0xffff0000,
],
checksum: 0x1d6cffff,
reserved6: 0xa640002c,
time_date_stamp: 0xcdf27764,
}
=>
एक मैलवेयर एक अपवाद में कुछ छिपा रहा है:
3307726 0x4f9673: push ebp
3307727 0x4f9674: push edx
3307728 0x4f9675: push eax
3307729 0x4f9676: push ecx
3307730 0x4f9677: push ecx
3307731 0x4f9678: push 4F96F4h
3307732 0x4f967d: push dword ptr fs:[0]
Reading SEH 0x0
-------
3307733 0x4f9684: mov eax,[51068Ch]
--- console ---
=>
आइए अपवाद संरचनाओं का निरीक्षण करें:
--- console ---
=>r esp
esp: 0x22de98
=>dt
structure=>cppeh_record
address=>0x22de98
CppEhRecord {
old_esp: 0x0,
exc_ptr: 0x4f96f4,
next: 0xfffffffe,
exception_handler: 0xfffffffe,
scope_table: PScopeTableEntry {
enclosing_level: 0x278,
filter_func: 0x51068c,
handler_func: 0x288,
},
try_level: 0x288,
}
=>
और यहाँ हमारे पास एरर रूटीन 0x4f96f4 और फिल्टर 0x51068c है।