PDA

View Full Version : سوال: جلوگيري از بسته شدن برنامه حتي با TaskManager



eiman_ghasemy
سه شنبه 26 شهریور 1387, 06:03 صبح
سلام
مي خواستم ببينم چطوري مي تونم از بسته شدن برنامم جلوگيري كنم. يعني اين كه برنامه ي من به پايان نرسه تا وقتي كه خودم بخوام حتي به وسيله ي End Task تو Task Manager هم بسته نشه. مثل بعضي از آنتي ويروس ها كه هسته ي آنتي ويروس هميشه اجراست و End Task هم نميشه يا بعضي از پروسه هاي خود وينوز كه هرچي End Task مي كني بسته نمي شه و هنوز اجراست

ممنون

sinpin
سه شنبه 26 شهریور 1387, 08:45 صبح
بهتره يك سرويس بنويسيد وگرنه ديدن برنامه اي كه بسته نميشود براي كاربر خوشايند نيست

h.jaza
سه شنبه 26 شهریور 1387, 14:50 عصر
با تشکر از ایمان جان به خاطر طرح سوالی که من هم خودم خیلی دنبالش بودم و سینا جان به خاطر جوابشون.

ولی من سرویس نوشتن رو بلد نیستم. اگر سینا جان یا بقیه دوستان لطف کنن و راهنمایی کنن یا لینک خوبی وسش بذارن، ممنون میشم.

با تشکر

علیرضا مداح
سه شنبه 26 شهریور 1387, 23:08 عصر
سلام دوست عزیز،

بهتره يك سرويس بنويسيد وگرنه ديدن برنامه اي كه بسته نميشود براي كاربر خوشايند نيست


(http://www.c-sharpcorner.com/UploadFile/mahesh/window_service11262005045007AM/window_service.aspx)CsharpCorner - Creating a Windows Service in C# (http://www.c-sharpcorner.com/UploadFile/mahesh/window_service11262005045007AM/window_service.aspx)
(http://www.c-sharpcorner.com/UploadFile/mahesh/window_service11262005045007AM/window_service.aspx)

eiman_ghasemy
چهارشنبه 27 شهریور 1387, 05:42 صبح
سلام
خيلي ممنون از مطالب مفيدتون
ميشه يكم بيشتر در مورد سرويس ها توضيح بدين.(به چه دردي مي خورند كجا و چه موقع استفاده مي شوندو...)

اگه ممكنه مي خواستم جواب اون سوال اول را هم بدين كه چه جوري از بسته شدن يه برنامه جلوگيري كنيم.

ممنون

sinpin
چهارشنبه 27 شهریور 1387, 09:00 صبح
ميشه يكم بيشتر در مورد سرويس ها توضيح بدين.(به چه دردي مي خورند كجا و چه موقع استفاده مي شوندو...)
سرويس ها، برنامه هايي هستند بدون UI كه ميتوانند در مدت حيات سيستم عامل (از بوت تا shutdown) و بدون هيچ مشكلي در پشت زمينه كار كنند.
براي مثال همان آنتي ويروسهايي كه مثال زديد، اكثرا بصورت سرويس هاي ويندوز پياده سازي ميشوند.
مزيت استفاده از سرويس ها اين است كه برخي محدوديت هاي winapp را پوشش ميدهند. براي مثال : سرويس شما قبل از لاگين به ويندوز نيز ميتواند شروع بكار كند.

جهت اطلاع بيشتر :
http://en.wikipedia.org/wiki/Windows_service

eiman_ghasemy
چهارشنبه 27 شهریور 1387, 15:33 عصر
سلام
خيلي ممنون از توضيحات همگي.
اين سرويس رو كه گفتين يكم با هاش كار كردم ولي باز هم به وسيله Task Manager مي تونيم سرويسي كه نوشتيم را End كنيم.
من ميخوام برنامه اي بنويسم كه نشه با Task Manager يا برنامهاي مشابه با اون ، برنامم رو بست. مي خوام فقط وقتي كه خودم خواستم برنامم بسته شه و به پايان برسه. نمي خوام برنامه من با Task Manager بسته شه و به پايان برسه.(وقتي پروسه مربوط به برنامم را End Task كردم بسته نشه مثل winlogon.exe يا برخي از آنتي ويروسها كه هر چي end ميكنيم باز هم در حال اجرا هستندو اصلا بسته نميشن)

لطفا راهنمايي كنيد
خيلي ممنون

vcldeveloper
چهارشنبه 27 شهریور 1387, 23:12 عصر
برای این کار باید تابع TerminateProcess را Hook کنید

eiman_ghasemy
پنج شنبه 28 شهریور 1387, 07:06 صبح
ميشه بيشتر توضيح بدين
يا يه مثال بزنيد
ممنون

vcldeveloper
جمعه 29 شهریور 1387, 01:45 صبح
ميشه بيشتر توضيح بدين
يا يه مثال بزنيد
متاسفانه من تجربه خاصی در #C ندارم، ولی مطمئنا دوستانی که در کار با این زبان و سکوی دات نت تبحر دارند، می تونند برای شما مثالی از هوک کردن یک تابع API بزنند.

eiman_ghasemy
جمعه 29 شهریور 1387, 12:23 عصر
سلام
از همگي دوستان متشكرم به خاطر راهنمايي هاشون.

اگه كسي هست كه در اين مورد مطلبي و منبع مفيدي داره لطفا بهم معرفي كنه.منابع و مراج به زبان انگليسي هم باشه مهم نيست.

خيلي ممنون

SMRAH1
جمعه 29 شهریور 1387, 14:29 عصر
سلام

یک راه دیگر ایجاد دو سرویس است که همدیگر روچک کنند.اگر یکی از اونها بسته شد،بلافاصلهٍ سرویس دیگر اون رو راه اندازی کنه.

البته این نظر خیلی خامه و باید کمی بیشتر فکر بشه

linux
جمعه 29 شهریور 1387, 16:08 عصر
سلام
از همگي دوستان متشكرم به خاطر راهنمايي هاشون.

اگه كسي هست كه در اين مورد مطلبي و منبع مفيدي داره لطفا بهم معرفي كنه.منابع و مراج به زبان انگليسي هم باشه مهم نيست.

خيلي ممنون
اگر دنبال این هستید که دستگاهی ساختید که فقط برنامه شما بر روی آن اجرا گردد از ویندز امبدد استفاده کنید

Amir Oveisi
جمعه 29 شهریور 1387, 16:41 عصر
دوست عزیز اگر از Hooking‌ استفاده نکنید به هر حال کاربر خواهد توانست برنامه شما را close‌ کند. حالا n تا هم سرویس برای چک کردن داشته باشید هیچ فرقی نخواهد کرد.

این مثال از Hooking رو ببینید. (http://www.codeproject.com/KB/system/CSLLKeyboard.aspx)

موفق باشید

eiman_ghasemy
شنبه 30 شهریور 1387, 05:39 صبح
بازهم سلام و ممنون از همگي دوستان

خواهش مي كنم يه نفر لطف كنه يه راه مناسب براي اين كار به من معرفي كنه.
؟؟

ممنون

esmartiz_red
شنبه 30 شهریور 1387, 14:14 عصر
به این لینک یه نگاه بنداز فکر می کنم کمکت کنه
http://www.codeproject.com/KB/system/preventclose.aspx?fid=15200&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2171466&fr=26

h.jaza
یک شنبه 31 شهریور 1387, 22:13 عصر
با سلام مجدد

ببخشید که یکم دیر دارم جواب میدم.

من راجع به اون قسمتی که درباره ساخت سرویس بود، سوال داشتم.

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

در واقع توی اون مرحله ی سومی که آقای مداح، لینک گذاشته بودن با مشکل برخوردم.

اگر دوستان کمک کنن، ممنون میشم.

با تشکر

MFiRE
یک شنبه 31 شهریور 1387, 22:49 عصر
سلام

یه مقاله !

می تونه کمک کنه.

به زبانه Vb هست ! ولی مشکلی نیست ! اصل روش هست!

لینک :




http://barnamenevis.org/forum/showthread.php?t=80102

eiman_ghasemy
سه شنبه 02 مهر 1387, 07:57 صبح
به این لینک یه نگاه بنداز فکر می کنم کمکت کنه
http://www.codeproject.com/KB/system/preventclose.aspx?fid=15200&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2171466&fr=26

اين كه گفتين خوب بود و پروسه را در ليست پروسه هاي Task Manager نشان نمي داد اما زبانش سي شارپ نبود. من نتونستم تو سي شارپ ازش استفاده كنم. اگه كسي همچين نمونه اي تو سي شارپ داره معرفي كنه تا استفاده كنيم.

خيلي ممنون

h.jaza
سه شنبه 02 مهر 1387, 10:04 صبح
خوب تبدیلش کنین. این چند تا لینک رو آقای مداح در یه بخشی گذاشته بودن که من اینجا وستون میذارم:


http://www.ellkay.com/ConvertVB2CSharp.htm
http://www.2unreal.com/DotNet/Converter.aspx
http://www.deluxsoftware.com/DeluxCSDEMO.zip

eiman_ghasemy
پنج شنبه 04 مهر 1387, 06:21 صبح
خوب تبدیلش کنین. این چند تا لینک رو آقای مداح در یه بخشی گذاشته بودن که من اینجا وستون میذارم:


http://www.ellkay.com/ConvertVB2CSharp.htm
http://www.2unreal.com/DotNet/Converter.aspx
http://www.deluxsoftware.com/DeluxCSDEMO.zip


ممنون
اما اگه دقت كنيد سورسهاش به زبان vb.net يا يكي از زبان هاي .net نيست كه بشه به سي شارپ تبديلش كرد.
فكر كنم به زبان C++ باشه .
اگه كسي ميتونه تو سي شارپ كاري كنه كه يه پروسه در ليست پروسه هاي Task Manager نشان داده نشه لطفا راهنمايي كنه.

ممنون

DAMAVAND
پنج شنبه 04 مهر 1387, 06:30 صبح
البته يه راه ميانبر هم تو ويندوز Xp هست . براي اين کار ميتونيد اسم برنامتون رو يکي از
پروسس هاي سيستمي ويندوز مثل Csrss.exe و يا winlogon.exe بزاريد.Task Manager نميتونه اينها رو بنده !

eiman_ghasemy
جمعه 05 مهر 1387, 04:57 صبح
البته يه راه ميانبر هم تو ويندوز Xp هست . براي اين کار ميتونيد اسم برنامتون رو يکي از
پروسس هاي سيستمي ويندوز مثل Csrss.exe و يا winlogon.exe بزاريد.Task Manager نميتونه اينها رو بنده !

ممنون اين راه رو دوستان قبلا گفتن.
به غير از اين دو راه كه در پايين گفتم ، هركس راه ديگه اي بلده لطفا راهنمايي كنه.
1- ايجاد دوتا پروسه يا سرويس كه هم ديگرو چك كنند.
2- ايجاد پروسه هايي كه همنام با پروسه هاي و سرويس هاي ويندوز باشند كه Task Manager نتونه اونارو ببنده.

ممنون

majid325
جمعه 05 مهر 1387, 05:11 صبح
ببخشيد، اگه بگي ميخواي چي كار كني شايد يه راه ديگه اي بتونم بهت پيشنهاد بدم.

Xcalivorse
جمعه 05 مهر 1387, 11:33 صبح
می تونی کاری کنی که در زمان اجرای برنامه ات TaskManager باز نشه. اگه می خواهی بگو تا روشش رو برات بزارم.

newgoldenman
جمعه 05 مهر 1387, 15:11 عصر
می تونی کاری کنی که در زمان اجرای برنامه ات TaskManager باز نشه. اگه می خواهی بگو تا روشش رو برات بزارم.

سلام
اين بحث بحث خيلي جالبيه تا اينجاشو كه خوندم.

ميشه خواهش كنم اين روشتونو اعلام كنيد؟ ممنون ميشم

majid325
شنبه 06 مهر 1387, 03:12 صبح
ببين اين لينك زير نحوه ساخت TaskManager هست شايد يه چيزهاي توش باشه كه بدردت بخوره.
http://http://gstsoftware.blogfa.com/post-34.aspx

h.jaza
یک شنبه 07 مهر 1387, 14:37 عصر
مجید جان اولا لینکی رو که دادین اصلاح کنین، چون اضافات داره.:لبخند:

و ثانیا این صرفا آموزش ساخت Task Manager هستش و هیچ ارتباطی به Hide کردن یه پروسه در تسک منجر نداره.

SMRAH1
یک شنبه 07 مهر 1387, 23:57 عصر
تا اونجایی که اطلاعات من یاری می کنه،taskkill هر proccess ای رو می بنده ،در ضمن به نظر می رسه که این بحث کلا از #C خارج شده و باید در تالار های مربوط به مدیریت ویندوز پیگیر شود(شاید به جایی برسد).در هر حال دوستان اینگونه تالار ها، اطلاعاتشون بیشتر است.

eiman_ghasemy
پنج شنبه 11 مهر 1387, 05:39 صبح
ببخشيد، اگه بگي ميخواي چي كار كني شايد يه راه ديگه اي بتونم بهت پيشنهاد بدم.

من ميخوام كاري كنم كه برنامه من توسط Task manager يا برنامه هاي شبيه به او بسته نشه .
دوستان دوتا راه ارائه كردند
1-ايجاد دوتا پروسه يا سرويس كه همديگرو چك كنند.
2-ايجاد پروسه اي كه همنام با پروسه هايي باشه كه Task manager نمي تونه او نا رو ببنده.

اگه كسي راهي به غير از اين ها بلده راهنمايي كنه. (مثلا كاري كنيم كه پروسه ما اصلا تو ليست پروسه هاي Task manager نشون داده نشه) يا روش هاي ديگه.

ممنون

h.jaza
پنج شنبه 11 مهر 1387, 11:13 صبح
به نظر من هیچ راهی به غیر از راه اولی که خودتون اشاره کردین، بهترین راه نیست. :لبخند:

چرا که اولا، اگر ما به عنوان مثال تونستیم کاری کنیم که سرویس ما (برنامه) توی مثلا Task Manager و سایر برنامه های مثل اون، نشون داده نشه (به اصطلاح Hide ش کنیم)؛ حالا اگر ما خودمون بیایم و یه تسک منجر بنویسیم که بیاد و کلیه سرویس های در حال اجرا رو توی مثلا یه لیست باکس بهمون نشون بده، اونوقته که دیگه باید بریم جهنم... :شیطان:

و ثانیا اگر هم، همنام با پروسه های سیستمی باشه، بازهم با همون برنامه ای که خودمون نوشتیم، می تونیم ببندیمش؛ لذا این کار هم بی نتیجه باقی خواهد ماند. :قهقهه:

پس نتیجه می گیریم که راهی (احتمالا البته) غیر از اینکه با دو تا پروسه، کار رو انجام بدیم، نمی مونه.

دوستان اگر اشتباه می کنم، بگید.

با تشکر

vcldeveloper
پنج شنبه 11 مهر 1387, 13:22 عصر
پس نتیجه می گیریم که راهی (احتمالا البته) غیر از اینکه با دو تا پروسه، کار رو انجام بدیم، نمی مونه.

دوستان اگر اشتباه می کنم، بگید.
اگر در این مدت وقت خودتان را صرف یادگیری چگونگی Hook کردن یک تابع API ویندوز بوسیله #C کرده بودید، این تاپیک به صفحات سوم و چهارم کشیده نمیشد. البته احتمال داره مجبور بشید برای همچین کاری از PInvoke و حتی کدهای unmanaged استفاده کنید. طبیعی هم هست، چون دارید درباره یک قابلیت خاص در یک پلت فرم خاص صحبت می کنید، پس مستقل از پلت فرم بودن، و کد مدیریت شده خیلی نمیتونه جایگاهی در بحث داشته باشه.

h.jaza
پنج شنبه 11 مهر 1387, 13:41 عصر
اگر در این مدت وقت خودتان را صرف یادگیری چگونگی Hook کردن یک تابع API ویندوز بوسیله #C کرده بودید، این تاپیک به صفحات سوم و چهارم کشیده نمیشد.
کاملا درسته ولی همون طور که خودتون هم میگید:

البته احتمال داره مجبور بشید برای همچین کاری از PInvoke و حتی کدهای unmanaged استفاده کنید.
پس نتیجه میگیریم که شاید یکم بهتر باشه بجای همچین کاری که به استفاده از کدهای مدیریت نشده مینجامه، از تفکر دیگه ای استفاده بکنیم. اینطوری نیست؟

طبیعی هم هست، چون دارید درباره یک قابلیت خاص در یک پلت فرم خاص صحبت می کنید، پس مستقل از پلت فرم بودن، و کد مدیریت شده خیلی نمیتونه جایگاهی در بحث داشته باشه.
لطفا بیشتر توضیح بدین.

آیا این قابلیت خاصی هست؟؟؟؟؟؟؟ فکر نمی کنم تا این حد باشه.

پلت فرم هم متوجه نمی شم. به هر حال شما هر برنامه ای که با ویژوال استودیو می نویسین، قرار نیست که در سیستم عامل های دیگه کار بکنه که حالا این یکی بخواد استثنا باشه. غیر از اینه؟

vcldeveloper
پنج شنبه 11 مهر 1387, 18:03 عصر
پلت فرم هم متوجه نمی شم. به هر حال شما هر برنامه ای که با ویژوال استودیو می نویسین، قرار نیست که در سیستم عامل های دیگه کار بکنه که حالا این یکی بخواد استثنا باشه. غیر از اینه؟
یکی از اهداف دات نت این هست که حداقل از نظر تئوریک قابلیت Cross-platform را داشته باشه. الان هم همینطور هست، عملا اگر برای یک پلت فرم خاص CLI کاملا پیاده سازی بشه، باید بتوان کد دات نت نوشته شده به یکی از زبان های دات نتی را روی آن پلت فرم اجرا کرد. بخصوص که استاندارد CLI باز هست و هر کسی میتونه آن را پیاده سازی کنه، البته کار آسانی نخواهد بود. نمونه اش پروژه MONO در لینوکس هست.


پس نتیجه میگیریم که شاید یکم بهتر باشه بجای همچین کاری که به استفاده از کدهای مدیریت نشده مینجامه، از تفکر دیگه ای استفاده بکنیم. اینطوری نیست؟
نه، چون در این زمینه خاص که به امنیت مربوط میشه، شما مجبورید فراتر از کد مدیریت شده عملی را انجام بدید. از طرفی، در طراحی دات نت سعی شده که حتی المکان کلاس ها و متدهای آنها وابسته به پلت فرم نباشند، یعنی مثلا بجای فراخوانی یک تابع API، دات به شما یک کلاس با یک متد مشخص میده، این کلاس و متدهاش می تونند در لایه های سطح پایین برنامه نهایتا یکی از توابع API سیستم عامل را اجرا کنند، ولی اون توابع از دید شما مخفی هست و شما مستقیما به آنها دسترسی ندارید، پس اگر روزی لازم شد که این کد به پلت فرم دیگه ایی منتقل بشه، فقط کافی هست که اون لایه سطح پایین تغییر کنه و مثلا بجای توابع API ویندوز، از توابع API لینوکس برای اون کار خاص استفاده بشه، ولی کد شما که روی آن لایه سطح پایین بنا شده، بدون تغییر باقی خواهد ماند.
وقتی از PInvoke استفاده می کنید، عملا برنامه خود را به پلت فرم مورد نظر گره میزنید، یعنی شما مستقیما از یکی از قابلیت های پلت فرم استفاده کردید که فقط خاص همان پلت فرم هست، یا اگر هم در سایر پلت فرم ها وجود دارد، خیلی متفاوت از پلت فرم فعلی هست. در این صورت، دیگه کد شما قابل انتقال به سایر پلت فرمها نخواهد بود.
در این مورد خاص هم شما دارید از یک ویژگی خاص در ویندوز استفاده می کنید. این ویژگی به این شکل در لینوکس یا سایر پلت فرم ها وجود نداره. از طرفی Hook کردن یک تابع API یک کار سطح پایین محسوب میشه و چارچوبی مثل دات نت فریم ورک برای همچین کاری ساخته نشده. اینجا هست که شما می تونید خودتون رو قالب اون فریم ورک خارج کنید، و کد مربوطه را مستقیما با اتکا به APIهای ارائه شده توسط سیستم عامل بنویسید.
کلیه راههایی که مطرح شدند، هر چند در محدوده در چارچوب دات نت بودند، ولی راهکارهای ناقصی محسوب می شوند که یا وابسته به برنامه خاصی (مثل Task Manager ویندوز) هستند، یا کاربر میتونه با کمی خلاقیت آنها را دور بزنه. مطمئن ترین و کاملترین کار Hook کردن تابع API مربوطه هست. چون در سیستم عاملی مثل ویندوز، کاربر هر روشی برای بستن برنامه بکار بگیره، نهایت باید در اون روش به یک یا چند تابع API خاص برسه که عمل بستن برنامه را براش انجام بدند. اگر این توابع Hook بشند، کاربر فقط در صورتی میتونه موفق بشه که یا یک Exploit در ویندوز برای این منظور پیدا کنه، یا از سطحی پایین تر اقدام کنه، مثلا بنوعی کدی بنویسه که Hook شما را از بین ببره، یا با توجه به این که کد شما در لایه User Mode اجرا میشه، کاربر کدی بنویسه که از Kernel Mode اقدام کنه. مسلم هست که هر چی در این ساختار سلسله مراتبی پایین تر بریم (به کرنل نزدیگ تر بشیم) سطح دسترسی های مورد نیاز کاربر، و دانش فنی مورد نیاز افزایش پیدا میکنه، مثلا در Kernel Mode کاربر باید یا خودش یک درایور ویندوز بنویسه، یا از برنامه ایی استفاده کنه که در سطح کرنل اون کار رو براش انجام بده، از طرفی نوع حساب کاربری اش هم باید بگونه ایی باشه که دسترسی کاملی به سیستم داشته باشه.
با این تفاسیر، پایین تر سطح در سطح User Mode همین توابع API و Hook کردن آنها ست. هر چه پایین تر برید، جامعیت کد شما بیشتر میشه، ولی سختی آن هم به همون نسبت افزایش پیدا میکنه.

amir001
یک شنبه 15 دی 1387, 13:58 عصر
از اینکه جوابها را کامل نخوندم و دارم جواب میدهم باید ببخشید. شاید قبل از من کسی ذکر کرده باشد.

دوست عزیز به نظر من بهتیرن کار اجرای دو برنامه هست .

شما هنگامی که فایل اصلی اجرا میشود به واسطه ی آن یک برنامه ی دیگر را نیز اجرا میکنید. هر چند ثانیه یک بار اجرای دیگر برنامه ها چک میشود و در صورت از بین رفتن یک برنامه دوباره آن را اجرا میکنید.

به این شکل:
دو بر نامه با نامهای pro1 و pro2 اجرا میکنید.
اگر pro1 بسته شود مجدد توسط pro2 اجرا میشود. و بلعکس.
فکر کنم این راه جواب بدهد.

h.jaza
یک شنبه 15 دی 1387, 14:04 عصر
دوست عزیز جوابتون قبلا مطرح شده و کلی هم روش بحث شده و به چالش کشیده شده.

خواهشا از این به بعد قبل از پاسخ گویی یا طرح سوال جدید حتما مطالب از پیش نوشته شده رو مطالعه کنید و سرچ کنید.

با تشکر

it.dadkhah
دوشنبه 06 آذر 1391, 16:00 عصر
من یه بازی انلاین ساختم که تعداد برد و باخت هر بازکن ثبت میشه.
بعضی از کاربرا وقتی می بینند دارند می بازن وسط بازی برنامه رو end process می کنند.
روشی که دو برنامه هم دیگه رو اجرا کنند جواب نمیده چون در اینجا هدف اینه که بازی بسته نشه یا اگرم بشته میشه قبلش یه دونه به تعداد باخت های کاربر اضافه کنه.

پس این روش جواب گو برای بعضی برنامه ها از قبیل برنامه ی من نیست.

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

باتشکر از همه ی دوستان