Reflective DLL: হার্ডডিস্কে ফাইল সেভ না করেই সরাসরি মেমোরিতে ম্যালওয়্যার চালানোর কৌশল!
Reflective DLL Injection-এর অভ্যন্তরীণ কার্যপ্রণালী, ডিটেকশন বাইপাস এবং প্রতিরক্ষার আধুনিক পদ্ধতি।
Windows ম্যালওয়্যার ডেভেলপমেন্টের ইতিহাসে কয়েকটি কৌশল আছে যেগুলো গেম-চেঞ্জার হিসেবে বিবেচিত হয়। Reflective DLL Injection তেমনই একটি কৌশল। ২০০৮ সালে Stephen Fewer এই টেকনিকটি সর্বপ্রথম পাবলিশ করেছিলেন, এবং এটি আজও offensive security operations এবং সাইবার আক্রমণে ব্যাপকভাবে ব্যবহৃত হচ্ছে। এর মূল ধারণা সহজ কিন্তু বিপ্লবী—একটি DLL-কে হার্ডডিস্কে ফাইল হিসেবে না লিখেই সরাসরি একটি প্রক্রিয়ার মেমোরিতে লোড এবং execute করা। এতে Windows-এর স্বাভাবিক LoadLibrary API ব্যবহার করা হয় না, ফলে file system-ভিত্তিক বা loader-monitoring-ভিত্তিক ডিটেকশন এড়ানো যায়। এই নিবন্ধে আমরা Reflective DLL Injection-এর প্রযুক্তিগত গভীরতা, এর evolution, আধুনিক ভেরিয়েন্ট এবং সর্বাধুনিক প্রতিরক্ষা সম্পর্কে আলোচনা করব।
পটভূমি: PE Loading এবং LoadLibrary
Reflective DLL বুঝতে হলে প্রথমে Windows PE (Portable Executable) লোডিং প্রক্রিয়া বোঝা জরুরি। সাধারণত যখন একটি প্রোগ্রাম LoadLibrary("malicious.dll") কল করে, তখন Windows loader নিম্নলিখিত কাজগুলো করে:
১. ফাইল সিস্টেম থেকে DLL ফাইল পড়ে ২. DLL-এর PE header parse করে ৩. উপযুক্ত মেমোরি allocate করে এবং sections (text, data, rdata) ম্যাপ করে ৪. Import Address Table (IAT) resolve করে—যে সকল ফাংশন এই DLL অন্যান্য DLL থেকে কল করে ৫. Base relocation প্রক্রিয়া—যদি preferred base address-এ লোড না হয় ৬. DllMain ফাংশন কল করে DLL_PROCESS_ATTACH রিজনে
এই পুরো প্রক্রিয়া Windows loader-এর মাধ্যমে ঘটে এবং অপারেটিং সিস্টেম একটি internal PEB (Process Environment Block) data structure-এ এই DLL-এর তথ্য রেকর্ড করে। EDR সিস্টেম LdrLoadDll এবং LdrLoadDllInternal-এ হুক বসিয়ে প্রতিটি DLL লোড পর্যবেক্ষণ করে।
Reflective DLL-এর মূল ধারণা
Reflective DLL Injection এই পুরো প্রক্রিয়া এড়িয়ে যায়। মূল কৌশল হলো DLL নিজেই তার own loader হিসেবে কাজ করে। DLL-এর ভিতরে একটি বিশেষ ফাংশন ReflectiveLoader থাকে যা PE loading-এর সমস্ত কাজ manually করে। প্রক্রিয়াটি এভাবে ঘটে:
১. Payload Delivery: Attacker একটি DLL-এর raw bytes (একটি byte array হিসেবে) target process-এর মেমোরিতে লিখে দেয়। এটি VirtualAllocEx এবং WriteProcessMemory দিয়ে remote process-এ ঘটে, বা local process-এ সরাসরি VirtualAlloc দিয়ে।
২. Loader Bootstrap: তারপর ReflectiveLoader ফাংশনের offset গণনা করে CreateRemoteThread বা NtCreateThreadEx দিয়ে সেই thread execute করা হয়।
৩. Self-Loading: ReflectiveLoader execute হয়ে নিজের PE headers parse করে। এটি kernel32.dll এবং ntdll.dll-এর base address খুঁজে বের করে PEB-এর Ldr.InMemoryOrderModuleList থেকে।
৪. API Resolution: তারপর hash-based lookup ব্যবহার করে গুরুত্বপূর্ণ API addresses রিসলভ করে—LoadLibraryA, GetProcAddress, VirtualAlloc, VirtualProtect, এবং NtFlushInstructionCache। API name-এর সাথে hash তুলনা করা হয় string-এর পরিবর্তে, যা static analysis-এ string-based detection এড়াতে সাহায্য করে।
৫. Memory Allocation: নিজের জন্য proper memory VirtualAlloc দিয়ে allocate করে।
৬. Section Mapping: PE headers এবং sections নতুন allocated memory-তে কপি করে।
৭. Import Resolution: প্রতিটি import-এর জন্য LoadLibraryA এবং GetProcAddress ব্যবহার করে IAT populate করে।
৮. Relocation: যদি preferred base address-এ লোড না হয়, তাহলে base relocation apply করে।
৯. DllMain Invocation: সর্বশেষে DllMain-কে DLL_PROCESS_ATTACH রিজনে কল করে।
এই পুরো প্রক্রিয়ায় Windows loader কখনো জড়িত হয় না। PEB-এর module list-এ এই DLL-এর কোনো entry থাকে না, ফলে EnumProcessModules API দিয়ে এটি দেখা যায় না।
Stephen Fewer-এর Original Implementation
মূল Reflective DLL Injection লাইব্রেরিটি C-তে লেখা এবং GitHub-এ available। এর মূল ফাইল ReflectiveLoader.c এ ReflectiveLoader ফাংশন রয়েছে যা ROR-13 hash algorithm ব্যবহার করে API name hash করে। এই hash গুলো compile-time-এ গণনা করা হয় এবং runtime-এ kernel32.dll এর export table-এর সাথে তুলনা করা হয়।
Metasploit Framework-এর Meterpreter payload এই টেকনিক ব্যবহার করে। যখন একটি Meterpreter session স্থাপিত হয়, প্রথমে একটি ছোট stager পাঠানো হয় যা মেমোরিতে main metsrv.dll reflectively লোড করে। কয়েক বছর ধরে এটি antivirus solutions-কে বাইপাস করার একটি কার্যকর উপায় ছিল।
Cobalt Strike-এর beacon DLL-ও এই কৌশলে চলে। মূল beacon payload হলো একটি Reflective DLL যা stageless বা staged delivery-এর মাধ্যমে target মেমোরিতে লোড হয়।
আধুনিক Variations
মূল Reflective DLL Injection-এর কিছু সীমাবদ্ধতা ছিল—এটি RWX (Read-Write-Execute) মেমোরি page তৈরি করত, যা EDR-এর জন্য একটি শক্তিশালী ইন্ডিকেটর। তাছাড়া PE header memory-তে থেকে যেত, যা memory scanning-এ ধরা পড়ত।
sRDI (Shellcode Reflective DLL Injection): Nick Landers এই variant তৈরি করেন যা একটি Reflective DLL-কে position-independent shellcode-এ কনভার্ট করে। এটি Empire এবং অন্যান্য C2 framework-এ ব্যাপকভাবে ব্যবহৃত হয়।
Hellsgate এবং Halosgate: এই টেকনিকগুলো direct syscall ব্যবহার করে—ntdll.dll-এর syscall stub গুলো parse করে syscall number বের করে এবং নিজের syscall instruction execute করে, ফলে user-mode hooks বাইপাস হয়।
Module Stomping এবং Ghostloading: এখানে একটি legitimate DLL প্রথমে LoadLibrary দিয়ে লোড করা হয় (যাতে module list-এ entry থাকে), তারপর তার .text section-এর উপর reflective payload overwrite করা হয়। এতে memory scanner-এর কাছে এটি একটি বৈধ মডিউলের মত দেখায়।
ThreadlessInject: Process injection technique যা remote thread তৈরি না করে existing thread-এর instruction pointer modify করে—আরো একটি detection vector এড়াতে।
Phantom DLL Hollowing: একটি বৈধ DLL-কে memory-mapped file হিসেবে ম্যাপ করে তার নিজস্ব backing store ব্যবহার করে, যা মেমোরি page-কে MEM_IMAGE হিসেবে দেখায়—যা সাধারণত বৈধ মডিউলের নিদর্শন।
Detection Techniques
EDR এবং threat hunters-রা Reflective DLL Injection শনাক্ত করার জন্য বিভিন্ন পদ্ধতি ব্যবহার করেন।
Memory Scanning: PE-Sieve, Moneta, এবং Hollows Hunter-এর মতো টুল process memory scan করে অসামঞ্জস্যপূর্ণ মেমোরি pattern খোঁজে। MEM_PRIVATE region-এ executable code, mismatched PE header এবং backing file ছাড়া module-এর existence—এই সব ইন্ডিকেটর।
RWX Memory Detection: EDR VirtualAlloc এবং VirtualProtect কল monitor করে RWX page সৃষ্টি বা পরিবর্তন শনাক্ত করে। আধুনিক attackers RW-তে allocate করে শুধু necessary moment-এ RX-এ পরিবর্তন করে এই ডিটেকশন এড়ায়।
ETW (Event Tracing for Windows): Microsoft-Windows-Threat-Intelligence provider মেমোরি অ্যালোকেশন এবং execution-এ ভিজিবিলিটি দেয়। Threat Intelligence ETW provider unsigned কোডের execution শনাক্ত করতে পারে।
Behavioral Heuristics: একটি প্রক্রিয়া যা সাধারণত network connection তৈরি করে না, সেটি যদি হঠাৎ Cobalt Strike-এর সাথে সামঞ্জস্যপূর্ণ TLS handshake করে—এটি একটি ইন্ডিকেটর। YARA rules মেমোরিতে স্ক্যান করে known C2 framework signature খুঁজে বের করে।
Stack Walking: যখন একটি API কল হয়, তার call stack inspect করা হয়। যদি call stack এমন একটি location থেকে আসে যা কোনো legitimate module-এর সাথে যুক্ত নয় (unbacked memory), এটি একটি strong indicator।
Hardware-Assisted Detection: Intel CET (Control-flow Enforcement Technology) এবং Microsoft Hardware Stack Protection ROP/JOP chains এবং arbitrary code execution আরো কঠিন করে তোলে।
Real-World Threat Examples
অনেক APT গ্রুপ এবং র্যানসমওয়্যার ফ্যামিলি Reflective DLL Injection ব্যবহার করেছে। APT29 (Cozy Bear) তাদের WellMess এবং WellMail ম্যালওয়্যারে এই কৌশল ব্যবহার করেছে। FIN7 তাদের Carbanak এবং later toolkit-এ memory-resident loaders ব্যবহার করেছে। Conti এবং LockBit র্যানসমওয়্যার তাদের payload delivery-তে similar in-memory loading কৌশল ব্যবহার করে।
Mimikatz-এর "mimilib.dll" variant একটি Reflective DLL হিসেবে designed, যা invoke-mimikatz PowerShell script-এর মাধ্যমে in-memory execute করা যায়। এটি disk-based AV scanning সম্পূর্ণ বাইপাস করে।
প্রতিরোধ ও প্রতিকার
Reflective DLL Injection-এর বিরুদ্ধে কার্যকর প্রতিরক্ষা একটি স্তরভিত্তিক approach দাবি করে।
Modern EDR Deployment: CrowdStrike Falcon, SentinelOne, Microsoft Defender for Endpoint, Carbon Black-এর মতো EDR সলিউশন memory scanning, behavioral detection এবং ETW telemetry দিয়ে এই কৌশল শনাক্ত করতে পারে। ETW Threat Intelligence provider সক্রিয় রাখা গুরুত্বপূর্ণ।
ASR Rules (Attack Surface Reduction): Microsoft Defender-এর ASR rules অনেক process injection technique ব্লক করতে পারে। বিশেষত "Block credential stealing from Windows local security authority subsystem" এবং "Block executable content from email" এর মতো নিয়ম।
WDEG (Windows Defender Exploit Guard) এবং Arbitrary Code Guard (ACG): ACG একটি প্রক্রিয়াকে dynamically generated বা modified কোড execute করা থেকে বিরত রাখে। যদি আপনার application-এ JIT compilation দরকার না হয়, ACG একটি শক্তিশালী mitigation।
CFG (Control Flow Guard) এবং CET: হার্ডওয়্যার-সাহায্যযুক্ত mitigation যা indirect call এবং return-oriented programming আক্রমণ কঠিন করে।
Application Whitelisting: Windows Defender Application Control (WDAC) বা AppLocker দিয়ে শুধু signed এবং approved binary execution অনুমোদন। এটি initial dropper এক্সিকিউশন প্রতিরোধ করে।
LSASS Protection: LSASS-কে Protected Process Light (PPL) হিসেবে চালানো এবং Credential Guard সক্রিয় রাখা—এই common injection target রক্ষা করে।
Memory Hunting: Periodic in-memory threat hunting—PE-Sieve, Volatility, বা commercial threat hunting platform দিয়ে স্ক্যান। Suspicious RWX region, unbacked executable memory এবং missing module entry শনাক্ত করা।
Network Layer Defense: কারণ in-memory loaders সাধারণত C2 server-এর সাথে যোগাযোগ করে, network anomaly detection এবং DNS monitoring গুরুত্বপূর্ণ। JA3/JA4 TLS fingerprinting Cobalt Strike এবং অন্যান্য C2 framework শনাক্ত করতে সাহায্য করে।
Reflective DLL Injection আধুনিক offensive cybersecurity-র একটি ভিত্তিপ্রস্তর কৌশল যা গত দেড় দশক ধরে evolution-এর মধ্যে দিয়ে গেছে। এই কৌশল প্রমাণ করে যে কেন file-based detection একা কখনো যথেষ্ট নয় এবং কেন memory-based detection আজকের EDR-এর একটি অপরিহার্য বৈশিষ্ট্য। Defender হিসেবে, এই কৌশলের অভ্যন্তরীণ কার্যপ্রণালী বোঝা আমাদের শুধু signature ছাড়িয়ে behavioral এবং telemetry-based detection-এ মনোনিবেশ করতে সাহায্য করে। Attacker এবং defender-এর মধ্যে এই arms race অব্যাহত থাকবে—কিন্তু সচেতনতা এবং আধুনিক প্রতিরক্ষা সরঞ্জামের সাথে আমরা সবসময় এগিয়ে থাকতে পারি।
আপনার জ্ঞান যাচাই করতে প্রস্তুত? আজই HackCert-এ Reflective DLL MCQ Quiz-টি দিন!
Related articles
Process Hollowing: How Malware Hijacks Legitimate Programs to Evade Detection
8 min
Access Control: Evaluating the Security of Your Corporate System Privileges
8 min
Active Defense: Proactive Strategies to Thwart Advanced Cyber Attacks
9 min
AD Trusts: How Hackers Weaponize Network Trust to Hijack Systems
8 min

