PDA

View Full Version : رویداد خروج از برنامه



Farhad.B.S
دوشنبه 10 آذر 1382, 17:34 عصر
سلام.
چطور میشه زمان خروج برنامه رو ، وقتی که برنامه به صورت unmanaged بسته میشه فهمید ؟
مثلا وقتی که کاربر با استفاده از EndTask برنامه رو میبنده (یه جورایی زورکی ! )

ممنون.

Mashatan
دوشنبه 10 آذر 1382, 18:53 عصر
فکر میکنم در زمانی که End Task میکنیم Windows در حال بستن برنامه به طور معمول هست مگه اینکه بفهمه که برنامه No Response شده ( به Event ها جواب نمیده ) که اونجاست که Process رو Kill میکنه !

ارادتمند
مشاطان

Farhad.B.S
دوشنبه 10 آذر 1382, 19:05 عصر
ممنون.
حرف شما درسته ، ولی فرض کنید میخوایم یه برنامه بنویسیم که قراره یوزر نتونه اون رو ببنده (احتیاج به اجازه سوپر وایزر باشه) ، در اون صورت اگه یوزر چند بار پشت سر هم روی end task کلیک کنه سر انجام دیالوگ End Now ظاهر میشه و در نهایت بعد از زدن دکمه End now برنامه بسته میشه :(

مهدی کرامتی
دوشنبه 10 آذر 1382, 20:20 عصر
توی رویداد OnCloseQuery میتونی CanClose رو False کنی. اما هیچ جوری نمیشه از دست End Task‌ در Task Manager در رفت. مگه اینکه از دید Task Manager مخفی اش کنی.

با این کد میتونی برنامه‌ات رو از دید Task Manager مخفی کنی:

ShowWindowAsync(Application.Handle, SW_HIDE);

برای برگرداندن به حالت اولیه میتوانید این کد را استفاده کنید:

ShowWindowAsync(Application.Handle, SW_SHOW);

Inprise
سه شنبه 11 آذر 1382, 09:59 صبح
غیر از مواردی که اشاره شد ، برنامه های ارائه کننده سرویس ، به عنوان مثال اینتربیس یا Jrun سرور ، همگی از یک سرویس جانبی برای حفاظت از سریس اصلی استفاده میکنند به این صورت که برنامه اصلی پس از اجرا ( و ایجاد یک موتکس با نام یکتا ) سرویس جانبی ( گارد ) را اجرا میکند ، بعد از ایجاد اون موتکس کذائی ، هرگاه برنامه اصلی بسته شد یا به کوئری های سرویس جانبی یا همون گارد( با هر کدام از تکنیک های IPC ) جواب نداد بلافاصله یک نسخه دیگر از آن را ایجاد میکند و اگر سرویس جانبی بسته شد بالعکس و اینبار توسط برنامه اصلی . البته برای فائق اومدن بر این راهکار ، فرد خاطی میکتونه همزمان هر دو سرویس رو Kill کنه اما بهر حال این راه حل توسط بسیاری از سرویسها استفاده میشه .

:roll:

Farhad.B.S
سه شنبه 11 آذر 1382, 19:40 عصر
با تشکر از تمامی دوستان ،
جناب کرامتی یوزر های این برنامه زیاد هم مبتدی نیستند :wink: فکر نمیکنم راهی باشه که بشه این برنامه رو از لیست Processes مخفی کرد .

خدمت اینپرایز عزیز هم عرض کنم که این برنامه قراره خودش از یه برنامه دیگه محافظت کنه :(

تنها کاری که تونستم انجام بدم اینه که برنامه بدون هیچ مقاومتی بسته بشه ولی در رویداد OnClose اون دوباره برنامه اجرا بشه !

Mashatan
سه شنبه 11 آذر 1382, 20:43 عصر
با تشکر از تمامی دوستان ،
جناب کرامتی یوزر های این برنامه زیاد هم مبتدی نیستند :wink: فکر نمیکنم راهی باشه که بشه این برنامه رو از لیست Processes مخفی کرد .

خدمت اینپرایز عزیز هم عرض کنم که این برنامه قراره خودش از یه برنامه دیگه محافظت کنه :(

تنها کاری که تونستم انجام بدم اینه که برنامه بدون هیچ مقاومتی بسته بشه ولی در رویداد OnClose اون دوباره برنامه اجرا بشه !

تا اونجای که میدونم در WinNT شما نمیتونید هیچ Process رو مخفی کنید.
پیشنهاد میکنم برنامه بنویسید که از Ring 1 بیاد بالا (در win98 از Ring 0) و اونجوری میتونید کنترل بیشتری داشته باشید ، در Win98 باید VxD بنویسید
و فکر میکنم در WinNT با Service از نوع Device میتونید برنامه تون پیاده کنید که Kill نشه .

ارادتمند
مشاطان

houshmand
چهارشنبه 12 آذر 1382, 08:37 صبح
تا اونجای که میدونم در WinNT شما نمیتونید هیچ Process رو مخفی کنید.
پیشنهاد میکنم برنامه بنویسید که از Ring 1 بیاد بالا (در win98 از Ring 0) و اونجوری میتونید کنترل بیشتری داشته باشید ، در Win98 باید VxD بنویسید
و فکر میکنم در WinNT با Service از نوع Device میتونید برنامه تون پیاده کنید که Kill نشه .
آقای مشاطان اگه ممکنه در این مورد بیشتر توضیح بدهید که این گونه برنامه ها چگونه نوشته می شوند
اگه مثال کوچیکی داشته باشید هم که چه بهتر
موفق باشید

said ali
چهارشنبه 12 آذر 1382, 12:53 عصر
با سلام
Ring????!!!!! :?: :?: :?: :!: :!: :!: :!:
لطفا بیشتر توضیح بدین(مثال هم داشته باشه).
با تشکر.

Inprise
چهارشنبه 12 آذر 1382, 13:29 عصر
(احتمالا) مفهوم آن این است که Owner پروسه شما یک ماژول سطح کرنل باشد . در همین بخش آقای خجسته سوالی مرتبط با همین مفهوم پرسیده بودند که جواب رو میتونید مفصلا همونجا پیدا کنید

موفق باشید

Mashatan
چهارشنبه 12 آذر 1382, 15:15 عصر
راستش این اطلاعات من روی تجربه هست و ممکنه ناقص باشه !
ویندوز 4 تا Ring داره که در Win9xو WinME فقط از دو Ring استفاده میشه Ring در حقیقت لایه های هستن که دسترسی به منابع رو مشخص میکنن پایین ترین لایه برای Ring 0 هست که در Win9x/ME میتونید با VxD به آنها دسترسی داشته باشید VxD ها معمولا برای نوشتن Driverها استفاده میشن و بدلیل اینکه به همه منابع بدون قید شرط دسترسی دارند برای همین برای نوشتن VM مناسب هستند.
این مطلب رو در این رابطه پیدا کردم که فقط Win9x هست و مال 1994 هست :shock:
http://www.byte.com/art/9411/sec9/art4.htm

Ring های که در Win9x استفاده میشه.
Ring 0 : Kernel&Device
Ring 1 : استفاده نمیشه
Ring 2 : استفاده نمیشه
Ring 3 : Application

در مورد WinNT قضیه کاملا فرق میکنه WinNT کاملا از همه Ring ها استفاده میکنه در WinNT دیگه VxD نداریم و بجای اون از Service استفاده میکنیم.
Ring 0 : Kernel
Ring 1 : Device
Ring 2 : نمی دونم (ولی فکر کنم Service های System باشند )
Ring 3 : Application

اینو داشته باشید فعلا برای Switch روی Ring 0 هست در WinNT هست http://www.anticracking.sk/Articles/Ring0.txt کم کم دنبالش میگردم و اینجا قرار میدم.
خودم چندتای نوشتم ولی نمیدونم کجاست :roll:

ارادتمند
مشاطان

Mashatan
پنج شنبه 13 آذر 1382, 23:54 عصر
این برای مخفی کردن Process در Win9x هست !
http://mashatan.free-host.com/source/HIDDEN.ZIP
با اسمبلی هست

ارادتمند
مشاطان

Kambiz
جمعه 14 آذر 1382, 01:05 صبح
معادل کد اسمبلی بالا در دلفی:


function RegisterServiceProcess(dwProcessId: DWORD; dwType: DWORD): BOOL;
stdcall; external Kernel32 name 'RegisterServiceProcess';

const
RSP_UNREGISTER_SERVICE = 0;
RSP_SIMPLE_SERVICE = 1;


procedure TForm1.HideProcessClick(Sender: TObject);
begin
RegisterServiceProcess(GetCurrentProcessId, RSP_SIMPLE_SERVICE);
end;

procedure TForm1.UnhideProcessClick(Sender: TObject);
begin
RegisterServiceProcess(GetCurrentProcessId, RSP_UNREGISTER_SERVICE);
end;
البته همونطور که علی گفت این کد فقط در Win9x کار می‌کنه.

said ali
شنبه 15 آذر 1382, 16:51 عصر
با سلام
با تشکر فراوان ادامه بدید و لطفا برای سوئیچ کردن به Ring ها در دلفی کد بدید.