Reverse Code Engineering

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

Reverse Code Engineering

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

Reverse Code Engineering

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

آخرین نظرات

درباره Reference count

جمعه, ۴ اسفند ۱۳۹۶، ۰۳:۲۲ ب.ظ

Reference count یا Load count یک DLL یعنی تعداد دفعاتی که این کتابخانه در داخل پروسس بارگزاری می شود. هر زمان که این DLL (از طریق LoadLibrary) در داخل پروسس بارگزاری شود ,reference count یک واحد افزایش پیدا می کند و هر زمان که این DLL آزاد می شود (از طریق FreeLibrary) از پروسس,reference count یک واحد کاهش پیدا می کند. زمانی که reference count به صفر برسد, کتابخانه بطور کامل از فضای پروسس unmap می شود.

API های ویندوز اطلاعات زیادی در مورد DLL ها ارائه نمی دهند.


How to find the DLL Reference Count?


reference count یک DLL درساختار PEB آن پروسس نگهداری می شود.PEB محتوی Link list هایی برای نگهداری اطلاعاتی مفیدی از DLL است.


توضیح مراحل با جزییات :


1- Get address of PEB block


PEB برای هر پروسس معمولا در آدرس 0x7ffdf000 قابل یافتن است. هرچند راه استانداری برای بدست آوردن این آدرس است. مثلا تابع مستند نشده ZwQueryInformationProcess از NTDLL.DLL که ساختار زیر را به ما برمیگرداند. 


     struct _PROCESS_BASIC_INFORMATION 

     {

         PVOID Reserved1;

         PPEB PebBaseAddress;

         PVOID Reserved2[2];

         ULONG_PTR UniqueProcessId;

         PVOID Reserved3;

     } PROCESS_BASIC_INFORMATION;


دومین عضو یعنی PebBaseAddress محتوی آدرس PEB است.


2- Get list of loaded DLLs from PEB


زمانی که آدرس PEB را بدست آوردیم, از تابع ReadProcessMemory  برای خواندن PEB استفاده می کنیم:


PEB peb;

ReadProcessMemory(hprocess, pbi.PebBaseAddress, &peb, 16, &dwSize)


PEB یک ساختار بزرگی دارد و دامپ گرفتن از آن کار عاقلانه ای نمی باشد. یکی از عناصری که مورد توجه ماست , PPEB_LDR_DATA می باشد که این اشاره گری به ساختار داده ای است که محتوی Link list از ماژول های لود شده است.


PEB_LDR_DATA peb_ldr_data;

ReadProcessMemory(hprocess, peb.Ldr, &peb_ldr_data, sizeof(peb_ldr_data), &dwSize);


     struct _PEB_LDR_DATA

     { 

         ULONG Length;

         UCHAR Initialized;

         PVOID SsHandle;

         LIST_ENTRY InLoadOrderModuleList;

         LIST_ENTRY InMemoryOrderModuleList;

         LIST_ENTRY InInitializationOrderModuleList;

         PVOID EntryInProgress;

     } PEB_LDR_DATA, *PPEB_LDR_DATA;



ساختار PPEB_LDR_DATA محتوی 3 اشاره گر به 3  link list است که هر یک از این لیست های پیوندی برحسب ترتیب لود شدن متفاوت هستند. و می توان از هر کدام ازین ها استفاده کرد.



3-  Retrieve load count of the DLL


حالا ما با استفاده از اشاره گر InLoadOrderModuleList به میان DLLها خواهیم رفت.

ابتدا از ReadProcessMemory  استفاده می کنیم تا ساختار LDR_MODULE را بخوانیم.



    struct _LDR_MODULE

     {

         LIST_ENTRY InLoadOrderModuleList;

         LIST_ENTRY InMemoryOrderModuleList;

         LIST_ENTRY InInitializationOrderModuleList;

         PVOID BaseAddress;

         PVOID EntryPoint;

         ULONG SizeOfImage;

         UNICODE_STRING FullDllName;

         UNICODE_STRING BaseDllName;

         ULONG Flags;

         USHORT LoadCount;

         USHORT TlsIndex;

         LIST_ENTRY HashTableEntry;

         ULONG TimeDateStamp;

     } LDR_MODULE, *PLDR_MODULE;



این ساختار حاوی اطلاعات مفیدی از یک DLL می باشد که همانطور که می بینید reference count هم جز آن می باشد. 


    LDR_MODULE peb_ldr_module;

    void *readAddr = (void*) peb_ldr_data.InLoadOrderModuleList.Flink;


     // Go through each modules one by one in their load order.

     while( ReadProcessMemory(hprocess, readAddr, &peb_ldr_module, sizeof(peb_ldr_module), &dwSize) )

     {

          // Get the reference count of the DLL

          loadCount = (signed short)peb_ldr_module.LoadCount;


          readAddr = (void *) peb_ldr_module.InLoadOrderModuleList.Flink;

     }


اگر load count برای یک DLL مقدار -1 باشد پس آن DLL بصورت استاتیک به فایل پیوند شده است.




Where this will be usefull?



یکی از موارد خاص برای دانستن reference count یک DLL زمانی هستش که شما تمایل دارید تا یک DLL رو از پروسس آزاد کنید(مخصوصا DLL هایی که توسط یه سری بدافزار به پروسس ها تزریق شده اند)  یا اینکه تشخیص بدید کتابخانه بصورت استاتیک یا دینامیک بارگزاری شده است.


موفق باشید.


نظرات (۲)

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