}
else
{
//Debugger Detected
}
شکل۴-۵: کد C برای تشخیص FindWindow
در این مثال، کد به آسانی به دنبال یک پنجره به نام OLLYDBG میگردد.
۴-۵- تشخیص رفتار اشکال زدا
بازخوانی این اشکال زداها میتوانند برای تنظیم نقطه توقف یا یک گام مستقل در یک پردازش برای کمک به تحلیلگر بدافزار در مهندسی معکوس استفاده شوند. اگر چه زمانی که این عملها در یک اشکال زدا اجرا میشوند، کد را در پردازش اصلاح میکنند. چندین تکنیک ضد اشکال زدایی توسط بدافزار برای تشخیص این رفتار اشکال زدا استفاده میشوند: اسکن INT، بررسیهای مجموعه مقابلهای و بررسیهای زمان.
۴-۵-۱- اسکن INT
INT3 یک وقفه نرم افزاری استفاده شده توسط اشکال زداها برای جایگزینی یک دستور در یک برنامه در حال اجراست، تا اشکالزدا را در تولید یک مکانیزم بر پایۀ تنظیم نقطه توقف فراخوانی کند. Opcade رمزالعمل برای ۰XCC INT3 است. هرگاه از یک اشکال زدا برای تنظیم نقطه توقف استفاده میکنید، کد را با وارد کردن ۰XCC اصلاح میکند.
علاوه بر دستور INT3، INT immediate میتواند هر وقفهای را تنظیم کند، (شامل immediate میتواند یک ثبت باشد مانند EAX باشد). دستور INTimmediate از دو رمزالعمل استفاده میکند:۰XCDvalue .این رمزالعمل ۲ بایتی کمتر توسط اشکال زداها استفاده میشوند. یک تکنیک ضد اشکال زدایی پردازشی را دارد که کد خود را برای یک اصلاح INT3 با جستجوی کد برای رمزالعم۰XCC اسکن میکند، همانطور که در شکل ۴-۶ نشان داده شده است.call $+5
pop edi
sub edi, 5
mov ecx, 400h
mov eax, 0CCh
repne scasb
jz DebuggerDetected
شکل۴-۶: اسکن کد برای نقاط توقف
این کد با یک فراخوانی شروع میشود، با یک pop که EIP را در EDI قرار میدهد دنبال میشود. EDI برای شروع کد تعدیل میشود. کد سپس برای بایتهای ۰XCC اسکن شده است. اگر یک بایت ۰XCC یافت شد، میداند که یک اشکال زدا وجود دارد. این تکنیک میتواند با بهره گرفتن از نقاط توقف سخت افزار بجای نقاط توقف نرم افزار مغلوب شود.
۴-۵-۲-اجرای حاصل جمع کنترل کد
بدافزار میتواند یک حاصل جمع کنترل را در بخشی از کد خود در جهت انجام دادن همان هدف بصورت جستجوی وقفهها محاسبه کند. بجای اسکن برای۰XCC، این بررسی به سادگی یک بررسی چرخه اضافی [۱۷]یا یک کنترل MD5 از رمزالعملها را در بدافزار اجرا میکند. این تکنیک نسبت به اسکن کردن کمتر استفاده میشود، اما همان تأثیر را دارد. به دنبال بدافزاری برای تکرار کردن دستورات داخلی خود به همراه مقایسه با مقدار مورد نظر باشید. در این تکنیک میتوان با بهره گرفتن از یک نقطه توقف سخت افزاری یا با تغییر دستی مسیر اجرا با اشکال زدا در زمان اجرا مقابله کرد.
۴-۶- بررسی های زمان
بررسیهای زمان یکی از محبوبترین روشها برای بدافزار برای تشخیص اشکالزداهاست زیرا پردازشها در زمان اشکال زدایی میشوند بسیار آهستهتر اجرا میشود. برای مثال گامی مستقل در یک برنامه در واقع بصورت قابل توجهی سرعت اجرا را نشان میدهد.
در اینجا دو راه استفاده از بررسیهای زمان برای تشخیص یک اشکال زدا وجود دارد:
-
- یک نشانه زمان را ثبت کنید، یک جفت عملیات را اجرا کنید، یک نشانه زمان دیگر را در اختیار بگیرید و سپس دو نشانه زمان را مقایسه کنید. اگر تأخیری وجود داشت، میتوانید حضور اشکال زدا را تصور کنید.
-
- یک نشانه زمان را قبل و بعد از یک استثنا بگیرید. اگر پردازش شروع به اشکال زدایی نشده باشد، استثنا به سرعت اداره خواهد شد، اشکال زدا استثنا را بسیار آهستهتر اداره خواهد کرد. بطور پیش فرض اکثر اشکالزداها نیاز به مداخله انسان برای اداره استثناها دارند که سبب تأخیرهای زیادی میشود. در حالی که بیشتر اشکال زداها به شما اجازه میدهند از استثناها چشم پوشی کرده آنها را به برنامه انتقال دهید، هنوز تأخیراتی در چنین مواردی وجود دارد.
۴-۶-۱- استفاده از دستور rdtsc
رایج ترین روش بررسی زمان استفاده از دستور rdtsc (opcode 0X0f31) می باشد، که تعداد مراحل تاآخرین راه اندازی دوباره سیستم را بصورت یک مقدار ۶۴بیتی درEDX:EAX قرار می دهد.بدافزار این دستور را براحتی دوباره اجرا میکند و تفاوت میان دوخوانده رامقایسه می کند. شکل۴-۷ یک نمونه واقعی از بدافزار را که از تکنیک rdtsc استفاده می کند نشان می دهد.
rdtsc
xor ecx, ecx
add ecx, eax
rdtsc
sub eax, ecx
cmp eax, 0xFFF (1)
jb NoDebuggerDetected
rdtsc
push eax (2)
ret
شکل۴-۷: تکنیک زمان rdtsc
بدافزار بررسی میکند که آیا تفاوت میان دوفراخوانی rdtsc بزرگتر از XFFF0 در (۱) است، اگر زمان زیادی سپری شده باشد جهش شرطی رخ نمیدهد. اگر جهش رخ نداده باشد، rdtsc دوباره فراخوانی میشود ونتیجه به پشته (۲) میرود که سبب بازگشت و جابجایی اجرا به یک مکان تصادفی میشود.
۴-۶-۲- استفاده از Qurey PErformance counter و Get tikcount
دو تابع ویندوز رابطه برنامه کاربرد ویندوز همانند rdtscبرای اجرای بررسی زمان ضداشکال زدایی استفاده میشوند. این روش تکیه براین حقیقت دارد که پردازندهها شمارشگرانی اجرایی با وضوح بالا دارند که تعداد فعالیتهای انجام گرفته شده درپردازنده رانگه میدارد. Query PErformance counter میتواند برای جستجوی دوباره این شمارشگر برای بدست آوردن تفاوت زمان برای استفاده در این مقایسه فراخوانده شود. اگر زمان بسیار زیادی میان دوفراخوانی تلف شود، تصور این است که اشکال زدا در حال استفاده است.
تابع Get tikcount تعداد میلیثانیههایی را که در آخرین راه اندازی دوباره سیستم سپری میشود را باز میگرداند. مثالی از Get tick count در عمل در شکل۴-۸ نشان داده شده است.
a = GetTickCount();
MaliciousActivityFunction();