Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

Share what I know............... learn what I don’t

آخرین نظرات

LIST_ENTRY و کاربرد آن در EPROCESS

پنجشنبه, ۸ مرداد ۱۳۹۴، ۰۷:۳۰ ب.ظ

این پست با اینکه از روند آموزشی ما خارج هستش ولی چون یکی از دوستان درخواست داده بودن که در مورد Flink و Blink صحبت کنیم  و اینکه یه زنگ تفریحی هم برای وبلاگ باشه قرار داده میشه:)

 

مقدمه:

Flink و Blink دو تا اشاره گر هستند که جزی از یه ساختار بنام _LIST_ENTRY بحساب میان که این ساختار بنوعی لیست پیوندی هستش ولی از نوع مضاعف.

خود این مبحث چیزی زیادی برای گفتن نداره ولی استفاده هایی که ازین ساختار میشه مهمه مثلا یکی از استفاده هایی که شاید اکثر شما دیده باشید Enumeration  پروسس ها باشه.

خوب من علاوه بر توضیح این ساختار یه توضیحات مختصری هم در مورد پروسس ها و

Enumeration process از طریق LIST_ENTRY رو میدم.


 


_LIST_ENTRY

لیست های پیوندی توی ویندوز خیلی استفاده میشه و ساختار LIST_ENTRY هم ازین نوع هستش و بیشتر برای پیاده سازی circular doubly linked list (یعنی لیست های پیوند مضاعف حلقوی) استفاده میشه. این ساختارو بنوعی بعنوان یه فیلد توی ساختارهای بزرگتر استفاده می کنند وگرنه با دوتا اشاره گر که فقط به قبل و بعد دارن اشاره می کنند که کاری نمیشه کرد:)


بطور کلی ساختار LIST_ENTRY  یا بعنوان یک entry در doubly linked list است یا بعنوان هدر  (list header) در یک چنین لیست هایی استفاده می شود.


دوتا اشاره گر Flink و Blink توی این ساختار وجود دارند حالا کار اینها چی هستش.

 

Flink:

 اگه LIST_ENTRY یکی از عناصر در لیست یا باصطلاح entry توی لیست باشه Flink به entry بعدی اشاره میکنه و اگه در ادامه entry وجود نداشته باشه به اولین entry که بهش list header هم میگن اشاره می کنه.

حالا اگه LIST_ENTRY ما بعنوان list header باشه Flink به اولین entry در لیست اشاره می کنه و اگه در ادامه entry وجود نداشته باشه به خودش اشاره می کنه (که نشون میده لیست خالی هستش)

 

Blink:

اگه LIST_ENTRY یکی از عناصر در لیست یا باصطلاح entry توی لیست باشه Blink به entry قبلی اشاره میکنه و اگه در قبلش entry نباشه به list header اشاره می کنه.

حالا اگه LIST_ENTRY ما بعنوان list header باشه Blink به آخرین entry توی لیست اشاره می کنه و اگه entry وجود نداشته باشه به خودش اشاره می کنه (که نشون میده لیست خالی هستش)

 

نکته اول: اگه ساختار LIST_ENTRY ما قراره بعنوان list header استفاده بشه باید با تابع InitializeListHead اون رو initialize کنیم.

 

نکته دوم: LIST_ENTRY ها آدرس ساختار همدیگرو دارن یعنی اگه بخوایم آدرس شروع ساختاری که درونش هستن (مثلا EPROCESS) رو بدست بیاریم باید آفست LIST_ENTRY در EPROCESS رو از آدرس LIST_ENTRY کم کنیم.



ساختار پروسس

 

هر پروسس توی ویندوز رو با یه ساختار به نام EPROCESS نشون میدن.توی این ساختار علاوه بر اطلاعات مرتبط با پروسس یه سری اشاره گر هم به ساختار های دیگه ای وجود داره.EPROCESS و یه سری از ساختارهای وابسته بهش توی فضای آدرس سیستم هستند ولی یکی از ساختارهای که خیلی هم کاربرد داره یعنی PEB توی فضای آدرس پروسس قرار داره, دلیلش هم اینه که باید یه سری اطلاعات در اختیار یوزر مد قرار داده بشه.

همونطور که میدونید ویندوز همه چیز رو مثل یه آبجکت میبینه, و پروسس ها هم ازین قضیه جدا نیستند, و هر پروسس هم توسط object manager بعنوان یه آبجکت در میان, البته چونکه پروسس ها آبجکت های بدون نام هستند نمیشه با WinObj اونها رو دید.(فک کنم خیلی وارد جزئیات شدیم,سعی میکنم سری برسیم اصل مطلب)

 

شکل کلی یک پروسس و منابعی که بهش متصل هستند رو در زیر میبینید.



هر پروسس فضای آدرس خودش رو داره که دیگر پروسس ها نمیتون بهش دسترسی داشته باشند, توی این فضا میشه خود پروسس, کتابخانه های مرتبط بهش, پشته هاش, heap و ناحیه هایی از حافظه که تخصیص داده شدن رو دید.

 

در شکل زیر ساختار یه آبجکت پروسس رو مشاهده می کنید.

بعضی از فیلدهایی که مهم و پرکاربرد هستند رو در سمت راست مشاهده می کنید.



حالا میخوایم اینهارو توی WinDbg ببینیم.

از دستور dt !nt_EPROCESS برای دیدن ساختار EPROCESS استفاده میکنیم.



خروجی این دستور زیاد هستش و تعدادی هم _LIST_ENTRY مشاهده می کنید که ما میخوایم ActiveProcessLinks رو بررسی کنیم.

 

ActiveProcessLinks یه LIST_ENTRY هستش که پروسس های فعال روی ماشین رو به هم زنجیر میکنه, پس ما میتونیم به ساختار پروسس های دیگه دسترسی داشته باشیم.

 

حالا ما میخوایم تمامی پروسس های فعال روی سیستم رو لیست کنیم.

برای اینکار ما اول نیاز به list header داریم  PsActiveProcessHeadاشاره گری به شروع لیست ساختارهای EPROCESS هستش.

با تایپ دستور زیر در ما آدرس ActiveProcessHead رو دامپ میکنیم:


حالا از آدرسی که بدست آوردیم و دستور dc محتویات ActiveProcessHead رو بدست میاریم.

اولین آدرس به ساختار _EPROCESS اشاره می کند.


حالا ما آفست ActiveProcessLinks رو از آدرسی که در بالا بدست آوردیم کم می کنیم تا آدرس شروع ساختار EPROCESS رو بدست بیاریم.


آدرس بالا آدرس شروع لیست EPROCESS ها هستش حالا ما باید از دستور زیر استفاده کنیم تا لیست پروسس هارو بدست بیاریم.

Syntax: dt type -l field.Flink address

لیست طولانی بدست میاد چون تمام محتویات ساختار پروسس ها رو نشون میده.


حالا میخوایم یه اطلاعات خاصی نشون داده بشه مثلا ما process ID همه پروسس هارو با دستور زیر نمایش میدیم.


امیدوارم که این پست برای دوستان مفید واقع بشه. کمی کاستی زیاد داره به بزرگی خودتون ببخشید.

چندتا لینک زیر هم مفید هستند.

https://msdn.microsoft.com/en-us/library/windows/hardware/ff563802(v=vs.85).aspx

http://www.osronline.com/article.cfm?article=499

http://www.codeproject.com/Articles/800404/Understanding-LIST-ENTRY-Lists-and-Its-Importance



موفق باشید.

Pcrlth0n




نظرات (۱)

دست شما درد نکنه مهندس، عالی بود!
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی