PDA

View Full Version : سوال: چگونه نرم افزار قفل ساز برنامه های ویندوزی بسازیم ؟



dele_ghamgin_2008
شنبه 16 خرداد 1394, 23:27 عصر
سلام. نرم افزاری است به اسم Program Protector . این برنامه یه نرم افزار قفل گذار روی نرم افزارهای نصب شده روی ویندوز هست . چگونه می توان با سی شارپ نمونه این برنامه را ساخت ؟

pbm_soy
یک شنبه 17 خرداد 1394, 02:16 صبح
اول از همه این برنامه بروی نرم افزارهای شما قفل نمیگذارد در واقع این برنامه بصورت یک سرویس نوشته شده است یا برنامه ای است که پس از اجرا در حافظه مقیم میمانند و هر وقت شما خواستید نرم افزاری را که قبلا توسط این برنامه براش رمز مشخص کردید را خواستید اجرا کنید جلوی اجرا را میگیرد و از شما رمز را میخواهد، رمز داده شده را با رمز ثبت شده در دیتابیس خودش چک میکند و اگر درست باشد اجازه اجرا را میدهد
پس این برنامه قفل گذار بروی نرم افزارها نمیباشد میتوان بهش اسم نرم افزار حفاظت از نرم افزارها را داد در واقع از نرم افزارها با یک رمز محافظت میکند و اگر این برنامه را از ویندوز حذف کنید و یا حتی فقط سرویسش را از اجرا دربیارید (اگر بتوانید) آن برنامه های محافظت شده براحتی اجرا میشوند و رمزی از شما نمیپرسند!

دوم بریم سراغ نوشتن چنین برنامه ای:
* بله چنین برنامه ای را با سی شارپ میتوان نوشت (کار زیاد سختی نمیباشد مخصوصا با سی شارپ) برای اینکار پیشنهاد میدم یک برنامه تحت ویندوز شروع کنید بطوریکه تمام برنامه هایی که قرار است اجرا بشوند را مانیتور کند و اگر قبلا برای آنها رمز ثبت شده باشد برنامه توسط یک فرم رمز را سوال کند و اگر درست باشد برنامه را اجرا کند (البته یک بخش هم نیاز دارید که برای یک برنامه رمز ثبت کند این بخش هم نباید کار خاصی داشته باشد) فقط بعداز اینکه اینکارها را موفقیت آمیز انجام دادید بایدآن برنامه را تبدیل کنید به سرویس یا درواقع باید برنامه را بصورت سرویس بنویسید
* کلا نوشتن برنامه های امنیتی با سی شارپ یا کلا با زبانهای دات نتی کار جالبی نیست بنابه دلایل زیر
** اولا برنامه های دات نتی براحتی Decompile میشوند و از طریق سورس برنامه عملکرد برنامه و الگوریتمهای رمزنگاری و بقیه موارد مشخص میشوند (هرچند که راههای وجود دارد که بشه این پراسس را دشوار کرد ولی باز هم .....)
** چنین برنامه ای چون عملکرد ویندوز را کنترل میکند (در بخش اجرای برنامه ها) پس بهتر است که برنامه ها در سطح کرنل نوشته شود تا امنیت بالاتر به خود بگیرد! (با سی شارپ چنین کاری امکان پذیر نیست تا انجائی که من میدانم )

pbm_soy
یک شنبه 17 خرداد 1394, 02:23 صبح
در ضمن یک مورد دیگر یادم رفت بگم اونم اینه که برنامه ای که بخواهد قفل گذار بروی برنامه های دیگر باشد قاعدتا اینطور باید باشد که وقتی را رمزی را بروی برنامه گذاشت آن رمز برای همیشه بروی آن بماند و نیازی به در حال اجرا بودن و یا نبودن برنامه رمزگذار نداشته باشد!
برای چنین کاری باید به روش ویروسها و یا نرم افزارهای Patch کننده (کرک کننده نرم افزارها) عمل باید بکند یعنی به ابتدای نرم افزاری که قرار است به آن رمز گذاشته شود یک تیکه کد که رمز را سوال میکند را اضافه کند! تا وقتی برنامه شما اجرا شد آن تیکه کد اضافه شده اول اجرا میشود پس رمز سوال میشود و در صورت درست بودن برنامه ادامه پیدا میکند و اگر درست نباشد آن تیکه کد برنامه را از اجرا خارج میکند
ناگفته نماند که رمز هم در لابه لای آن تیکه کد میتواند ذخیره شود!

dele_ghamgin_2008
یک شنبه 17 خرداد 1394, 12:29 عصر
در ضمن یک مورد دیگر یادم رفت بگم اونم اینه که برنامه ای که بخواهد قفل گذار بروی برنامه های دیگر باشد قاعدتا اینطور باید باشد که وقتی را رمزی را بروی برنامه گذاشت آن رمز برای همیشه بروی آن بماند و نیازی به در حال اجرا بودن و یا نبودن برنامه رمزگذار نداشته باشد!
برای چنین کاری باید به روش ویروسها و یا نرم افزارهای Patch کننده (کرک کننده نرم افزارها) عمل باید بکند یعنی به ابتدای نرم افزاری که قرار است به آن رمز گذاشته شود یک تیکه کد که رمز را سوال میکند را اضافه کند! تا وقتی برنامه شما اجرا شد آن تیکه کد اضافه شده اول اجرا میشود پس رمز سوال میشود و در صورت درست بودن برنامه ادامه پیدا میکند و اگر درست نباشد آن تیکه کد برنامه را از اجرا خارج میکند
ناگفته نماند که رمز هم در لابه لای آن تیکه کد میتواند ذخیره شود!

سلام همکار عزیز . من هم میدانم که چگونه این نرم افزار ها عمل میکنند . سوال من این است که چگونه می توان این کار رو انجام داد ؟ چگونه می تواند از اجرای برنامه جلوگیری نمود ؟

Javad_raouf
یک شنبه 17 خرداد 1394, 12:56 عصر
[Flags]
public enum ThreadAccess : int
{
TERMINATE = (0x0001),
SUSPEND_RESUME = (0x0002),
GET_CONTEXT = (0x0008),
SET_CONTEXT = (0x0010),
SET_INFORMATION = (0x0020),
QUERY_INFORMATION = (0x0040),
SET_THREAD_TOKEN = (0x0080),
IMPERSONATE = (0x0100),
DIRECT_IMPERSONATION = (0x0200)
}


[System.Runtime.InteropServices.DllImport("kernel32.dll")]
static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
static extern uint SuspendThread(IntPtr hThread);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
static extern int ResumeThread(IntPtr hThread);


private static void SuspendProcess(int pid)
{
var process = System.Diagnostics.Process.GetProcessById(pid);


if (process.ProcessName == string.Empty)
return;


foreach (System.Diagnostics.ProcessThread pT in process.Threads)
{
IntPtr pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id);


if (pOpenThread == IntPtr.Zero)
{
continue;
}


SuspendThread(pOpenThread);


//CloseHandle(pOpenThread);
}
}


public static void ResumeProcess(int pid)
{
var process = System.Diagnostics.Process.GetProcessById(pid);


if (process.ProcessName == string.Empty)
return;


foreach (System.Diagnostics.ProcessThread pT in process.Threads)
{
IntPtr pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id);


if (pOpenThread == IntPtr.Zero)
{
continue;
}


var suspendCount = 0;
do
{
suspendCount = ResumeThread(pOpenThread);
} while (suspendCount > 0);


//CloseHandle(pOpenThread);
}
}
فقط توی گوگل سرچ کردم :

Suspend Process C#
قصد جسارت ندارم ولی اگر دوست داشتین این تاپیک رو هم مطالعه کنید
آموزش: کی می خواد به جای درخواست ماهی، ماهیگیری یاد بگیره؟ (http://barnamenevis.org/showthread.php?496437-%DA%A9%DB%8C-%D9%85%DB%8C-%D8%AE%D9%88%D8%A7%D8%AF-%D8%A8%D9%87-%D8%AC%D8%A7%DB%8C-%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA-%D9%85%D8%A7%D9%87%DB%8C%D8%8C-%D9%85%D8%A7%D9%87%DB%8C%DA%AF%DB%8C%D8%B1%DB%8C-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%D9%87%D8%9F)

dele_ghamgin_2008
یک شنبه 17 خرداد 1394, 18:51 عصر
ممنونم آقا جواد . ولی چطور میتونم بهش برنامه رو بدم ؟

زیرا ورودی که میخواد دریافت کنه از نوع اینتیجر هست !!!


private static void SuspendProcess(int pid)

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

Javad_raouf
دوشنبه 18 خرداد 1394, 09:57 صبح
Process.ID دیگه برادر
این کد یک آرایه از لیست برنامه های در حال اجرا بر می گردونه:
System.Diagnostics.Process[] AllProgram = System.Diagnostics.Process.GetProcesses();
یک راهش اینه که:
شما به طور متوالی باید این کد رو اجرا کنی و بررسی کنی ببینی آیا برنامه مورد نظرت به لیست اضافه شده یا نه؟
اگر در لیست بود مشخصه Id شو میدی به تابع Suspend و بعد بقیه عملیات.....

ebrahim.rayatparvar
دوشنبه 18 خرداد 1394, 10:06 صبح
شما به طور متوالی باید این کد رو اجرا کنی و بررسی کنی ببینی آیا برنامه مورد نظرت به لیست اضافه شده یا نه؟
اگر در لیست بود مشخصه Id شو میدی به تابع Suspend و بعد بقیه عملیات.....


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

Javad_raouf
دوشنبه 18 خرداد 1394, 10:45 صبح
سلام
اینجا نوشتم:


یک راهش اینه که:

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

dele_ghamgin_2008
دوشنبه 18 خرداد 1394, 11:00 صبح
سلام
اینجا نوشتم:

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

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

ebrahim.rayatparvar
دوشنبه 18 خرداد 1394, 11:14 صبح
خب من میخوام با زدن باتن ، یک فایل دایالوگ باز بشه و فایل رو انتخاب کنم . حالا خودش بیاد اون نرم افزار رو غیر قابل اجرا بکنه . یعنی از قبل ما براش چیزی تعریف نکردیم.

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

Javad_raouf
دوشنبه 18 خرداد 1394, 11:21 صبح
سلام مهندس جان:چشمک:

الان این حرکت باید هر دور هی چک کنه؟؟؟راحتتر بگم یکسره داره کار میکنه و برنامه های در حال اجرا رو چک میکنه؟؟:افسرده:
یافتم یافتم
حس ارشمیدوس دارم:لبخند:
اینو تو گوگل سرچیدم:

process start event C#
یافتم
میشه به جای اینکه دائما چک کنیم از WMI استفاده کنیم
ابتدا به رفرنس های پروژه System.managment رو Add می کنیم و سپس این کد رو می نویسیم:
private System.Management.ManagementEventWatcher WatchForProcessStart(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceCreationEvent " +
"WITHIN 1 " +
" WHERE TargetInstance ISA 'Win32_Process' "
+ " AND TargetInstance.Name = '" + processName + "'";


// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";


// Create a watcher and listen for events
System.Management.ManagementEventWatcher watcher = new System.Management.ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessStarted;
watcher.Start();
return watcher;
}


private void ProcessStarted(object sender, System.Management.EventArrivedEventArgs e)
{
System.Management.ManagementBaseObject targetInstance = (System.Management.ManagementBaseObject)e.NewEvent .Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
MessageBox.Show("Start: " + processName);
}


private System.Management.ManagementEventWatcher WatchForProcessEnd(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceDeletionEvent " +
"WITHIN 1 " +
" WHERE TargetInstance ISA 'Win32_Process' "
+ " AND TargetInstance.Name = '" + processName + "'";


// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";


// Create a watcher and listen for events
System.Management.ManagementEventWatcher watcher = new System.Management.ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessEnded;
watcher.Start();
return watcher;
}


private void ProcessEnded(object sender, System.Management.EventArrivedEventArgs e)
{
System.Management.ManagementBaseObject targetInstance = (System.Management.ManagementBaseObject)e.NewEvent .Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
MessageBox.Show("End: " + processName);
}
حالا مثلا توی باتن می نویسیم:
WatchForProcessStart("notepad.exe");
این باعث میشه که هر وقت برنامه Notepad باز بشه رویداد ProcessStarted اجرا خواهد شد:لبخند:


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

ebrahim.rayatparvar
دوشنبه 18 خرداد 1394, 11:37 صبح
عالی بود:تشویق:

dele_ghamgin_2008
سه شنبه 19 خرداد 1394, 00:18 صبح
مرسی . ولی من الان متوجه نشدم این دستور چیکار میکنه ؟
WatchForProcessStart("notepad.exe");

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

Javad_raouf
سه شنبه 19 خرداد 1394, 08:48 صبح
شما در حقیقت به این کد میگی هروقت برنامه NotePad باز شد رویداد ProcessStarted فراخونی یا اصطلاحا Fire بشه
مثلا شما می تونی اینجوری بنویسی:
WatchForProcessStart("notepad.exe");
WatchForProcessStart("Paint.exe");
WatchForProcessStart("cmd.exe");
WatchForProcessStart("Taskmgr.exe");
اون وقت هر کدوم که اجرا بشن رویداد ProcessStarted فراخونی خواهد شد و شما در رویداد ProcessStarted می تونین برنامه مورد نظر رو به دستوراتی که قبلا دادم Suspend کرده و عملیاتتون رو انجام بدین:لبخندساده:

dele_ghamgin_2008
سه شنبه 19 خرداد 1394, 11:13 صبح
شما در حقیقت به این کد میگی هروقت برنامه NotePad باز شد رویداد ProcessStarted فراخونی یا اصطلاحا Fire بشه
مثلا شما می تونی اینجوری بنویسی:
WatchForProcessStart("notepad.exe");
WatchForProcessStart("Paint.exe");
WatchForProcessStart("cmd.exe");
WatchForProcessStart("Taskmgr.exe");
اون وقت هر کدوم که اجرا بشن رویداد ProcessStarted فراخونی خواهد شد و شما در رویداد ProcessStarted می تونین برنامه مورد نظر رو به دستوراتی که قبلا دادم Suspend کرده و عملیاتتون رو انجام بدین:لبخندساده:

مرسی . ولی من این توضیح شمارو میدونم اصل قسمت که چطور از
Suspend کنم رو نمیدونم . لطفا پیرامون این راهنمایی کنید .

Javad_raouf
سه شنبه 19 خرداد 1394, 11:25 صبح
من نمی فهمم شما چی میگی
نحوه Suspend کردن Process رو که توی پست 5 گذاشتم دیگه

dele_ghamgin_2008
چهارشنبه 20 خرداد 1394, 14:11 عصر
من نمی فهمم شما چی میگی
نحوه Suspend کردن Process رو که توی پست 5 گذاشتم دیگه

موضوع اینه که توی اون پست 5 ، ورودی در قالب یک اینتیجر دریافت میشه . مگه ما مقدار عددی میدیم ؟ ما داریم بهش اعلام میکنیم اسم برنامه رو . چجور میشه اونوقت ؟

juza66
چهارشنبه 20 خرداد 1394, 16:56 عصر
سلام

دوست عزیز میشه بگی کجا مقدار INT دریافت میشه؟!

Javad_raouf
چهارشنبه 20 خرداد 1394, 17:55 عصر
موضوع اینه که توی اون پست 5 ، ورودی در قالب یک اینتیجر دریافت میشه . مگه ما مقدار عددی میدیم ؟ ما داریم بهش اعلام میکنیم اسم برنامه رو . چجور میشه اونوقت ؟

آها
به نکته خوبی اشاره کردید:لبخند:
این پستت رو خوندم خوشحال شدم از اون موقع فکر می کردم اینقدر زحمت کشیدم شما هیچی متوجه نشدی حالا فهمیدم 99 درصد راه رو متوجه شدید:قلب:
این تیکه کد رو به برنامت اضافه کن حله:

public static void SuspendProcess(string ProcesssName)
{
System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName(Proc esssName);
for (int i = 0; i < prc.Length; i++)
SuspendProcess(prc[i].Id);
}
public static void ResumeProcess(string ProcesssName)
{
System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName(Proc esssName);
for (int i = 0; i < prc.Length; i++)
ResumeProcess(prc[i].Id);
}

dele_ghamgin_2008
پنج شنبه 21 خرداد 1394, 17:37 عصر
آها
به نکته خوبی اشاره کردید:لبخند:
این پستت رو خوندم خوشحال شدم از اون موقع فکر می کردم اینقدر زحمت کشیدم شما هیچی متوجه نشدی حالا فهمیدم 99 درصد راه رو متوجه شدید:قلب:
این تیکه کد رو به برنامت اضافه کن حله:

public static void SuspendProcess(string ProcesssName)
{
System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName(Proc esssName);
for (int i = 0; i < prc.Length; i++)
SuspendProcess(prc[i].Id);
}
public static void ResumeProcess(string ProcesssName)
{
System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName(Proc esssName);
for (int i = 0; i < prc.Length; i++)
ResumeProcess(prc[i].Id);
}


SuspendProcess(prc[i].Id);
ResumeProcess(prc[i].Id);


الان این دو خط رو نمی فهمه . الان برنامه من این شده :

namespace Suspend_Process{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private System.Management.ManagementEventWatcher WatchForProcessStart(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceCreationEvent " +
"WITHIN 1 " +
" WHERE TargetInstance ISA 'Win32_Process' "
+ " AND TargetInstance.Name = '" + processName + "'";




// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";




// Create a watcher and listen for events
System.Management.ManagementEventWatcher watcher = new System.Management.ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessStarted;
watcher.Start();
return watcher;
}


private System.Management.ManagementEventWatcher WatchForProcessEnd(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceDeletionEvent " +
"WITHIN 1 " +
" WHERE TargetInstance ISA 'Win32_Process' "
+ " AND TargetInstance.Name = '" + processName + "'";




// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";




// Create a watcher and listen for events
System.Management.ManagementEventWatcher watcher = new System.Management.ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessEnded;
watcher.Start();
return watcher;
}




private void ProcessStarted(object sender, System.Management.EventArrivedEventArgs e)
{
System.Management.ManagementBaseObject targetInstance = (System.Management.ManagementBaseObject)e.NewEvent .Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
MessageBox.Show("Start: " + processName);
}


private void ProcessEnded(object sender, System.Management.EventArrivedEventArgs e)
{
System.Management.ManagementBaseObject targetInstance = (System.Management.ManagementBaseObject)e.NewEvent .Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
MessageBox.Show("End: " + processName);
}


public static void SuspendProcess(string ProcesssName)
{
System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName(Proc esssName);
for (int i = 0; i < prc.Length; i++)
SuspendProcess(prc[i].Id);
}
public static void ResumeProcess(string ProcesssName)
{
System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName(Proc esssName);
for (int i = 0; i < prc.Length; i++)
ResumeProcess(prc[i].Id);
}


private void btnSuspendProcess_Click(object sender, EventArgs e)
{
WatchForProcessStart("notepad.exe");
}


private void btnResumeProcess_Click(object sender, EventArgs e)
{


}
}
}

Javad_raouf
پنج شنبه 21 خرداد 1394, 18:09 عصر
ببین شما باید کل پست پنج + کل پست 12 + کل پست 20 رو توی کدات بیاری
اینا همه به هم وصلن

dele_ghamgin_2008
پنج شنبه 21 خرداد 1394, 21:39 عصر
ببین شما باید کل پست پنج + کل پست 12 + کل پست 20 رو توی کدات بیاری
اینا همه به هم وصلن

این کار رو هم کردم . بازم اتفاقی نیوفتاد و وقتی نوت پد رو باز میکنم باز باز میشه . پروژه رو پیوست میکنم . لطفا یه نگاهی بندازید. ممنونم.

Javad_raouf
پنج شنبه 21 خرداد 1394, 22:47 عصر
سلام فردا نیستم
ان شا الله شنبه براتون برنامه کاملش رو پیوست می کنم

dele_ghamgin_2008
شنبه 23 خرداد 1394, 20:54 عصر
سلام فردا نیستم
ان شا الله شنبه براتون برنامه کاملش رو پیوست می کنم

ممنون مهندس . من همچنان منتظرم.

Javad_raouf
سه شنبه 26 خرداد 1394, 14:37 عصر
ببخشید دیر شد

dele_ghamgin_2008
سه شنبه 26 خرداد 1394, 17:50 عصر
ببخشید دیر شد

چرا وقتی برنامه رو میبندم این پیغام ظاهر میشه ؟

132332




System.Runtime.InteropServices.InvalidComObjectExc eption was unhandled Message=COM object that has been separated from its underlying RCW cannot be used. Source=System.Management StackTrace: at System.Management.IWbemServices.CancelAsyncCall_(I WbemObjectSink pSink) at System.Management.SinkForEventQuery.Cancel() at System.Management.ManagementEventWatcher.Stop() at System.Management.ManagementEventWatcher.Finalize( ) InnerException: