انواع تکنیکهای رایج Obfuscation
Renaming (تغییر نامها):
تغییر نام تابعها متغیرها کلاسها به اسمهای بیمعنا مثل a, b2, _x1 و غیره
در کد NET. و Java خیلی رایجه
2 Control Flow Obfuscation:
تغییر ساختار طبیعی کدها با اضافه کردن پرشهای بیربط if/elseهای بیمعنا و لوپهای تودرتو
در اسمبلی به شکل JMPهای زیاد، CALL های بیدلیل یا پرشهای به عقب دیده میشه
3 Junk Code Injection:
تزریق دستوراتی که هیچ کاری نمیکنن (NOP، push/popهای بیاثر) فقط برای گمراه کردن دیباگر یا دیساسمبلر
4 Opaque Predicates:
شرط هایی که همیشه درست یا غلط هستن ولی تحلیلگر رو گیج میکنن
مثل:
CMP EAX, EAX
JNE somewhere ; این هیچوقت اجرا نمیشه
5 String Encryption:
رمزنگاری رشتهها (مثل نام توابع، URLها کلیدها) که فقط در زمان اجرا رمزگشایی میشن
6 Anti-Decompiler / Anti-Debug Tricks:
مثل IsDebuggerPresent, CheckRemoteDebuggerPresent و دستوراتی که ابزارهای تحلیل رو crash میکنن
👍4👏1
توضیح کاربردها:بدافزارها برای پنهان کردن رفتار واقعیشون استفاده میکنن
توسعهدهندگان نرمافزارهای پولی برای جلوگیری از کرک
حتی گاهی برای مخفی کردن بخشی از منطق تجاری یا کد لایسنس استفاده میشه
👍4❤1
تحلیل یک باینری با Control Flow Obfuscation
توی این قسمت یاد میگیریم چطور کدهایی که عمدا ساختار طبیعیشون بههم ریخته رو شناسایی کنیم و تمیز کنیم
توی این قسمت یاد میگیریم چطور کدهایی که عمدا ساختار طبیعیشون بههم ریخته رو شناسایی کنیم و تمیز کنیم
👍3❤2
ReverseEngineering
تحلیل یک باینری با Control Flow Obfuscation توی این قسمت یاد میگیریم چطور کدهایی که عمدا ساختار طبیعیشون بههم ریخته رو شناسایی کنیم و تمیز کنیم
Asm
start:
push ebp
mov ebp, esp
cmp eax, eax
jne fake_branch
nop
nop
call real_function
jmp end
fake_branch:
xor eax, eax
call junk_function
jmp start
real_function:
; کد واقعی برنامه
; ...
ret
junk_function:
nop
nop
ret
end:
mov esp, ebp
pop ebp
ret
👍2👏2
ReverseEngineering
Asm start: push ebp mov ebp, esp cmp eax, eax jne fake_branch nop nop call real_function jmp end fake_branch: xor eax, eax call junk_function jmp start real_function: ; کد واقعی برنامه ; ... ret junk_function: nop nop ret…
تحلیل کد بالا در ابزارهایی مثل Ghidra یا IDA:
cmp eax, eax + jne همیشه falseمیشه، پس مسیر fake_branch عملا مردهست
junk_function هیچ کاری نمیکنه و فقط برای گیج کردن دیساسمبلر استفاده شده
real_function هدف اصلیه ولی وسط یک ساختار غیرخطی پنهان شده
cmp eax, eax + jne همیشه falseمیشه، پس مسیر fake_branch عملا مردهست
junk_function هیچ کاری نمیکنه و فقط برای گیج کردن دیساسمبلر استفاده شده
real_function هدف اصلیه ولی وسط یک ساختار غیرخطی پنهان شده
👍3👏1
تکنیکهای Deobfuscation
با استفاده از Ghidra یا IDA:
مسیرهای شرطی غیرمنطقی (مثل cmp eax, eax) رو شناسایی و حذف کنید
برچسبها (labels) و نام تابعها رو خودتون معنی دار کنید تا سردرگم نشید
توی Ghidra میتونی از Script Manager استفاده کنید و اسکریپتهایی بنویسید که:
بلاکهای غیرقابل دسترس (dead code) رو علامتگذاری کنن
توابع جعلی یا بیاثر رو از مسیر تحلیل حذف کنید
با استفاده از Ghidra یا IDA:
مسیرهای شرطی غیرمنطقی (مثل cmp eax, eax) رو شناسایی و حذف کنید
برچسبها (labels) و نام تابعها رو خودتون معنی دار کنید تا سردرگم نشید
توی Ghidra میتونی از Script Manager استفاده کنید و اسکریپتهایی بنویسید که:
بلاکهای غیرقابل دسترس (dead code) رو علامتگذاری کنن
توابع جعلی یا بیاثر رو از مسیر تحلیل حذف کنید
👍3👏1
ابزارهای مفید:
ابزارهای کاربرد
ابزارهای کاربرد
Ghidra تحلیل کد پیچیده ساخت گراف کنترل جریان
IDA Pro دیساسمبلی پیشرفته و دید بصری گرافها
Binary Ninja سادهتر ولی مناسب برای
obfuscation
Ghidra Scripts نوشتن اسکریپتهای تحلیل خودکار
👍3👏1
Junk Code Injection
روشهای حذفش
یعنی تزریق دستوراتی که هیچ اثری روی اجرای برنامه ندارن فقط برای گمراه کردن تحلیلگر یا دیباگر استفاده میشن
روشهای حذفش
یعنی تزریق دستوراتی که هیچ اثری روی اجرای برنامه ندارن فقط برای گمراه کردن تحلیلگر یا دیباگر استفاده میشن
👍7❤1
ReverseEngineering
Junk Code Injection روشهای حذفش یعنی تزریق دستوراتی که هیچ اثری روی اجرای برنامه ندارن فقط برای گمراه کردن تحلیلگر یا دیباگر استفاده میشن
مثال ساده از Junk Code:
push eax
pop eax
nop
xor ecx, ecx
add ecx, 0
jmp real_code
👍5👏1
ReverseEngineering
مثال ساده از Junk Code: push eax pop eax nop xor ecx, ecx add ecx, 0 jmp real_code
تغییری در وضعیت ایجاد نمیکنه / push eax pop eax
nop بی اثر است
no-operation
و بعد add ecx, 0 باعث میشه ecx همچنان صفر بمونه
در نهایت با jmp مستقیم به کد اصلی میره
nop بی اثر است
no-operation
و بعد add ecx, 0 باعث میشه ecx همچنان صفر بمونه
در نهایت با jmp مستقیم به کد اصلی میره
👍6👏1
چرا این کارو میکنن؟
برای فریب دادن الگوریتمهای decompiler
برای طولانی و بینظم کردن گراف کنترل جریان (CFG)
برای کند کردن اسکریپتهای تحلیل خودکار
برای فریب دادن الگوریتمهای decompiler
برای طولانی و بینظم کردن گراف کنترل جریان (CFG)
برای کند کردن اسکریپتهای تحلیل خودکار
👍8👏1
روشهای شناسایی و حذف Junk Code:
دستی (Manual)
توی Ghidra یا IDA دنبال دستوراتی بگردید که:
ورودی و خروجی ندارن
روی ثباتها (registers) تغییری ایجاد نمیکنن
به مسیر اجرایی اصلی مرتبط نیستن
خودکار با اسکریپت Ghidra
میتونیید اسکریپت بنویسید که:
دنبال nop, push/pop جفتی و xor reg, reg بگرده
بلاکهایی که فقط اینا رو دارن پاک یا علامتگذاری کنه
دستی (Manual)
توی Ghidra یا IDA دنبال دستوراتی بگردید که:
ورودی و خروجی ندارن
روی ثباتها (registers) تغییری ایجاد نمیکنن
به مسیر اجرایی اصلی مرتبط نیستن
خودکار با اسکریپت Ghidra
میتونیید اسکریپت بنویسید که:
دنبال nop, push/pop جفتی و xor reg, reg بگرده
بلاکهایی که فقط اینا رو دارن پاک یا علامتگذاری کنه
👍5👏1
ابزارهای آماده
BinDiff: برای مقایسه نسخه مبهمسازیشده با نسخه اصلی (اگه داشته باشید)
Diaphora: پلاگین مقایسه برای IDA
BinDiff: برای مقایسه نسخه مبهمسازیشده با نسخه اصلی (اگه داشته باشید)
Diaphora: پلاگین مقایسه برای IDA
👍7👏1
https://medium.com/@ibnuilham/dodging-the-debugger-winantidbg0x300-picoctf-2024-writeup-0d913ad398ba
Medium
Dodging the Debugger: WinAntiDbg0x300 (picoCTF 2024 Writeup)
Hey everyone! I just wrapped up a fun little reverse engineering challenge from picoCTF 2024 called “WinAntiDbg0x300,” and thought I’d…
👍7❤1🔥1
مخرب ترین تکنیکهای Obfuscation که فقط بدافزارنویسا بلدن
1 Control Flow Flattening
ساختار کد کاملاً بههم میریزه بهجای if/else و loop های مرسوم همه چی توی یه سوییچ و Dispatcher بزرگ قایم میشه
هدف؟ دیساسمبلر رو گمراه میکنه دیباگر رو دیوونه میکنه
2 Virtualization Obfuscation
کل برنامه به یه زبان ماشین خیالی (VM-based) ترجمه میشه چیزی شبیه VMProtect
نتیجه؟ بهجای opcodeهای x86 با دستوراتی عجیب و ناشناخته طرفی
3 Polymorphic Code
هر بار اجرا یا build کد تغییر میکنه ولی همون کار رو انجام میده
بدافزارها عاشقشن چون آنتیویروسها رو کور میکنن
4 Call Stack Tampering
فانکشن صدا زده میشه ولی نه از راهی که انتظار میره؛ مثلا با دستکاری ESP یا EBP.
چرا مهمه؟ چون ابزارهایی مثل IDA بهسختی میفهمن این یه "تابع" هست
5 API Hiding با Hash کردن نام توابع
بهجای استفاده مستقیم از مثلا LoadLibrary یا GetProcAddress اسم APIها هش شدهست و در زمان اجرا resolve میشن
یعنی چی؟ یعنی ابزار تحلیل نمیفهمه برنامه چه APIهایی صدا میزنه
1 Control Flow Flattening
ساختار کد کاملاً بههم میریزه بهجای if/else و loop های مرسوم همه چی توی یه سوییچ و Dispatcher بزرگ قایم میشه
هدف؟ دیساسمبلر رو گمراه میکنه دیباگر رو دیوونه میکنه
2 Virtualization Obfuscation
کل برنامه به یه زبان ماشین خیالی (VM-based) ترجمه میشه چیزی شبیه VMProtect
نتیجه؟ بهجای opcodeهای x86 با دستوراتی عجیب و ناشناخته طرفی
3 Polymorphic Code
هر بار اجرا یا build کد تغییر میکنه ولی همون کار رو انجام میده
بدافزارها عاشقشن چون آنتیویروسها رو کور میکنن
4 Call Stack Tampering
فانکشن صدا زده میشه ولی نه از راهی که انتظار میره؛ مثلا با دستکاری ESP یا EBP.
چرا مهمه؟ چون ابزارهایی مثل IDA بهسختی میفهمن این یه "تابع" هست
5 API Hiding با Hash کردن نام توابع
بهجای استفاده مستقیم از مثلا LoadLibrary یا GetProcAddress اسم APIها هش شدهست و در زمان اجرا resolve میشن
یعنی چی؟ یعنی ابزار تحلیل نمیفهمه برنامه چه APIهایی صدا میزنه
🔥7❤1👍1👏1