الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Just for CI > 1

مغلق
بدأه tmaaa في 11 يوليو 2002 · 3 رد · 805 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

قررت كتابه سلسله مواضيع تهتم بمواضيع مختلفه , راجيا ان تنال اعجاب قارئيها .

قبل البدء اود التنيبه الى ان اي اخطاء قد ترد في المواضيع ترجع الى تقصير مني فارجو المعذره مقدما .

اي راي , تعقيب , تعديل ,انتقاد ... مرحب به . :)

لاي استفسارات يمكن التواصل ايضا على kcahcn@sina.com .

لنبدأ :

[1]: Enumerate the loaded modules for the specific process

في هذا الموضوع وكما يتضح من عنوانه سيتم ذكر الطرق التي يمكن من خلالها سرد الـ modules المستدعاه (المستخدمه) من قبل process معينه .

الطريقة الاولى :

باستخدام الداله EnumerateLoadedModules الموجوده في Imagehlp.dll كما انها موجوده في في Dbghelp.dll .

الداله السابقه مصرح بها في ImageHlp.pas كالتالي :

{$EXTERNALSYM EnumerateLoadedModules}
function EnumerateLoadedModules(hProcess: THandle;
  EnumLoadedModulesCallback: TEnumLoadedModulesCallback;
  UserContext: Pointer): Bool; stdcall;
...
function EnumerateLoadedModules;        external ImagehlpLib name 'EnumerateLoadedModules';

هناك داله اخرى حلت بديلا لهذه الداله هي EnumerateLoadedModules64 موجوده في ملفي الـ dll السابقين .

Declaration :

function EnumerateLoadedModules64(
        hProcess : THANDLE ;
        lpEnumFunc : TEnumloadedModulesCallback64
        lParam : Pointer
        ): BOOL; stdcall;
        external'Dbghelp.dll'name'EnumerateLoadedModules64';

لمزيد من المعلومات عن الداله و الـ Parameters التابعه لها يمكن الاطلاع على http://msdn.microsoft.com/library/default....bghelp_7m7o.asp

بالنسبه للنوع TEnumloadedModulesCallback64 فهو معرف كالاتي :

type
  PENUMLOADED_MODULES_CALLBACK64 = function(ModuleName: LPSTR; ModuleBase:Int64;
    ModuleSize: ULONG; UserContext: Pointer): Bool; stdcall;
  TEnumloadedModulesCallback64 = PENUMLOADED_MODULES_CALLBACK64;

لمعلومات اكثر يمكن الاطلاع على http://msdn.microsoft.com/library/default....bghelp_33qs.asp

بعد هذه المقدمه ناتي لذكر مثال على ما ذكر :

ِAdd Button and ListBox to a Form

بعد تعريف TForm Class اضف الكود الاتي :

type
  PENUMLOADED_MODULES_CALLBACK64 = function(ModuleName : LPSTR; ModuleBase : Int64;
    ModuleSize: ULONG; UserContext : Pointer): Bool; stdcall;
  TEnumloadedModulesCallback64 = PENUMLOADED_MODULES_CALLBACK64;

function EnumerateLoadedModules64(
        hProcess :THANDLE ;
        lpEnumFunc : TEnumloadedModulesCallback64;
        lParam : Pointer
        ): BOOL; stdcall;
        external'Dbghelp.dll'name'EnumerateLoadedModules64';

هذا هو كود استدعاء الداله السابقه :

function  EnumerateLoadedModulesProc64(
                ModuleName : Pchar;
                ModuleBase : int64;
                ModuleSize : ULONG ;
                UserContext : pointer
                ):BOOL; stdcall;
var
PStrList : ^TStringList;
begin
PStrList:=UserContext;
PStrList.Add(IntToHex(ModuleBase,8)+' '+inttostr(modulesize)+'  '+ModuleName);
result:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hprocess:THandle;
StrList:TStringList;
begin
StrList:=TStringList.Create;
hprocess:=GetCurrentProcessId(); // The current process
EnumerateLoadedModules64(hprocess,@EnumerateLoadedModulesProc64,@StrList);
ListBox1.Items.Add('Base          Size        Name');
ListBox1.Items.AddStrings(StrList);
end;

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#2

الطريقة الثانيه :

Using Native API Function RtlQueryProcessDebugInformation

هذه الطريقه رائعه وأفضلها على الطريقه السابقه .

بالنسبه للدوال التي سنستخدمها هي RtlCreateQueryDebugBuffer , RtlQueryProcessDebugInformation ,RtlDestroyQueryDebugBuffer.

شو هالخرابيط ؟؟؟

هذه ثلاث خرابيط - اقصد دوال - Native API غير مصرح بها موجوده في ntdll.dll .

لمعلومات اكثر عن الدوال السابقه يرجى الرجوع الى كتاب Windows Nt/2000 Native API لــ Gary Nebbet .

http://bingle.sitenova.net/teach/NTNativeAPI.cab

وهذا مثال على هذه الطريقه :

Add Button and ListView to a Form

قبل تعريف TForm اضف ما يلي:

// نوع المعلومات المراد الحصول عليها
const
PDI_MODULES =$1; // The loaded modules of the process - we want this type
PDI_BACKTRACE=$2; // The heap stack back traces
PDI_HEAPS=$4; // The heaps of the process
PDI_HEAP_TAGS=$8; // The heaps tags
PDI_HEAP_BLOCKS=$10; // The heap blocks
PDI_LOCKS=$20; // The locks created by the process

التصريح بالتراكيب التي تمثل المعلومات المراد الحصول عليها

type
PDebug_Buffer=^TDebug_Buffer;
TDebug_Buffer=packed record
        sectionHandle : THandle;
        SectionBase : Pointer;
        RemoteSectionBase : Pointer;
        SectionBaseDelta : ULONG;
        EventPairHandle : THandle;
        Unknown1 : ULONG;
        Unknown2 : ULONG;
        RemoteThreadHandle : THandle;
        InfoClassMask : ULONG;
        SizeOfInfo : ULONG;
        AllocatedSize : ULONG;
        SectionSize : ULONG;
        ModuleInformation : Pointer;
        BackTraceInformation : Pointer;
        HeapInformation : Pointer;
        LockInformation : Pointer;
        Reserved:array [0..7]of Pointer;
end;
PDebug_Module_Information=^TDebug_Module_Information;
TDebug_Module_Information=packed record
        Reserved:array[0..1]of ULONG;
        Base : ULONG;
        Size : ULONG;
        Flags : ULONG;
//I exchange the place of Unknown and index 
//I'm not sure of that .
//If anyone knows anything about it please tell me 
        Unknown : WORD;
        Index : WORD;
        LoadCount : WORD;
        ModuleNameOffset : WORD;
        ImageName:array [0..255] of Char;
end;

لمعلومات عن ما سبق يرجى الاطلاع على الكتاب السابق .

التصريح بالدوال المذكوره سابقا :

function RtlCreateQueryDebugBuffer(
        Size : ULONG;
        Eventpair : BOOL
        ) :PDebug_Buffer;stdcal l;
        external 'ntdll.dll' name 'RtlCreateQueryDebugBuffer';
function RtlQueryProcessDebugInformation(
        ProcessId : ULONG;
        DebugInfoClassMask : ULONG;
        DebugBuffer : PDebug_Buffer
        ) : DWORD;stdcall;
        external 'ntdll.dll' name 'RtlQueryProcessDebugInformation';
function RtlDestroyQueryDebugBuffer(
        DebugBuffer : PDebug_Buffer
        ) : DWORD;stdcall;
        external 'ntdll.dll' name 'RtlDestroyQueryDebugBuffer';

الكود الخاص بـ OnCreate Event يصبح كالاتي :

بامكانك الاستغناء عن الكود الاتي و عمل ما يقوم به اثناء Design Time , حسب رغبتك .

// you can do this at the design time
procedure TForm1.FormCreate(Sender: TObject);
var
NewColumn : TListColumn;
begin
with Form1 do
begin
Left:=10;
Top:=10;
Width:=Screen.Width-50 ;
Height:=Screen.Height -50;
end;

with Button2 do
begin
Left:=Form1.Width-90;
Top:=25;
Width:=75;
Height:=20;
end;

with ListView1 do
begin
ViewStyle := vsReport;
Align:=AlLeft;
Width:=form1.width-100;
NewColumn:= Columns.Add;
NewColumn.Caption :='Base';
NewColumn:=  Columns.Add;
NewColumn.Caption :='Size';
NewColumn:= Columns.Add;
NewColumn.Caption :='Flags';
NewColumn:= Columns.Add;
NewColumn.Caption :='Index';
NewColumn:= Columns.Add;
NewColumn.Caption :='LoadCount';
NewColumn:= Columns.Add;
NewColumn.Caption :='Module';
NewColumn:= Columns.Add;
NewColumn.Caption :='FullPath';
end;
end;

في المكان المخصص لـ OnClick Event للـ Button اضف الكود الاتي :

procedure TForm1.Button2Click(Sender: TObject);
var
PDBuf : PDebug_Buffer;
MInfo : PDebug_Module_Information;
module, i: integer;
status : DWORD;
ListItem : TListItem;
begin

PDBuf:=RtlCreateQueryDebugBuffer(0,false);
status:=RtlQueryProcessDebugInformation(getcurrentprocessId(),PDI_MODULES,PDBuf);
if status<>0 then
exit;
module:=integer(PDBuf.ModuleInformation)+4;
i:=integer(PDBuf.ModuleInformation^);
while i>1 do
begin
module:=module+sizeof(TDebug_Module_Information);
MInfo:=ptr(module);
with ListView1 do
begin
ListItem := Items.Add;
ListItem.Caption:='0x'+IntToHex(MInfo.Base,8);
ListItem.SubItems.Add(IntToStr(MInfo.Size));
ListItem.SubItems.Add('0x'+IntToHex(MInfo.Flags,8));
ListItem.SubItems.Add(IntToStr(MInfo.Index));
ListItem.SubItems.Add(IntToStr(MInfo.LoadCount));
ListItem.SubItems.Add(Copy(MInfo.ImageName,MInfo.ModuleNameOffset+1,
                      length(MInfo.ImageName)-MInfo.ModuleNameOffset));
ListItem.SubItems.Add(MInfo.ImageName);
end;
dec(i);
end;
RtlDestroyQueryDebugBuffer(PDBuf);
end;

هناك طريقة ثالثه ما زلت في مرحله البحث فيها , ساقوم بنشرها حال التوصل اليها ان شاء الله .

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#3

فكرة رائع اخي العزيز ارجوا المواصلة وانا ان شاء الله من المتتبعين .

#4

السلام عليكم

مشكور اخ زكيري

بالنسبه للطريقه الثالثه - كما ذكرت في منتدى اخر - تعتمد على استعمال ReadProcessMemory وقراءه معلومات الـ Process من الذاكره . حيث سنقوم بقراءه Process Environment Block PEB الخاص بالـ Process . ما زلت في مرحله البحث في الموضوع و سأقوم بنشر الطريقة حال الانتهاء منها ( دايخ بين ارقام واسماء ملفات dll طلعت بعد قراءه الذاكره :D ) .

(f)

CIONO1

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

هذا الموضوع مغلق.

مواضيع مشابهة