PDA

View Full Version : يك آموزش و پرسش در زمينه Process ها :



BORHAN TEC
شنبه 09 آبان 1388, 12:48 عصر
سلام
با استفاده از برنامه زير مي توان ليست برنامه هاي در حال اجرا را به همراه مسير به نمايش در آورد :
در ابتدا عبارت Tlhelp32 را به قسمت uses اضافه كنيد


uses




TlHelp32;




سپس يك كنترل ListView به فرم اضافه كنيد ونام آنرا به lstview_MemoryScan تغيير دهيد.

سپس روي آن كليك راست كرده و columns editor را انتخاب كنيد و سه ستون براي آن تعريف كنيد. سپس تابعي مشابه تابع زير تعريف كنيد:


procedure TForm1.ShowProcessInMemoryScanListView(aProcessID: Cardinal);





var

ListItem : TListItem;
hSnapShot : Cardinal;
Info : tagMODULEENTRY32;
// S : LongBool;
exeName : String;
Drive : String;
begin
hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, aProcessID);
Info.dwSize := SizeOf(Info);
Module32NextW(hSnapShot, Info);
exeName := info.szExePath;
Drive := ExtractFileDrive(exeName);
// if (GetDriveType(PWideChar(Drive)) = DRIVE_REMOVABLE)
// and (exeName <> Application.ExeName) then begin
ListItem := lstview_MemoryScan.Items.Add;
ListItem.Caption := exeName ;
ListItem.SubItems.Add(IntToStr(aProcessID));
if (FileGetAttr(exeName) and 2 = 2) then
ListItem.SubItems.Add('Suspious')
else
ListItem.SubItems.Add('Safe');
// end; // End Of External If Statement
CloseHandle(hSnapShot);
end;





سپس يك دكمه روي فرم بياندازيد و كد زير را درون آن بنويسيد:


procedure TForm1.MemoryScanRefreshClick(Sender: TObject);





var

hSnapShot : Cardinal;
Info : tagPROCESSENTRY32W;
S : LongBool;
// exeName : String;
begin
// sleep(100);
lstview_MemoryScan.Clear;
hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Info.dwSize := SizeOf(Info);
S := Process32FirstW(hSnapShot, Info);
while (s <> False) do
begin
Info.dwSize := SizeOf(info);
ShowProcessInMemoryScanListView(Info.th32ProcessID );
S := Process32NextW(hSnapShot,Info);
end;




حال اگر برنامه را run كنيد ليست پروسه هاي در حال اجرا را مي بينيد.


پرسش (مشكل): وقتي برنامه را از درون دلفي ران ميكنم ليست برنامه ها را به درستي نمايش مي دهد اما اگر آنرا در محيط خارج از دلفي اجرا مي كنم ليست برنامه ها را به درستي نمايش نمي دهد! به نظر شما مشكل از كجا است؟؟؟؟؟؟؟.....:متفکر::چشمک:


در ضمن از دلفي 2010 استفاده كرده ام!

Mask
شنبه 09 آبان 1388, 19:13 عصر
اینو نیگا..

BORHAN TEC
سه شنبه 12 آبان 1388, 21:30 عصر
سلام
برنامه ي مفيدي بود. ولي مشكلي كه دارد اين است كه برنامه ي شما مسير فايل را نمي تواند نشان دهد. اما برنامه اي كه من نوشتم مسير فايل را هم نشان مي دهد.
مشكل اصلي من به شرح زير است :
اگر در عكسهاي ضميمه دقت كنيد متوجه مي شويد كه اگر برنامه را در خارج از محيط دلفي اجرا كنم مسير فايل هاي در حال اجرا را نمي تواند به درستي نشان دهد. بايد بگويم كه ProcessId ها را به درستي نشان مي دهد اما مسير ونام فايل ها را نه. (به ProcessId ها ونام فايل ها در دو حالت نگاه كنيد وآنها را با دقت مقايسه كنيد تا مشكل را به درستي درك كنيد)

Felony
سه شنبه 12 آبان 1388, 21:59 عصر
فکر میکنم کامپوننت Process Info آقای کشاورز مشکلتون رو حل میکنه .

BORHAN TEC
چهارشنبه 13 آبان 1388, 07:53 صبح
moshkelam hal nashod

Fh_prg
چهارشنبه 13 آبان 1388, 09:20 صبح
برنامه ها در محيط دلفي در حالت ديباگ مود اجرا ميشن و به همين علت دسترسي DebugPrivilege به برنامه در حال اجرا داده ميشه ولي وقتي برنامه خارج از دلفي در حالت معمولي اجرا ميشه به صورت پيشفرض دسترسي DebugPrivilege نداره و تو اين حالت شما از بعضي پروسه هاي سيستمي نميتوني اطلاعات بدست بياري راهش اينه كه خودت تو برنامه قبل از هر كاري دسترسي DebugPrivilege فراهم كني...
تو MSDN دنبال اين عبارت بگرد پيداش مي كني : SeDebugPrivilege

BORHAN TEC
شنبه 16 آبان 1388, 12:00 عصر
تو MSDN دنبال اين عبارت بگرد پيداش مي كني : SeDebugPrivilege
اين مطلب رو توي msdn سرچ كردم ولي مثالش با dot net 2 بود. آيا كسي مثالي با delphi for win32 داره؟

با تشكر....

vcldeveloper
شنبه 16 آبان 1388, 13:00 عصر
آيا كسي مثالي با delphi for win32 داره؟
اگر سورس همون کامپوننت ProcessInfo را مطالعه می کردید، چگونگی کسب مجوز SeDebugPrivillage با استفاده در دلفی را در آن می دیدید.

BORHAN TEC
شنبه 16 آبان 1388, 18:08 عصر
با توجه به گفته دوستان عزيز براي كسب مجوز SeDebugPrivilege كافي است از كد زير استفاده كنيم :


function TForm1.NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;
var
hToken: THandle;
TokenPriv: TOKEN_PRIVILEGES;
PrevTokenPriv: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
begin
Result := True;
// Only for Windows NT/2000/XP and later.
if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit;
Result := False;

// obtain the processes token
if OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
try
// Get the locally unique identifier (LUID) .
if LookupPrivilegeValue(nil, PChar(sPrivilege),
TokenPriv.Privileges[0].Luid) then
begin
TokenPriv.PrivilegeCount := 1; // one privilege to set

case bEnabled of
True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
False: TokenPriv.Privileges[0].Attributes := 0;
end;

ReturnLength := 0; // replaces a var parameter
PrevTokenPriv := TokenPriv;

// enable or disable the privilege

AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),
PrevTokenPriv, ReturnLength);
end;
finally
CloseHandle(hToken);
end;
end;
// test the return value of AdjustTokenPrivileges.
Result := GetLastError = ERROR_SUCCESS;
// if not Result then
// raise Exception.Create(SysErrorMessage(GetLastError));
end;

وبراي استفاده از تابع فوق بايد از كد زير استفاده كنيم :


NTSetPrivilege('SeDebugPrivilege',True);

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

joker
شنبه 16 آبان 1388, 22:54 عصر
یک سوال برام پیش اومده ، میکروسافت که فرت با 4خط اکسس میده ، چرا کلا این محدودیت را گذاشته ؟ البته فکر کنم برداشت من کلا درست نباشه ، لطفا اطلاعات تکمیلی بدین :)

vcldeveloper
شنبه 16 آبان 1388, 23:32 عصر
یک سوال برام پیش اومده ، میکروسافت که فرت با 4خط اکسس میده ، چرا کلا این محدودیت را گذاشته ؟ البته فکر کنم برداشت من کلا درست نباشه
روی Processایی که بصورت Standard فراخوانی شده باشه، تاثیری نداره. Process باید دسترسی Admin داشته باشه. فرضا در ویندوز ویستا اگر Process مورد نظر Elevate نشه، مجوز Debug هم نمیگیره.

BORHAN TEC
شنبه 22 اسفند 1388, 10:29 صبح
فرضا در ویندوز ویستا اگر Process مورد نظر Elevate نشه، مجوز Debug هم نمیگیره.
ميشه بيشتر توضيح بدين. :متفکر:

vcldeveloper
شنبه 22 اسفند 1388, 11:25 صبح
ميشه بيشتر توضيح بدين.
یعنی مجوز Debug فقط به Processهایی داده میشه که دسترسی Administrator داشته باشند. Processهای عادی در ویندوز ویستا یا 7 نمی تونند این مجوز را داشته باشند.

BORHAN TEC
شنبه 22 اسفند 1388, 11:48 صبح
آيا با به دست آوردن مجوز SeDebugPrivilege دسترسي پوسس ما Administrator ميشه يا بايد كار ديگه اي هم انجام بديم. در واقع من قصد دارم كه برنامه اي كه مينويسم به تمام پروسه هاي ديگه به شكل كاملي دسترسي داشته باشه. دقيقاً مثل ضد ويروسها!!!
حتي اگه برنامه از داخل يك حساب كاربري محدود شده اجرا شده باشه (البته نميدونم ربطي داره يا نه) :قلب:

vcldeveloper
شنبه 22 اسفند 1388, 12:11 عصر
آيا با به دست آوردن مجوز SeDebugPrivilege دسترسي پوسس ما Administrator ميشه يا بايد كار ديگه اي هم انجام بديم. در واقع من قصد دارم كه برنامه اي كه مينويسم به تمام پروسه هاي ديگه به شكل كاملي دسترسي داشته باشه. دقيقاً مثل ضد ويروسها!!!
نه. برای دسترسی کامل به Processها باید مجوز SeDebug داشته باشید. برای اینکه اون مجوز را داشته باشید، باید Process شما دسترسی Admin داشته باشه. پس Processایی که مجوز SeDebug داره، دسترسی Admin هم داره، ولی هر Process ایی که دسترسی Admin داره، لزوما مجوز SeDebug نداره.