PDA

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



دنیای دلفی
پنج شنبه 20 تیر 1387, 23:40 عصر
چک کردن قفل درون یک Thread



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


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

joker
پنج شنبه 20 تیر 1387, 23:53 عصر
فایده چندانی نداره ها توی 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;

مهران موسوی
جمعه 21 تیر 1387, 00:23 صبح
غير فعال كردن يك Thread فكر نكنم كار مشكلي باشه .. به راحتي ميشه دورش زد ...

B-Vedadian
جمعه 21 تیر 1387, 12:41 عصر
نه اينقدر راحت!

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

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

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

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

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

دنیای دلفی
جمعه 21 تیر 1387, 15:16 عصر
يک نمونه تکنيک لو رفته رو بگم. تو ExeCryptor تو بخشهاي مختلف برنامه، WaitForSingleObject براي بررسي در حال اجرا بودن thread بکار گرفته ميشد.
مي شه يك مثال عملي بزنيد كه نحوه اجرا بودن يا نبودن يك thread را نشون بده

B-Vedadian
شنبه 22 تیر 1387, 00:02 صبح
تو 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 رو بر گردونه.

بقيه توابع هم که از اسمشون پيداست چکار ميکنن.

دنیای دلفی
پنج شنبه 27 تیر 1387, 20:45 عصر
enumwindows(@enumwindowsproc,longint(self));اين كد چيكار مي كنه و جوكر جان نياز به چه يونيتي داره روي @enumwindowsproc خطا مي گيره

B-Vedadian
پنج شنبه 27 تیر 1387, 22:19 عصر
اين روش رو امتحان نکنيد، همونطور که آقاي جوکر نوشتند، به راحتي شکسته ميشه.

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

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


EnumWindowProc(Wnd, Self)

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

joker
پنج شنبه 27 تیر 1387, 22:24 عصر
enumwindows(@enumwindowsproc,longint(self));اين كد چيكار مي كنه و جوكر جان نياز به چه يونيتي داره روي @enumwindowsproc خطا مي گيره

این قسمت در واقع داخل قسمت اجرائی ترد اجرا میشه و enumwindows ربطی به اصل موضوع ترد نداره
شرط قفلتون توی این قسمت اجرا میشه.

procedure A_Thread.Execute;
begin

end;