عبارت junk code رو احتمالا توی مباحث مرتبط با مهندسی معکوس مثل
مبهم سازی , Anti reversing , کدهای چندریختی و ... باهاش مواجه شدید.
توی این پست قراره در مورد junk code
ها به صورت خلاصه توضیح بدم تا یه آشنایی کلی باهاش پیدا کنید.
Junk code چیست؟
خوب همونطور که از اسمش پیداس, کدهایی هستند که کاری انجام نمیدند و روی
عملکرد برنامه هم تاثیری ندارند و فقط فضایی رو بین دستورات اصلی برنامه اشغال می
کنند.
دلیل استفاده از junk code ها؟
دلیل استفاده از این هم میتونه متفاوت باشه, میشه برای مبهم کردن عملکرد
برنامه برای آنالیز کننده, ناشناس کردن یه بدافزار برای آنتی ویروس, کندتر کردن
روند مهندسی معکوس و محافظت بیشتر از نرم افزار استفاده کرد.
کدهای بلااستفاده می تونند یه بلوک از دستورات باشند یا تک دستورات اسمبلی ,
در هر دو مورد این کدها کاری انجام نمیدند.
البته این روش هم دارای یه سری نقاط ضعف هستش,بعنوان مثال کدهای
بلااستفاده بیشتر روند مهندسی معکوس روی توی آنالیز ایستا سخت می کنند نه آنالیز
پویا, این کدها رو میشه با کمی تجربه تشخیص داد یا میشه با نوشتن اسکریپت هایی
برای Olly یا IDA این کارو بصورت اتوماتیک انجام داد.
یه سری از دستورات اسمبلی که هیچ کاری انجام نمیدند رو در زیر مشاهده میکنید:
• NOP ;No Operation
• PUSH AX POP AX ;push ax onto the stack and then pop it back off
• XCHG BX,BX ;trade BX for BX (same as NOP literally in 8086)
• MOV AX,AX ;move ax register to AX register
• ROL AX,CL ROR AX,CL ;rotate register left then rotate right.
• INC CX DEC CX ;increase CX decrease CX
میتونید از ترکیب دستورات بالا استفاده کنید و یه بلوک کد بلااستفاده همراه با
یه سری پرش ایجاد کنید, خلاقیت توی junk code ها حرف اول رو میزنه:)
نکته: البته یادتون باشه اگه از دستوراتی استفاده می کنید که روی رجیسترها
تاثیر میزارند حتما قبلش رجیسترها رو داخل پشته ذخیره کنید (pushad)
و بعد از اتمام کار رجیسترها رو به حالت اول برگردونید (popad)
خوب همونطور که میبینید اینم یه نقطه ضعف هستش و jnuk code
هارو لو میده:)
توی زبان های سطح بالا, ایجاد junk code ها خلاقیت برنامه نویس رو بیشتر
میطلبه. میتونید یه کلاس برای اینکار تعریف کنید و هر از چندگاهی اونرو لابه لایه
کدهای برنامتون بکار ببرید ...
می تونید برای نمونه کد یا دستورات جستجو کنید.
اینم یه نمونه junk code دیس اسمبل شده توی IDA:
میبینید
که با دستور pushad
شروع شده
پایین هم انتهای این کد رو مشاهده می کنید که با دستور popad
تمام رجیسترها به حالت اول برمیگرده.