نمایش نتایج 1 تا 9 از 9

نام تاپیک: چک کردن قفل درون یک Thread

  1. #1
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

    چک کردن قفل درون یک Thread

    چک کردن قفل درون یک Thread



    این روش، روشی بسیار مفید در زمانیکه برنامه نویس بخواهد قفل را به صورت مداوم چک کند بدون اینکه در کار User Interface نرم افزار خللی وارد شود. در این روش توصیه میشود برای امنیت بالاتر از دو یا چند Thread استفاده گردد و هر کدام از آنها با روشی متفاوت عملیات چک کردن قفل را در یک حلقه انجام دهد.


    دوستاني كه در اين ضمينه كار كرده اند توضيح دهند :
    يك ترد را چگونه براي بررسي يك قفل ايجاد كنيم .
    يك مثال كامل لطفا بگذاريد .
    ادامه اين مبحث بسيار مفيد خواهد بود .

  2. #2
    کاربر دائمی آواتار joker
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    اصفهان
    سن
    42
    پست
    1,326

    نقل قول: چک کردن قفل درون یک Thread

    فایده چندانی نداره ها توی joker protector استفاده کردم :)


    interface
    uses
    Classes,Windows,Messages,Dialogs,SysUtils, Variants ,forms;

    type
    A_Thread = class(tthread)
    private
    protected
    procedure Execute; override;
    end;



    procedure ACTIVE_THREAD();



    procedure ACTIVE_THREAD();
    var
    THA : A_Thread;
    begin
    THA := A_Thread.Create(TRUE);
    tha.Priority := tpHighest ;
    THA.Resume;
    End;





    procedure A_Thread.Execute;
    begin
    // DBGDetect();
    While 1=1 Do
    BEGIN

    enumwindows(@enumwindowsproc,longint(self));
    Sleep(290);

    END;
    end;


  3. #3

    نقل قول: چک کردن قفل درون یک Thread

    غير فعال كردن يك Thread فكر نكنم كار مشكلي باشه .. به راحتي ميشه دورش زد ...

  4. #4

    نقل قول: چک کردن قفل درون یک Thread

    نه اينقدر راحت!

    تردها قرار نيست فقط قفل چک کنند. بايد بعضي قسمتهاي اجرايي برنامه بهشون وابسته باشه.

    يک نمونه تکنيک لو رفته رو بگم. تو ExeCryptor تو بخشهاي مختلف برنامه، WaitForSingleObject براي بررسي در حال اجرا بودن thread بکار گرفته ميشد.

    threadها فقط قرار کار ديباگ رو سخت تر کنند. ديباگرهاي معمولي و حتي olly در يک لحظه فقط ميتونن رو يک thread نقطه توقف بذارن و همين باعث ميشه که مثلا اگه 10 تا thread به موازات هم کارهاي برنامه و بررسي قفل رو انجام بدن، اگه يکيشون جاموند يا هلاک شد! بقيه بتونند برنامه رو وادار به خود کشي کنند.

    يک توضيح نسبتا مفصل در باره اين موضوع تو Hacker's Debugging Uncovered هست.

    در ضمن براي استفاده از API تو بررسي قفل هيچ وقت ساده سراغ تابع مربوطه نريد...

  5. #5
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

    نقل قول: چک کردن قفل درون یک Thread

    يک نمونه تکنيک لو رفته رو بگم. تو ExeCryptor تو بخشهاي مختلف برنامه، WaitForSingleObject براي بررسي در حال اجرا بودن thread بکار گرفته ميشد.
    مي شه يك مثال عملي بزنيد كه نحوه اجرا بودن يا نبودن يك thread را نشون بده

  6. #6

    نقل قول: چک کردن قفل درون یک Thread

    تو ExeCryptor که هر از چندي يک WaitForSingleObject با پارامتر انتظار Infinite فراخواني ميشه. با اين ترفند کافيه ترد مربوطه رو kill کنيد تا بقيه ترد ها متوقف بشند. ساختار دستور WaitForSingleObject رو که حتما بلديد اگه احيانا نديديد، تو راهنماي دلفي براي SDK هست.

    فقط بايد دقت بشه که اين فراخواني تابلو نباشه.

    .
    .
    .
    push -1
    test eax,eax
    mov eax,-1
    xor eax,ecx
    mov ebx, esp
    mov edx, ebx
    push edx
    je @chert1
    xor eax, ecx
    xor ecx, ecx
    @chert1:
    add ebx,4
    mov edx,ss:[ebx]
    xor eax,ecx
    cmp edx,eax
    jne @invalidparameter
    push thread_id
    push 4
    call random
    mov ebx, eax
    mov ebx, [hash_search_functions+ebx * 4]
    mov eax,wfso_hash ;WaitForSingleObject مربوط به hash کد
    call ebx
    call get_kernel32_baseaddr
    call get_ith_export_func
    test esi, esi
    je @api_error
    mov dx, [esi]
    mov cl, dl
    add cl, 3
    cwd
    xor cl, $CF
    je @int3_detected
    xor cl, $D0
    jne @continue1
    mov dl, dh
    sub dl, 3
    mov edx, ecx
    je @int3_detected
    @continue1:
    call esi ;در حال کاره يا نه thread_id اين براي بررسي اينه که ترد
    mov esi, eax
    .
    .
    .
    در مورد hash_search_func هم بايد بگم که آرايه اي از آدرس توابع بايد باشه. اين توابع بايد بر اساس کد hash ورودي، انديس تابع export شده تو kernerl32 رو بر گردونه.

    بقيه توابع هم که از اسمشون پيداست چکار ميکنن.
    آخرین ویرایش به وسیله B-Vedadian : شنبه 22 تیر 1387 در 08:26 صبح دلیل: اشتباه لوبی

  7. #7
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

    نقل قول: چک کردن قفل درون یک Thread

      enumwindows(@enumwindowsproc,longint(self));
    اين كد چيكار مي كنه و جوكر جان نياز به چه يونيتي داره روي @enumwindowsproc خطا مي گيره

  8. #8

    نقل قول: چک کردن قفل درون یک Thread

    اين روش رو امتحان نکنيد، همونطور که آقاي جوکر نوشتند، به راحتي شکسته ميشه.

    اين تابع تو واحد Windows.pas تعريف شده و بنا بر اين نياز به هيچ چيز اضافه نداره. احتمالا تابع EnumWindowProc رو درست تعريف نکرديد.

    EnumWindows براي تمامي هندل هاي موجود که مربوط به پنجره هستند تابع "بازخوان" رو با پارامتر اضافي صدا ميزنه. براي کدي که گذاشتيد مثل اينه که براي هر پنجره موجود تابع EnumWindowProc را بصورت

    EnumWindowProc(Wnd, Self)


    صدا ميزنه. اشکالات بزرگ روش
    1-يه تابع بسيار ساده براي ترد ايجاد کردين که به راحتي قابل فهم و از کار انداختنه.
    2-هيچ مکانيزمي براي وابسته شدن اجراي برنامه به اين ترد وجود نداره.
    3-هيچ مکانيزمي براي بررسي صحت و سقم تابع ترد وجود نداره.

  9. #9
    کاربر دائمی آواتار joker
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    اصفهان
    سن
    42
    پست
    1,326

    نقل قول: چک کردن قفل درون یک Thread

    نقل قول نوشته شده توسط دنیای دلفی مشاهده تاپیک
      enumwindows(@enumwindowsproc,longint(self));
    اين كد چيكار مي كنه و جوكر جان نياز به چه يونيتي داره روي @enumwindowsproc خطا مي گيره
    این قسمت در واقع داخل قسمت اجرائی ترد اجرا میشه و enumwindows ربطی به اصل موضوع ترد نداره
    شرط قفلتون توی این قسمت اجرا میشه.

    procedure A_Thread
    .Execute;
    begin

    end;

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •