PDA

View Full Version : بدست اورد هندل كتابخانه ها در برنامه هاي در حال اجرا



ali_mohamadi8928
سه شنبه 08 مرداد 1387, 05:25 صبح
سلام دوستان .
يك سوال يكم حرفه اي دارم در رابطه با بدست اوردن هندل كتابخانه ها در برنامه هاي در حال اجرا .
براي تفهيم بيشتر اين مسئله كد زير رو ببينيد.


var
h: Integer;
begin
h := GetModuleHandle('kernel32.dll');

اين كد هندل kernel32.dll كه توسط برنامه ي ما بارگذاري شده رو بر ميگردونه ... من ميخوام مثلا هندل kernel32.dll اي كه توسط برنامه ي در حال اجراي 123.exe بارگذاري شده است رو بدست بيارم .... در صورتي كه كد فوق فقط ميتونه هندل kernel32.dll اي رو برگردونه كه توسط برنامه ي ما بارگذاري شده ... !!!

دوستان لطفا در اين زمينه كمك كنن ...

vcldeveloper
سه شنبه 08 مرداد 1387, 17:35 عصر
uses Windows, tlhelp32;

function GetProcessID(const ProcessName: string): DWord;
var
SnapshotHandle : THandle;
pe32 : TProcessEntry32;
CurrProcessName : string;
begin
Result := 0;
SnapshotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS,0);
if SnapshotHandle <= 0 then RaiseLastOSError;
try
pe32.dwSize := SizeOf(pe32);
if Process32First(SnapshotHandle,pe32) then
repeat
CurrProcessName := Trim(pe32.szExeFile);
if CompareText(CurrProcessName,ProcessName) = 0 then
begin
Result := pe32.th32ProcessID;
Break;
end;
pe32.dwSize := SizeOf(pe32);
until not Process32Next(SnapshotHandle,pe32);
finally
CloseHandle(SnapshotHandle);
end;
end;

function GetModuleHandle(ProcessID: DWord; const ModuleName: string): THandle;
var
SnapshotHandle : THandle;
ModuleEntry : TModuleEntry32;
CurrModuleName : string;
begin
Result := 0;
SnapShotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Process ID);
if SnapshotHandle <= 0 then RaiseLastOSError;
try
ModuleEntry.dwSize := SizeOf(ModuleEntry);
if Module32First(SnapshotHandle,ModuleEntry) then
repeat
CurrModuleName := Trim(ModuleEntry.szModule);
if CompareText(CurrModuleName,ModuleName) = 0 then
begin
Result := ModuleEntry.hModule;
Break;
end;
ModuleEntry.dwSize := SizeOf(ModuleEntry);
until not Module32Next(SnapshotHandle,ModuleEntry);
finally
CloseHandle(SnapShotHandle);
end;
end;


مثال:


var
ProcessName : string;
ProcessID : DWord;
Module : string;
ModuleHandle : THandle;
begin
Module := Edit2.Text;
ProcessName := Edit1.Text;
ProcessID := GetProcessID(ProcessName);
ModuleHandle := GetModuleHandle(ProcessID,Module);
ShowMessage(IntToStr(ModuleHandle));
end;

nasr
چهارشنبه 14 مرداد 1388, 07:53 صبح
سلام

این فانکشن برنامه های سیستمی را پیدا نمی کنه.

یعنی هر کدوم که توی TaskManager جلوشون system نوشته باشه را نمیشناسه

vcldeveloper
چهارشنبه 14 مرداد 1388, 11:26 صبح
یعنی هر کدوم که توی TaskManager جلوشون system نوشته باشه را نمیشناسه
اونی که جلوش نوشته شده System با Accountایی غیر از Accountایی که شما باهاش لاگین کردید، اجرا شده. شما در صورتی می تونید آنها را لیست کنید که کاربری که باهاش لاگین کردید دسترسی Admin داشته باشه.

nasr
چهارشنبه 14 مرداد 1388, 11:43 صبح
سلام

حالا آیا راهی هست که بشه اون ها را هم لیست کرد
ما که نمیخوایم Stop یا EndTask کنیم
فقط می خوایم لیست کنیم

ممنون

vcldeveloper
چهارشنبه 14 مرداد 1388, 12:48 عصر
حالا آیا راهی هست که بشه اون ها را هم لیست کرد
این سطح امنیتی است که ویندوز اعمال میکنه. برای لیست کردن آن پروسس ها باید مجوزهای لازم را داشته باشید، و بدون مجوز ویندوز به شما اجازه همچین کاری نمیده.

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